lexer_def.hpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Hartmut Kaiser
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. =============================================================================*/
  6. #include "lexer.hpp"
  7. namespace client { namespace lexer
  8. {
  9. template <typename BaseIterator>
  10. conjure_tokens<BaseIterator>::conjure_tokens()
  11. : identifier("[a-zA-Z_][a-zA-Z_0-9]*", token_ids::identifier)
  12. , lit_uint("[0-9]+", token_ids::lit_uint)
  13. , true_or_false("true|false", token_ids::true_or_false)
  14. {
  15. lex::_pass_type _pass;
  16. this->self = lit_uint | true_or_false;
  17. add_keyword("void");
  18. add_keyword("int");
  19. add_keyword("if");
  20. add_keyword("else");
  21. add_keyword("while");
  22. add_keyword("return");
  23. this->self.add
  24. ("\\|\\|", token_ids::logical_or)
  25. ("&&", token_ids::logical_and)
  26. ("==", token_ids::equal)
  27. ("!=", token_ids::not_equal)
  28. ("<", token_ids::less)
  29. ("<=", token_ids::less_equal)
  30. (">", token_ids::greater)
  31. (">=", token_ids::greater_equal)
  32. ("\\+", token_ids::plus)
  33. ("\\-", token_ids::minus)
  34. ("\\*", token_ids::times)
  35. ("\\/", token_ids::divide)
  36. ("!", token_ids::not_)
  37. ;
  38. this->self += lex::char_('(') | ')' | '{' | '}' | ',' | '=' | ';';
  39. this->self +=
  40. identifier
  41. | lex::string("\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/", token_ids::comment)
  42. [
  43. lex::_pass = lex::pass_flags::pass_ignore
  44. ]
  45. | lex::string("[ \t\n\r]+", token_ids::whitespace)
  46. [
  47. lex::_pass = lex::pass_flags::pass_ignore
  48. ]
  49. ;
  50. }
  51. template <typename BaseIterator>
  52. bool conjure_tokens<BaseIterator>::add_keyword(std::string const& keyword)
  53. {
  54. // add the token to the lexer
  55. token_ids::type id = token_ids::type(this->get_next_id());
  56. this->self.add(keyword, id);
  57. // store the mapping for later retrieval
  58. std::pair<typename keyword_map_type::iterator, bool> p =
  59. keywords_.insert(typename keyword_map_type::value_type(keyword, id));
  60. return p.second;
  61. }
  62. }}