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