1 // num_token.hpp
2 // Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_LEXER_NUM_TOKEN_HPP
7 #define BOOST_LEXER_NUM_TOKEN_HPP
8 
9 #include <boost/config.hpp>
10 #include "../../consts.hpp" // null_token
11 #include "../../size_t.hpp"
12 #include <boost/detail/workaround.hpp>
13 
14 namespace boost
15 {
16 namespace lexer
17 {
18 namespace detail
19 {
20 template<typename CharT>
21 struct basic_num_token
22 {
23     enum type {BEGIN, REGEX, OREXP, SEQUENCE, SUB, EXPRESSION, REPEAT,
24         DUP, OR, CHARSET, MACRO, OPENPAREN, CLOSEPAREN, OPT, AOPT,
25         ZEROORMORE, AZEROORMORE, ONEORMORE, AONEORMORE, REPEATN, AREPEATN,
26         END};
27 
28     type _type;
29     std::size_t _id;
30     std::size_t _min;
31     bool _comma;
32     std::size_t _max;
33     CharT _macro[max_macro_len + 1];
34     static const char _precedence_table[END + 1][END + 1];
35     static const char *_precedence_strings[END + 1];
36 
basic_num_tokenboost::lexer::detail::basic_num_token37     basic_num_token (const type type_ = BEGIN,
38         const std::size_t id_ = null_token) :
39         _type (type_),
40         _id (id_),
41         _min (0),
42         _comma (false),
43         _max (0)
44     {
45         *_macro = 0;
46     }
47 
operator =boost::lexer::detail::basic_num_token48     basic_num_token &operator = (const basic_num_token &rhs_)
49     {
50         _type = rhs_._type;
51         _id = rhs_._id;
52         _min = rhs_._min;
53         _comma = rhs_._comma;
54         _max = rhs_._max;
55 
56         if (_type == MACRO)
57         {
58             const CharT *read_ = rhs_._macro;
59             CharT *write_ = _macro;
60 
61             while (*read_)
62             {
63                 *write_++ = *read_++;
64             }
65 
66             *write_ = 0;
67         }
68 
69         return *this;
70     }
71 
setboost::lexer::detail::basic_num_token72     void set (const type type_)
73     {
74         _type = type_;
75         _id = null_token;
76     }
77 
setboost::lexer::detail::basic_num_token78     void set (const type type_, const std::size_t id_)
79     {
80         _type = type_;
81         _id = id_;
82     }
83 
min_maxboost::lexer::detail::basic_num_token84     void min_max (const std::size_t min_, const bool comma_,
85         const std::size_t max_)
86     {
87         _min = min_;
88         _comma = comma_;
89         _max = max_;
90     }
91 
precedenceboost::lexer::detail::basic_num_token92     char precedence (const type type_) const
93     {
94         return _precedence_table[_type][type_];
95     }
96 
precedence_stringboost::lexer::detail::basic_num_token97     const char *precedence_string () const
98     {
99         return _precedence_strings[_type];
100     }
101 };
102 
103 template<typename CharT>
104 const char basic_num_token<CharT>::_precedence_table[END + 1][END + 1] = {
105 //        BEG, REG, ORE, SEQ, SUB, EXP, RPT, DUP,  | , CHR, MCR,  ( ,  ) ,  ? , ?? ,  * , *? ,  + , +?, {n}?, {n}, END
106 /*BEGIN*/{' ', '<', '<', '<', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
107 /*REGEX*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
108 /*OREXP*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', '>', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
109 /* SEQ */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
110 /* SUB */{' ', ' ', ' ', ' ', ' ', '=', '<', ' ', '>', '<', '<', '<', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
111 /*EXPRE*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
112 /* RPT */{' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', '>', '>', '>', '>', '>', '<', '<', '<', '<', '<', '<', '<', '<', '>'},
113 /*DUPLI*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
114 /*  |  */{' ', ' ', ' ', '=', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
115 /*CHARA*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'},
116 /*MACRO*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'},
117 /*  (  */{' ', '=', '<', '<', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
118 /*  )  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'},
119 /*  ?  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
120 /* ??  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
121 /*  *  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
122 /* *?  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
123 /*  +  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
124 /* +?  */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
125 /*{n,m}*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
126 /*{nm}?*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'},
127 /* END */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}
128 };
129 
130 template<typename CharT>
131 const char *basic_num_token<CharT>::_precedence_strings[END + 1] =
132 #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(910))
133 {{"BEGIN"}, {"REGEX"}, {"OREXP"}, {"SEQUENCE"}, {"SUB"}, {"EXPRESSION"},
134     {"REPEAT"}, {"DUPLICATE"}, {"|"}, {"CHARSET"}, {"MACRO"},
135     {"("}, {")"}, {"?"}, {"??"}, {"*"}, {"*?"}, {"+"}, {"+?"}, {"{n[,[m]]}"},
136     {"{n[,[m]]}?"}, {"END"}};
137 #else
138 {"BEGIN", "REGEX", "OREXP", "SEQUENCE", "SUB", "EXPRESSION", "REPEAT",
139     "DUPLICATE", "|", "CHARSET", "MACRO", "(", ")", "?", "??", "*", "*?",
140     "+", "+?", "{n[,[m]]}", "{n[,[m]]}?", "END"};
141 #endif
142 }
143 }
144 }
145 
146 #endif
147