1 | /*============================================================================= |
2 | Copyright (c) 2001-2015 Joel de Guzman |
3 | |
4 | Distributed under the Boost Software License, Version 1.0. (See accompanying |
5 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
6 | =============================================================================*/ |
7 | #include <boost/spirit/home/x3.hpp> |
8 | |
9 | #include <iostream> |
10 | #include "test.hpp" |
11 | |
12 | // Custom string type with a C-style string conversion. |
13 | struct custom_string_c |
14 | { |
15 | custom_string_c(char c) { str[0] = c; str[1] = '\0'; } |
16 | |
17 | operator char*() { return str; } |
18 | operator char const*() const { return str; } |
19 | |
20 | private: |
21 | char str[2]; |
22 | }; |
23 | |
24 | int |
25 | main() |
26 | { |
27 | using spirit_test::test; |
28 | using spirit_test::test_attr; |
29 | using boost::spirit::x3::symbols; |
30 | using boost::spirit::x3::no_case; |
31 | |
32 | { // basics |
33 | symbols<int> sym; |
34 | |
35 | sym.add |
36 | ("Joel" ) |
37 | ("Ruby" ) |
38 | ("Tenji" ) |
39 | ("Tutit" ) |
40 | ("Kim" ) |
41 | ("Joey" ) |
42 | ("Joeyboy" ) |
43 | ; |
44 | |
45 | BOOST_TEST((test("Joel" , sym))); |
46 | BOOST_TEST((test("Ruby" , sym))); |
47 | BOOST_TEST((test("Tenji" , sym))); |
48 | BOOST_TEST((test("Tutit" , sym))); |
49 | BOOST_TEST((test("Kim" , sym))); |
50 | BOOST_TEST((test("Joey" , sym))); |
51 | BOOST_TEST((test("Joeyboy" , sym))); |
52 | BOOST_TEST((!test("XXX" , sym))); |
53 | |
54 | // test copy |
55 | symbols<int> sym2; |
56 | sym2 = sym; |
57 | BOOST_TEST((test("Joel" , sym2))); |
58 | BOOST_TEST((test("Ruby" , sym2))); |
59 | BOOST_TEST((test("Tenji" , sym2))); |
60 | BOOST_TEST((test("Tutit" , sym2))); |
61 | BOOST_TEST((test("Kim" , sym2))); |
62 | BOOST_TEST((test("Joey" , sym2))); |
63 | BOOST_TEST((!test("XXX" , sym2))); |
64 | |
65 | // make sure it plays well with other parsers |
66 | BOOST_TEST((test("Joelyo" , sym >> "yo" ))); |
67 | |
68 | sym.remove |
69 | ("Joel" ) |
70 | ("Ruby" ) |
71 | ; |
72 | |
73 | BOOST_TEST((!test("Joel" , sym))); |
74 | BOOST_TEST((!test("Ruby" , sym))); |
75 | } |
76 | |
77 | { // comma syntax |
78 | symbols<int> sym; |
79 | sym += "Joel" , "Ruby" , "Tenji" , "Tutit" , "Kim" , "Joey" ; |
80 | |
81 | BOOST_TEST((test("Joel" , sym))); |
82 | BOOST_TEST((test("Ruby" , sym))); |
83 | BOOST_TEST((test("Tenji" , sym))); |
84 | BOOST_TEST((test("Tutit" , sym))); |
85 | BOOST_TEST((test("Kim" , sym))); |
86 | BOOST_TEST((test("Joey" , sym))); |
87 | BOOST_TEST((!test("XXX" , sym))); |
88 | |
89 | sym -= "Joel" , "Ruby" ; |
90 | |
91 | BOOST_TEST((!test("Joel" , sym))); |
92 | BOOST_TEST((!test("Ruby" , sym))); |
93 | } |
94 | |
95 | { // no-case handling |
96 | using namespace boost::spirit::x3::ascii; |
97 | |
98 | symbols<int> sym; |
99 | // NOTE: make sure all entries are in lower-case!!! |
100 | sym = "joel" , "ruby" , "tenji" , "tutit" , "kim" , "joey" ; |
101 | |
102 | BOOST_TEST((test("joel" , no_case[sym]))); |
103 | BOOST_TEST((test("ruby" , no_case[sym]))); |
104 | BOOST_TEST((test("tenji" , no_case[sym]))); |
105 | BOOST_TEST((test("tutit" , no_case[sym]))); |
106 | BOOST_TEST((test("kim" , no_case[sym]))); |
107 | BOOST_TEST((test("joey" , no_case[sym]))); |
108 | |
109 | BOOST_TEST((test("JOEL" , no_case[sym]))); |
110 | BOOST_TEST((test("RUBY" , no_case[sym]))); |
111 | BOOST_TEST((test("TENJI" , no_case[sym]))); |
112 | BOOST_TEST((test("TUTIT" , no_case[sym]))); |
113 | BOOST_TEST((test("KIM" , no_case[sym]))); |
114 | BOOST_TEST((test("JOEY" , no_case[sym]))); |
115 | |
116 | // make sure it plays well with other parsers |
117 | BOOST_TEST((test("Joelyo" , no_case[sym] >> "yo" ))); |
118 | } |
119 | |
120 | { // attributes |
121 | symbols<int> sym; |
122 | |
123 | sym.add |
124 | ("Joel" , 1) |
125 | ("Ruby" , 2) |
126 | ("Tenji" , 3) |
127 | ("Tutit" , 4) |
128 | ("Kim" , 5) |
129 | ("Joey" , 6) |
130 | ; |
131 | |
132 | int i; |
133 | BOOST_TEST((test_attr("Joel" , sym, i))); |
134 | BOOST_TEST(i == 1); |
135 | BOOST_TEST((test_attr("Ruby" , sym, i))); |
136 | BOOST_TEST(i == 2); |
137 | BOOST_TEST((test_attr("Tenji" , sym, i))); |
138 | BOOST_TEST(i == 3); |
139 | BOOST_TEST((test_attr("Tutit" , sym, i))); |
140 | BOOST_TEST(i == 4); |
141 | BOOST_TEST((test_attr("Kim" , sym, i))); |
142 | BOOST_TEST(i == 5); |
143 | BOOST_TEST((test_attr("Joey" , sym, i))); |
144 | BOOST_TEST(i == 6); |
145 | BOOST_TEST((!test_attr("XXX" , sym, i))); |
146 | |
147 | // double add: |
148 | |
149 | sym.add("Joel" , 265); |
150 | BOOST_TEST((test_attr("Joel" , sym, i))); |
151 | BOOST_TEST(i == 1); |
152 | } |
153 | |
154 | { // actions |
155 | using boost::spirit::x3::_attr; |
156 | |
157 | symbols<int> sym; |
158 | sym.add |
159 | ("Joel" , 1) |
160 | ("Ruby" , 2) |
161 | ("Tenji" , 3) |
162 | ("Tutit" , 4) |
163 | ("Kim" , 5) |
164 | ("Joey" , 6) |
165 | ; |
166 | |
167 | int i; |
168 | auto f = [&](auto& ctx){ i = _attr(ctx); }; |
169 | |
170 | BOOST_TEST((test("Joel" , sym[f]))); |
171 | BOOST_TEST(i == 1); |
172 | BOOST_TEST((test("Ruby" , sym[f]))); |
173 | BOOST_TEST(i == 2); |
174 | BOOST_TEST((test("Tenji" , sym[f]))); |
175 | BOOST_TEST(i == 3); |
176 | BOOST_TEST((test("Tutit" , sym[f]))); |
177 | BOOST_TEST(i == 4); |
178 | BOOST_TEST((test("Kim" , sym[f]))); |
179 | BOOST_TEST(i == 5); |
180 | BOOST_TEST((test("Joey" , sym[f]))); |
181 | BOOST_TEST(i == 6); |
182 | BOOST_TEST((!test("XXX" , sym[f]))); |
183 | } |
184 | |
185 | return boost::report_errors(); |
186 | } |
187 | |