Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r66776 - in trunk/boost/spirit/home: lex lex/lexer/lexertl lex/qi support
From: hartmut.kaiser_at_[hidden]
Date: 2010-11-26 13:32:37


Author: hkaiser
Date: 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
New Revision: 66776
URL: http://svn.boost.org/trac/boost/changeset/66776

Log:
Spiriti: adding qi::tokenid() primitive
Added:
   trunk/boost/spirit/home/lex/qi/plain_tokenid.hpp (contents, props changed)
Text files modified:
   trunk/boost/spirit/home/lex/lexer/lexertl/lexer.hpp | 2 +-
   trunk/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp | 2 +-
   trunk/boost/spirit/home/lex/lexer/lexertl/token.hpp | 6 +++---
   trunk/boost/spirit/home/lex/qi.hpp | 1 +
   trunk/boost/spirit/home/support/common_terminals.hpp | 1 +
   5 files changed, 7 insertions(+), 5 deletions(-)

Modified: trunk/boost/spirit/home/lex/lexer/lexertl/lexer.hpp
==============================================================================
--- trunk/boost/spirit/home/lex/lexer/lexertl/lexer.hpp (original)
+++ trunk/boost/spirit/home/lex/lexer/lexertl/lexer.hpp 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
@@ -147,7 +147,7 @@
     class lexer
     {
     private:
- struct dummy { void true_() {}; };
+ struct dummy { void true_() {} };
         typedef void (dummy::*safe_bool)();
 
         static std::size_t const all_states_id = static_cast<std::size_t>(-2);

Modified: trunk/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp
==============================================================================
--- trunk/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp (original)
+++ trunk/boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
@@ -112,7 +112,7 @@
     class static_lexer
     {
     private:
- struct dummy { void true_() {}; };
+ struct dummy { void true_() {} };
         typedef void (dummy::*safe_bool)();
 
     public:

Modified: trunk/boost/spirit/home/lex/lexer/lexertl/token.hpp
==============================================================================
--- trunk/boost/spirit/home/lex/lexer/lexertl/token.hpp (original)
+++ trunk/boost/spirit/home/lex/lexer/lexertl/token.hpp 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
@@ -175,7 +175,7 @@
 // works only starting MSVC V8
 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
     private:
- struct dummy { void true_() {}; };
+ struct dummy { void true_() {} };
         typedef void (dummy::*safe_bool)();
 
     public:
@@ -554,9 +554,9 @@
         template <typename Out>
         static void print(Out& out, token_type const& val)
         {
- out << '<';
+ out << '[';
             spirit::traits::print_token(out, val.value());
- out << '>';
+ out << ']';
         }
     };
 

Modified: trunk/boost/spirit/home/lex/qi.hpp
==============================================================================
--- trunk/boost/spirit/home/lex/qi.hpp (original)
+++ trunk/boost/spirit/home/lex/qi.hpp 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
@@ -13,5 +13,6 @@
 #include <boost/spirit/home/lex/qi/state_switcher.hpp>
 #include <boost/spirit/home/lex/qi/in_state.hpp>
 #include <boost/spirit/home/lex/qi/plain_token.hpp>
+#include <boost/spirit/home/lex/qi/plain_tokenid.hpp>
 
 #endif

Added: trunk/boost/spirit/home/lex/qi/plain_tokenid.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/spirit/home/lex/qi/plain_tokenid.hpp 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
@@ -0,0 +1,121 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_SPIRIT_LEX_PLAIN_TOKENID_NOV_26_2010_0944AM)
+#define BOOST_SPIRIT_LEX_PLAIN_TOKENID_NOV_26_2010_0944AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/spirit/home/support/info.hpp>
+#include <boost/spirit/home/qi/detail/attributes.hpp>
+#include <boost/spirit/home/support/common_terminals.hpp>
+#include <boost/spirit/home/qi/skip_over.hpp>
+#include <boost/spirit/home/qi/domain.hpp>
+#include <boost/spirit/home/qi/parser.hpp>
+#include <boost/spirit/home/qi/meta_compiler.hpp>
+#include <boost/spirit/home/qi/detail/assign_to.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/at.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_enum.hpp>
+
+namespace boost { namespace spirit
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // Enablers
+ ///////////////////////////////////////////////////////////////////////////
+
+ // enables tokenid(id)
+ template <typename A0>
+ struct use_terminal<qi::domain
+ , terminal_ex<tag::tokenid, fusion::vector1<A0> >
+ > : mpl::or_<is_integral<A0>, is_enum<A0> > {};
+
+ // enables *lazy* tokenid(id)
+ template <>
+ struct use_lazy_terminal<
+ qi::domain, tag::tokenid, 1
+ > : mpl::true_ {};
+}}
+
+namespace boost { namespace spirit { namespace qi
+{
+ using spirit::tokenid;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // The plain_tokenid represents a simple token defined by the lexer inside
+ // a Qi grammar. The difference to plain_token is that it exposes the
+ // matched token id instead of the iterator_range of the matched input.
+ template <typename TokenId>
+ struct plain_tokenid
+ : primitive_parser<plain_tokenid<TokenId> >
+ {
+ template <typename Context, typename Iterator>
+ struct attribute
+ {
+ typedef TokenId type;
+ };
+
+ plain_tokenid(TokenId const& id)
+ : id(id) {}
+
+ template <typename Iterator, typename Context
+ , typename Skipper, typename Attribute>
+ bool parse(Iterator& first, Iterator const& last
+ , Context& /*context*/, Skipper const& skipper
+ , Attribute& attr) const
+ {
+ qi::skip_over(first, last, skipper); // always do a pre-skip
+
+ if (first != last) {
+ // simply match the token id with the id this component has
+ // been initialized with
+
+ typedef typename
+ boost::detail::iterator_traits<Iterator>::value_type
+ token_type;
+ typedef typename token_type::id_type id_type;
+
+ token_type const& t = *first;
+ if (id_type(id) == t.id()) {
+ spirit::traits::assign_to(id, attr);
+ ++first;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename Context>
+ info what(Context& /*context*/) const
+ {
+ return info("tokenid");
+ }
+
+ TokenId id;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Parser generators: make_xxx function (objects)
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename Modifiers, typename TokenId>
+ struct make_primitive<terminal_ex<tag::tokenid, fusion::vector1<TokenId> >
+ , Modifiers>
+ {
+ typedef plain_tokenid<TokenId> result_type;
+
+ template <typename Terminal>
+ result_type operator()(Terminal const& term, unused_type) const
+ {
+ return result_type(fusion::at_c<0>(term.args));
+ }
+ };
+}}}
+
+#endif

Modified: trunk/boost/spirit/home/support/common_terminals.hpp
==============================================================================
--- trunk/boost/spirit/home/support/common_terminals.hpp (original)
+++ trunk/boost/spirit/home/support/common_terminals.hpp 2010-11-26 13:32:35 EST (Fri, 26 Nov 2010)
@@ -128,6 +128,7 @@
         ( set_state )
         ( in_state )
         ( token )
+ ( tokenid )
         ( attr )
         ( columns )
         ( auto_ )


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk