]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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) | |
f67539c2 TL |
6 | #ifndef BOOST_SPIRIT_SUPPORT_DETAIL_LEXER_PARSER_TOKENISER_NUM_TOKEN_HPP |
7 | #define BOOST_SPIRIT_SUPPORT_DETAIL_LEXER_PARSER_TOKENISER_NUM_TOKEN_HPP | |
7c673cae FG |
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 | ||
37 | 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 | ||
48 | 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 | ||
72 | void set (const type type_) | |
73 | { | |
74 | _type = type_; | |
75 | _id = null_token; | |
76 | } | |
77 | ||
78 | void set (const type type_, const std::size_t id_) | |
79 | { | |
80 | _type = type_; | |
81 | _id = id_; | |
82 | } | |
83 | ||
84 | 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 | ||
92 | char precedence (const type type_) const | |
93 | { | |
94 | return _precedence_table[_type][type_]; | |
95 | } | |
96 | ||
97 | 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 |