// num_token.hpp | |
// Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/) | |
// | |
// Distributed under the Boost Software License, Version 1.0. (See accompanying | |
// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef BOOST_LEXER_NUM_TOKEN_HPP | |
#define BOOST_LEXER_NUM_TOKEN_HPP | |
#include <boost/config.hpp> | |
#include "../../consts.hpp" // null_token | |
#include "../../size_t.hpp" | |
#include <boost/detail/workaround.hpp> | |
namespace boost | |
{ | |
namespace lexer | |
{ | |
namespace detail | |
{ | |
template<typename CharT> | |
struct basic_num_token | |
{ | |
enum type {BEGIN, REGEX, OREXP, SEQUENCE, SUB, EXPRESSION, REPEAT, | |
DUP, OR, CHARSET, MACRO, OPENPAREN, CLOSEPAREN, OPT, AOPT, | |
ZEROORMORE, AZEROORMORE, ONEORMORE, AONEORMORE, REPEATN, AREPEATN, | |
END}; | |
type _type; | |
std::size_t _id; | |
std::size_t _min; | |
bool _comma; | |
std::size_t _max; | |
CharT _macro[max_macro_len + 1]; | |
static const char _precedence_table[END + 1][END + 1]; | |
static const char *_precedence_strings[END + 1]; | |
basic_num_token (const type type_ = BEGIN, | |
const std::size_t id_ = null_token) : | |
_type (type_), | |
_id (id_), | |
_min (0), | |
_comma (false), | |
_max (0) | |
{ | |
*_macro = 0; | |
} | |
basic_num_token &operator = (const basic_num_token &rhs_) | |
{ | |
_type = rhs_._type; | |
_id = rhs_._id; | |
_min = rhs_._min; | |
_comma = rhs_._comma; | |
_max = rhs_._max; | |
if (_type == MACRO) | |
{ | |
const CharT *read_ = rhs_._macro; | |
CharT *write_ = _macro; | |
while (*read_) | |
{ | |
*write_++ = *read_++; | |
} | |
*write_ = 0; | |
} | |
return *this; | |
} | |
void set (const type type_) | |
{ | |
_type = type_; | |
_id = null_token; | |
} | |
void set (const type type_, const std::size_t id_) | |
{ | |
_type = type_; | |
_id = id_; | |
} | |
void min_max (const std::size_t min_, const bool comma_, | |
const std::size_t max_) | |
{ | |
_min = min_; | |
_comma = comma_; | |
_max = max_; | |
} | |
char precedence (const type type_) const | |
{ | |
return _precedence_table[_type][type_]; | |
} | |
const char *precedence_string () const | |
{ | |
return _precedence_strings[_type]; | |
} | |
}; | |
template<typename CharT> | |
const char basic_num_token<CharT>::_precedence_table[END + 1][END + 1] = { | |
// BEG, REG, ORE, SEQ, SUB, EXP, RPT, DUP, | , CHR, MCR, ( , ) , ? , ?? , * , *? , + , +?, {n}?, {n}, END | |
/*BEGIN*/{' ', '<', '<', '<', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/*REGEX*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/*OREXP*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', '>', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* SEQ */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* SUB */{' ', ' ', ' ', ' ', ' ', '=', '<', ' ', '>', '<', '<', '<', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/*EXPRE*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* RPT */{' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', '>', '>', '>', '>', '>', '<', '<', '<', '<', '<', '<', '<', '<', '>'}, | |
/*DUPLI*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* | */{' ', ' ', ' ', '=', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, | |
/*CHARA*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'}, | |
/*MACRO*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'}, | |
/* ( */{' ', '=', '<', '<', '<', '<', '<', ' ', ' ', '<', '<', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}, | |
/* ) */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>', '>'}, | |
/* ? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* ?? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* * */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* *? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* + */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* +? */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/*{n,m}*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', '<', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/*{nm}?*/{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>', '>', '>', '>', '>', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '>'}, | |
/* END */{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '} | |
}; | |
template<typename CharT> | |
const char *basic_num_token<CharT>::_precedence_strings[END + 1] = | |
#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(910)) | |
{{"BEGIN"}, {"REGEX"}, {"OREXP"}, {"SEQUENCE"}, {"SUB"}, {"EXPRESSION"}, | |
{"REPEAT"}, {"DUPLICATE"}, {"|"}, {"CHARSET"}, {"MACRO"}, | |
{"("}, {")"}, {"?"}, {"??"}, {"*"}, {"*?"}, {"+"}, {"+?"}, {"{n[,[m]]}"}, | |
{"{n[,[m]]}?"}, {"END"}}; | |
#else | |
{"BEGIN", "REGEX", "OREXP", "SEQUENCE", "SUB", "EXPRESSION", "REPEAT", | |
"DUPLICATE", "|", "CHARSET", "MACRO", "(", ")", "?", "??", "*", "*?", | |
"+", "+?", "{n[,[m]]}", "{n[,[m]]}?", "END"}; | |
#endif | |
} | |
} | |
} | |
#endif |