spirit/example/qi/compiler_tutorial/conjure2/lexer_def.hpp

75 lines
2.5 KiB
C++

/*=============================================================================
Copyright (c) 2001-2011 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)
=============================================================================*/
#include "lexer.hpp"
namespace client { namespace lexer
{
template <typename BaseIterator>
conjure_tokens<BaseIterator>::conjure_tokens()
: identifier("[a-zA-Z_][a-zA-Z_0-9]*", token_ids::identifier)
, lit_uint("[0-9]+", token_ids::lit_uint)
, true_or_false("true|false", token_ids::true_or_false)
{
lex::_pass_type _pass;
this->self = lit_uint | true_or_false;
add_keyword("void");
add_keyword("int");
add_keyword("if");
add_keyword("else");
add_keyword("while");
add_keyword("return");
this->self.add
("\\|\\|", token_ids::logical_or)
("&&", token_ids::logical_and)
("==", token_ids::equal)
("!=", token_ids::not_equal)
("<", token_ids::less)
("<=", token_ids::less_equal)
(">", token_ids::greater)
(">=", token_ids::greater_equal)
("\\+", token_ids::plus)
("\\-", token_ids::minus)
("\\*", token_ids::times)
("\\/", token_ids::divide)
("!", token_ids::not_)
;
this->self += lex::char_('(') | ')' | '{' | '}' | ',' | '=' | ';';
this->self +=
identifier
| lex::string("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", token_ids::comment)
[
lex::_pass = lex::pass_flags::pass_ignore
]
| lex::string("[ \t\n\r]+", token_ids::whitespace)
[
lex::_pass = lex::pass_flags::pass_ignore
]
;
}
template <typename BaseIterator>
bool conjure_tokens<BaseIterator>::add_keyword(std::string const& keyword)
{
// add the token to the lexer
token_ids::type id = token_ids::type(this->get_next_id());
this->self.add(keyword, id);
// store the mapping for later retrieval
std::pair<typename keyword_map_type::iterator, bool> p =
keywords_.insert(typename keyword_map_type::value_type(keyword, id));
return p.second;
}
}}