[29] | 1 | /*============================================================================= |
---|
| 2 | Copyright (c) 2004 Chris Hoeppler |
---|
| 3 | http://spirit.sourceforge.net/ |
---|
| 4 | |
---|
| 5 | Use, modification and distribution is subject to the Boost Software |
---|
| 6 | License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
---|
| 7 | http://www.boost.org/LICENSE_1_0.txt) |
---|
| 8 | =============================================================================*/ |
---|
| 9 | |
---|
| 10 | // This test verifies, that reapeat_p et.al. work correctly while using AST's |
---|
| 11 | |
---|
| 12 | # include <map> |
---|
| 13 | # include <boost/detail/lightweight_test.hpp> |
---|
| 14 | # include <iostream> |
---|
| 15 | # include <string> |
---|
| 16 | |
---|
| 17 | # include <boost/spirit/core.hpp> |
---|
| 18 | # include <boost/spirit/utility/loops.hpp> |
---|
| 19 | # include <boost/spirit/tree/ast.hpp> |
---|
| 20 | # include <boost/spirit/tree/tree_to_xml.hpp> |
---|
| 21 | |
---|
| 22 | using namespace boost::spirit; |
---|
| 23 | |
---|
| 24 | static const int numID = 1; |
---|
| 25 | static const int funcID = 2; |
---|
| 26 | static const int expressionID = 3; |
---|
| 27 | |
---|
| 28 | struct grammar_fail : public grammar<grammar_fail> |
---|
| 29 | { |
---|
| 30 | template <typename ScannerT> |
---|
| 31 | struct definition |
---|
| 32 | { |
---|
| 33 | definition(grammar_fail const& /*self */) |
---|
| 34 | { |
---|
| 35 | num = leaf_node_d[real_p]; |
---|
| 36 | func = root_node_d[ch_p('+') | '-'] |
---|
| 37 | >> repeat_p(2)[expression]; |
---|
| 38 | expression = func | num; |
---|
| 39 | } |
---|
| 40 | rule<ScannerT, parser_context<>, parser_tag<numID> > num; |
---|
| 41 | rule<ScannerT, parser_context<>, parser_tag<funcID> > func; |
---|
| 42 | typedef rule<ScannerT, parser_context<>, parser_tag<expressionID> > expr_t; |
---|
| 43 | expr_t expression; |
---|
| 44 | expr_t const& start() const { return expression; } |
---|
| 45 | }; |
---|
| 46 | }; |
---|
| 47 | struct grammar_success : public grammar<grammar_success> |
---|
| 48 | { |
---|
| 49 | template <typename ScannerT> |
---|
| 50 | struct definition |
---|
| 51 | { |
---|
| 52 | definition(grammar_success const& /*self */) |
---|
| 53 | { |
---|
| 54 | num = leaf_node_d[real_p]; |
---|
| 55 | func = root_node_d[ch_p('+') | '-'] |
---|
| 56 | >> expression >> expression; // line differing from grammar_fail |
---|
| 57 | expression = func | num; |
---|
| 58 | } |
---|
| 59 | rule<ScannerT, parser_context<>, parser_tag<numID> > num; |
---|
| 60 | rule<ScannerT, parser_context<>, parser_tag<funcID> > func; |
---|
| 61 | typedef rule<ScannerT, parser_context<>, parser_tag<expressionID> > expr_t; |
---|
| 62 | expr_t expression; |
---|
| 63 | expr_t const& start() const { return expression; } |
---|
| 64 | }; |
---|
| 65 | }; |
---|
| 66 | |
---|
| 67 | int main() { |
---|
| 68 | |
---|
| 69 | std::map<parser_id, std::string> rule_names; |
---|
| 70 | rule_names[expressionID] = "expression"; |
---|
| 71 | rule_names[funcID] = "func"; |
---|
| 72 | rule_names[numID] = "num"; |
---|
| 73 | |
---|
| 74 | std::string test("+ 1 - 2 3"); |
---|
| 75 | |
---|
| 76 | // case 1 |
---|
| 77 | grammar_fail g_fail; |
---|
| 78 | tree_parse_info<> info1 = ast_parse(test.c_str(), g_fail, space_p); |
---|
| 79 | BOOST_TEST(info1.full); |
---|
| 80 | |
---|
| 81 | //std::cout << "...Case 1: Using repeat_p\n"; |
---|
| 82 | //tree_to_xml(std::cerr, info1.trees, test, rule_names); |
---|
| 83 | |
---|
| 84 | // case 2 |
---|
| 85 | grammar_success g_success; |
---|
| 86 | tree_parse_info<> info2 = ast_parse(test.c_str(), g_success, space_p); |
---|
| 87 | BOOST_TEST(info2.full); |
---|
| 88 | |
---|
| 89 | //std::cout << "...Case 2: No repeat_p\n"; |
---|
| 90 | //tree_to_xml(std::cerr, info2.trees, test, rule_names); |
---|
| 91 | // could be used for test case instead of printing the xml stuff: |
---|
| 92 | BOOST_TEST(info2.trees.begin()->children.size() == 2); |
---|
| 93 | BOOST_TEST(info1.trees.begin()->children.size() == 2); |
---|
| 94 | return boost::report_errors(); |
---|
| 95 | } |
---|