rockit 0.7.1 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/README +24 -160
  2. data/TODO +17 -17
  3. data/VERSION +1 -1
  4. data/doc/rockit_paper.pdf +0 -0
  5. data/lib/packrat/grammar.rb +139 -84
  6. data/rakefile +27 -9
  7. data/tests/acceptance/packrat/java/atest_java.rb +37 -0
  8. data/tests/acceptance/packrat/java/java.rb +136 -0
  9. data/tests/acceptance/packrat/java/t.rb +10 -0
  10. data/tests/acceptance/packrat/java/todo +10 -0
  11. data/tests/acceptance/packrat/java/xtc.lang.java/Java.rats +446 -0
  12. data/tests/acceptance/packrat/java/xtc.lang.java/JavaConstant.rats +111 -0
  13. data/tests/acceptance/packrat/java/xtc.lang.java/JavaCore.rats +508 -0
  14. data/tests/acceptance/packrat/java/xtc.lang.java/JavaIdentifier.rats +62 -0
  15. data/tests/acceptance/packrat/java/xtc.lang.java/JavaSymbol.rats +38 -0
  16. data/tests/acceptance/packrat/java/xtc.lang.java/JavaTree.rats +40 -0
  17. data/tests/acceptance/packrat/java/xtc.lang.java/JavaType.rats +61 -0
  18. data/tests/acceptance/packrat/java/xtc.lang.java/Spacing.rats +36 -0
  19. data/tests/acceptance/packrat/java/xtc.lang.java/Symbol.rats +77 -0
  20. data/tests/acceptance/packrat/minibasic/README +13 -0
  21. data/tests/acceptance/packrat/minibasic/atest_minibasic.rb +151 -13
  22. data/tests/acceptance/packrat/minibasic/minibasic.rb +94 -76
  23. data/tests/acceptance/packrat/minibasic/mult3.basic +6 -0
  24. data/tests/acceptance/packrat/minibasic/sumeven.basic +19 -0
  25. data/tests/unit/packrat/test_ast.rb +116 -0
  26. data/tests/unit/packrat/test_interpreting_parser.rb +15 -55
  27. metadata +22 -59
  28. data/lib/rockit/prettyprint/box.rb +0 -60
  29. data/lib/rockit/prettyprint/renderer.rb +0 -41
  30. data/lib/rockit/prettyprint/text_renderer.rb +0 -47
  31. data/lib/rockit/tree/base.rb +0 -223
  32. data/lib/rockit/tree/enter_leave_visitor.rb +0 -12
  33. data/lib/rockit/tree/graphviz.rb +0 -69
  34. data/lib/rockit/tree/visitor.rb +0 -12
  35. data/lib/util/array_alternatives.rb +0 -20
  36. data/lib/util/enter_leave_visitor.rb +0 -69
  37. data/lib/util/graphviz_dot.rb +0 -182
  38. data/lib/util/string_location.rb +0 -42
  39. data/lib/util/visitor.rb +0 -49
  40. data/lib/util/visitor_combinators.rb +0 -14
  41. data/tests/acceptance/rockit/dparser/atest_any_operator.rb +0 -33
  42. data/tests/acceptance/rockit/dparser/atest_arithmetic_grammar.rb +0 -30
  43. data/tests/acceptance/rockit/dparser/atest_list_operator.rb +0 -57
  44. data/tests/acceptance/rockit/dparser/atest_mult_operator.rb +0 -60
  45. data/tests/acceptance/rockit/dparser/atest_operator_grammar.rb +0 -61
  46. data/tests/acceptance/rockit/dparser/atest_plus_operator.rb +0 -55
  47. data/tests/acceptance/rockit/dparser/atest_samples_calculator.rb +0 -14
  48. data/tests/acceptance/rockit/dparser/atest_samples_minibasic.rb +0 -20
  49. data/tests/acceptance/rockit/dparser/atest_samples_multifunccalculator.rb +0 -36
  50. data/tests/acceptance/rockit/dparser/atest_simple_grammar.rb +0 -34
  51. data/tests/acceptance/rockit/dparser/atest_speculative_code_action.rb +0 -128
  52. data/tests/acceptance/rockit/dparser/calc_tests_common.rb +0 -103
  53. data/tests/unit/parse/utest_ebnf_grammar.rb +0 -50
  54. data/tests/unit/parse/utest_expand_grammar.rb +0 -23
  55. data/tests/unit/parse/utest_grammar.rb +0 -160
  56. data/tests/unit/rockit/assembler/llvm/utest_instructions.rb +0 -41
  57. data/tests/unit/rockit/assembler/llvm/utest_module.rb +0 -19
  58. data/tests/unit/rockit/prettyprint/utest_box.rb +0 -44
  59. data/tests/unit/rockit/tree/utest_tree_base.rb +0 -301
  60. data/tests/unit/rockit/tree/utest_tree_enter_leave_visitor.rb +0 -69
  61. data/tests/unit/rockit/tree/utest_tree_visitor.rb +0 -63
  62. data/tests/unit/rockit/utest_grammar.rb +0 -145
  63. data/tests/unit/rockit/utest_grammar_symbol.rb +0 -11
  64. data/tests/unit/rockit/utest_maybe_operator.rb +0 -12
  65. data/tests/unit/rockit/utest_regexp_terminal.rb +0 -45
  66. data/tests/unit/rockit/utest_repetition_operators.rb +0 -35
  67. data/tests/unit/rockit/utest_rule.rb +0 -23
  68. data/tests/unit/rockit/utest_string_terminal.rb +0 -40
  69. data/tests/unit/util/utest_array_alternatives.rb +0 -23
  70. data/tests/unit/util/utest_enter_leave_visitor.rb +0 -89
  71. data/tests/unit/util/utest_string_location.rb +0 -42
  72. data/tests/unit/util/utest_visitor.rb +0 -92
  73. data/tests/unit/util/utest_visitor_combinators.rb +0 -64
@@ -1,301 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/tree/base'
4
- require 'samples/rockit/ruby/sample_ruby_ast_trees/mr_1'
5
-
6
- class UTestTreeBase < Test::Unit::TestCase
7
- def setup
8
- @a = Rockit::Tree::Base.new_tree_class(:A)
9
- @b = Rockit::Tree::Base.new_tree_class(:B, [:c1])
10
- @c = Rockit::Tree::Base.new_tree_class(:C, [:c1, :c2])
11
- end
12
-
13
- def test_01_subclass_with_no_named_children
14
- t = @a[1]
15
- assert_kind_of(@a, t)
16
- assert_equal(1, t.children.length)
17
- assert_equal(1, t[0])
18
-
19
- t2 = @a["1", 2]
20
- assert_kind_of(@a, t2)
21
- assert_equal(2, t2.children.length)
22
- assert_equal("1", t2[0])
23
- assert_equal(2, t2[1])
24
- end
25
-
26
- def test_02_subclass_with_one_named_child
27
- t = @b[:a]
28
- assert_kind_of(@b, t)
29
- assert_equal(1, t.children.length)
30
- assert_equal(:a, t[0])
31
- assert_equal(:a, t.c1)
32
- end
33
-
34
- def test_03_subclass_with_two_named_children
35
- t = @c[3.0, 4]
36
- assert_kind_of(@c, t)
37
- assert_equal(2, t.children.length)
38
- assert_equal(3.0, t[0])
39
- assert_equal(3.0, t.c1)
40
- assert_equal(4, t[1])
41
- assert_equal(4, t.c2)
42
-
43
- t.c1 = 5
44
- assert_equal(5, t[0])
45
- assert_equal(5, t.c1)
46
-
47
- t.c2 = 6
48
- assert_equal(6, t[1])
49
- assert_equal(6, t.c2)
50
- end
51
-
52
- def test_04_complex_tree
53
- t = @a[@b[@c[1, 2]], @c[3, 4]]
54
- assert_kind_of(@a, t)
55
- assert_kind_of(@b, t[0])
56
- assert_kind_of(@c, t[1])
57
- assert_kind_of(@c, t[0][0])
58
- assert_equal(1, t[0][0][0])
59
- assert_equal(2, t[0][0][1])
60
- assert_equal(3, t[1][0])
61
- assert_equal(4, t[1][1])
62
- end
63
-
64
- def test_05_subclass_of_tree
65
- @d = @a.new_tree_class(:D, [:d1, :d2])
66
-
67
- t = @d["sub", /a/]
68
- assert_kind_of(@d, t)
69
- assert_kind_of(@a, t)
70
- assert_equal("sub", t[0])
71
- assert_equal("sub", t.d1)
72
- assert_equal(/a/, t[1])
73
- assert_equal(/a/, t.d2)
74
- end
75
-
76
- def test_06_upcase_symbols_to_patternvar
77
- t = @a[:X]
78
- nt = t.upcase_symbols_to_pattern_vars
79
- assert_kind_of(@a, nt)
80
- pvar = nt[0]
81
- assert_kind_of(Rockit::Tree::Base::PatternVar, pvar)
82
- assert_equal(:X, pvar.name)
83
-
84
- t2 = @c[@b[:X], @a[:Y, :Z]]
85
- nt2 = t2.upcase_symbols_to_pattern_vars
86
- assert_kind_of(@c, nt2)
87
- xvar = nt2[0][0]
88
- assert_kind_of(Rockit::Tree::Base::PatternVar, xvar)
89
- assert_equal(:X, pvar.name)
90
- yvar = nt2[1][0]
91
- assert_kind_of(Rockit::Tree::Base::PatternVar, yvar)
92
- assert_equal(:Y, yvar.name)
93
- zvar = nt2[1][1]
94
- assert_kind_of(Rockit::Tree::Base::PatternVar, zvar)
95
- assert_equal(:Z, zvar.name)
96
- end
97
-
98
- def assert_match_result(expected, tree, pattern)
99
- actual = pattern.upcase_symbols_to_pattern_vars.match_tree(tree)
100
- assert_equal(expected, actual)
101
- end
102
-
103
- def test_07_match_tree_simple
104
- pattern = @a[:X].upcase_symbols_to_pattern_vars
105
- tree = @a[1]
106
- res = pattern.match_tree(tree)
107
- assert_kind_of(Hash, res)
108
- assert_equal(1, res[:X])
109
-
110
- t2 = @a[t3 = @b[1]]
111
- assert_match_result({:X => t3}, t2, pattern)
112
- end
113
-
114
- def test_08_match_tree_complex
115
- pattern = @c[@b[:X], @a[:Y]].upcase_symbols_to_pattern_vars
116
- tree = @c[@b["23"], @a[/a/]]
117
- res = pattern.match_tree(tree)
118
- assert_kind_of(Hash, res)
119
- assert_equal("23", res[:X])
120
- assert_equal(/a/, res[:Y])
121
-
122
- pattern = @b[@c[:L, :R]].upcase_symbols_to_pattern_vars
123
- t2 = @b[t3 = @c[3, 4]]
124
- res = pattern.match_tree(t2)
125
- assert_equal({:L => 3, :R => 4}, res)
126
- end
127
-
128
- def test_09_match_tree_complex_with_subtrees
129
- pattern = @c[@b[:ARNE], @a[:STree]].upcase_symbols_to_pattern_vars
130
- stree = @c[3, 4]
131
- tree = @c[@b[1.4], @a[stree]]
132
- res = pattern.match_tree(tree)
133
- assert_kind_of(Hash, res)
134
- assert_equal(1.4, res[:ARNE])
135
- assert_equal(stree, res[:STree])
136
- end
137
-
138
- def test_10_regexp_style_matching
139
- stree = @a[]
140
- res = @b[@c[stree, 2]] =~ @b[@c[:First, :Second]]
141
- assert_kind_of(Hash, res)
142
- assert_equal(2, res[:Second])
143
- assert_equal(stree, res[:First])
144
- end
145
-
146
- def test_11_failing_match_tree
147
- assert_match_result(nil, @b[1], @a[])
148
- assert_match_result(nil, @a[1], @b[])
149
- assert_match_result(nil, @a[1], @a[2])
150
- assert_match_result(nil, @c[@a[], 1], @c[@a[], 2])
151
- assert_match_result(nil, @c[@a[], "1"], @c[@a[], "2"])
152
- end
153
-
154
- def assert_pp(expected, tree, width = 79)
155
- actual = ""
156
- PP.pp(tree, actual, width)
157
- assert_equal(expected, actual)
158
- end
159
-
160
- def test_12_pretty_print
161
- assert_pp("A[1]\n", @a[1])
162
- assert_pp("A[B[2]]\n", @a[@b[2]])
163
- assert_pp("C[B[3.0], /a/]\n", @c[@b[3.0], /a/])
164
- lstr = "." * 75
165
- assert_pp("C[\n B[3.0],\n #{lstr.inspect}]\n", @c[@b[3.0], lstr])
166
- end
167
-
168
- def collect_trees(tree)
169
- ary = []
170
- tree.each_tree {|t| ary << t}
171
- ary
172
- end
173
-
174
- def test_13_each_tree_simple
175
- t = @a[]
176
- assert_equal([t], collect_trees(t))
177
- end
178
-
179
- def test_14_each_tree_complex
180
- t = @c[t2 = @b[t3 = @a[1]], t4 = @b[2]]
181
- assert_equal([t, t2, t3, 1, t4, 2], collect_trees(t))
182
- end
183
-
184
- def collect_trees_of_class(tree, klass, recursive = false)
185
- ary = []
186
- tree.each_tree_of_class(klass, recursive) {|t| ary << t}
187
- ary
188
- end
189
-
190
- def test_15_each_tree_of_klass
191
- t = @c[t2 = @b[t3 = @a[t4 = @b[1]]], t5 = @b[t6 = @c[3, 4]]]
192
- assert_equal([t2, t5], collect_trees_of_class(t, @b))
193
- assert_equal([t2, t4, t5], collect_trees_of_class(t, @b, true))
194
- assert_equal([t3], collect_trees_of_class(t, @a))
195
- assert_equal([t], collect_trees_of_class(t, @c))
196
- assert_equal([t, t6], collect_trees_of_class(t, @c, true))
197
- end
198
-
199
- def test_16_set_parents_and_parent
200
- t = @c[t2 = @b[t3 = @a[t4 = @b[1]]], t5 = @b[t6 = @c[3, 4]]]
201
-
202
- assert_equal(nil, t.parent)
203
- assert_equal(nil, t2.parent)
204
- assert_equal(nil, t3.parent)
205
- assert_equal(nil, t4.parent)
206
- assert_equal(nil, t5.parent)
207
- assert_equal(nil, t6.parent)
208
-
209
- t.set_parents
210
-
211
- assert_equal(nil, t.parent)
212
- assert_equal(t, t2.parent)
213
- assert_equal(t2, t3.parent)
214
- assert_equal(t3, t4.parent)
215
- assert_equal(t, t5.parent)
216
- assert_equal(t5, t6.parent)
217
- end
218
-
219
- def test_17_all_matching_trees
220
- t = @c[t2 = @b[t3 = @a[t4 = @b[1]]], t5 = @b[t6 = @c[3, 4]]]
221
-
222
- pattern = @a[:X]
223
- res = pattern.all_matching_trees(t)
224
- assert_kind_of(Array, res)
225
- assert_equal(1, res.length)
226
- mapping, subtree = res[0]
227
- assert_kind_of(Hash, mapping)
228
- assert_equal({:X => t4}, mapping)
229
- assert_kind_of(Rockit::Tree::Base, subtree)
230
- assert_equal(t3, subtree)
231
-
232
- pattern = @b[:X]
233
- res = pattern.all_matching_trees(t)
234
- assert_equal(3, res.length)
235
- assert_equal({:X => t3}, res[0][0])
236
- assert_equal(t2, res[0][1])
237
- assert_equal({:X => 1}, res[1][0])
238
- assert_equal(t4, res[1][1])
239
- assert_equal({:X => t6}, res[2][0])
240
- assert_equal(t5, res[2][1])
241
-
242
- pattern = @c[:Left, :Right]
243
- res = pattern.all_matching_trees(t)
244
- assert_equal(2, res.length)
245
- assert_equal({:Left => t2, :Right => t5}, res[0][0])
246
- assert_equal(t, res[0][1])
247
- assert_equal({:Left => 3, :Right => 4}, res[1][0])
248
- assert_equal(t6, res[1][1])
249
-
250
- pattern = @b[@a[:Z]]
251
- res = pattern.all_matching_trees(t)
252
- assert_equal(1, res.length)
253
- assert_equal({:Z => t4}, res[0][0])
254
- assert_equal(t2, res[0][1])
255
-
256
- pattern = @b[@c[:L, :R]]
257
- res = pattern.all_matching_trees(t)
258
- assert_equal(1, res.length)
259
- assert_equal({:L => 3, :R => 4}, res[0][0])
260
- assert_equal(t5, res[0][1])
261
- end
262
-
263
- def test_18_bug_with_nested_string_child
264
- t = @a["y", 1]
265
- res = @a["y", :X].upcase_symbols_to_pattern_vars.match_tree(t)
266
- assert_equal({:X => 1}, res)
267
-
268
- t = @a[@b["y"], 1]
269
- res = @a[@b["y"], :X].upcase_symbols_to_pattern_vars.match_tree(t)
270
- assert_equal({:X => 1}, res)
271
-
272
- res = @a[@b["y"], :X].all_matching_trees(t)
273
- assert_equal(1, res.length)
274
- end
275
-
276
- def test_18_complex_tree_binop_bug
277
- pattern = BinOpCall[:X, "-", :Y]
278
- res = pattern.all_matching_trees(MR1Tree)
279
- assert_equal(1, res.length)
280
-
281
- res = BinOpCall[:X, "/", :Y].all_matching_trees(MR1Tree)
282
- assert_equal(1, res.length)
283
-
284
- res = BinOpCall[:X, "+", :Y].all_matching_trees(MR1Tree)
285
- assert_equal(1, res.length)
286
-
287
- res = BinOpCall[:X, "*", :Y].all_matching_trees(MR1Tree)
288
- assert_equal(0, res.length)
289
-
290
- res = Assign[LVar["y"], :X].all_matching_trees(MR1Tree)
291
- assert_equal(4, res.length)
292
- end
293
-
294
- def test_19_should_traverse_into_arrays
295
- # We need this since it is quite common that a collection of statements
296
- # are simply given in an Array. It might be a design smell though!
297
- tree = @a[[@b[1]]]
298
- bs = tree.select_trees_of_class(@b)
299
- assert_equal(1, bs.length)
300
- end
301
- end
@@ -1,69 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/tree/enter_leave_visitor'
4
-
5
- class UTestTreeEnterLeaveVisitor < Test::Unit::TestCase
6
- def setup
7
- @a = Rockit::Tree::Base.new_tree_class(:A)
8
- @b = Rockit::Tree::Base.new_tree_class(:B, [:c1])
9
- @c = Rockit::Tree::Base.new_tree_class(:C, [:c1, :c2])
10
- @d = Rockit::Tree::Base.new_tree_class(:D)
11
- @e = Rockit::Tree::Base.new_tree_class(:E)
12
- end
13
-
14
- # Visits a node both on the way down in the tree and on the way up.
15
- # Still a depth-first search.
16
- class TreeELVisitor
17
- include EnterLeaveVisitor
18
-
19
- def initialize
20
- @visited = []
21
- end
22
-
23
- def [](index); @visited[index]; end
24
-
25
- def enter_A(obj); @visited << obj; end
26
- def leave_A(obj); @visited << obj; end
27
- def enter_B(obj); @visited << obj; end
28
- def leave_B(obj); @visited << obj; end
29
- def enter_C(obj); @visited << obj; end
30
- def leave_C(obj); @visited << obj; end
31
- def visit_E(obj); @visited << obj; end
32
- end
33
-
34
- class TreeAndFixnumELVisitor < TreeELVisitor
35
- def enter_Fixnum(obj); @visited << obj; end
36
- end
37
-
38
- def test_01_visitor
39
- tree = @c[tb1 = @b[ta = @a[@d[te = @e[]]]], tb2 = @b[t1 = 1]]
40
- visitor = TreeELVisitor.new
41
- tree.accept_visitor(visitor)
42
-
43
- assert_equal(tree, visitor[0])
44
- assert_equal(tb1, visitor[1])
45
- assert_equal(ta, visitor[2])
46
- # D is never visited sine we have no enter, visit or leave method for it.
47
- # E is visited even though we only have a visit method but no enter or
48
- # leave methods.
49
- assert_equal(te, visitor[3])
50
- assert_equal(ta, visitor[4])
51
- assert_equal(tb1, visitor[5])
52
- assert_equal(tb2, visitor[6])
53
- assert_equal(tb2, visitor[7])
54
- assert_equal(tree, visitor[8])
55
-
56
- visitor2 = TreeAndFixnumELVisitor.new
57
- tree.accept_visitor(visitor2)
58
- assert_equal(tree, visitor2[0])
59
- assert_equal(tb1, visitor2[1])
60
- assert_equal(ta, visitor2[2])
61
- assert_equal(te, visitor[3])
62
- assert_equal(ta, visitor2[4])
63
- assert_equal(tb1, visitor2[5])
64
- assert_equal(tb2, visitor2[6])
65
- assert_equal(1, visitor2[7])
66
- assert_equal(tb2, visitor2[8])
67
- assert_equal(tree, visitor2[9])
68
- end
69
- end
@@ -1,63 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/tree/visitor'
4
-
5
- class UTestTreeVisitor < Test::Unit::TestCase
6
- def setup
7
- @a = Rockit::Tree::Base.new_tree_class(:A)
8
- @b = Rockit::Tree::Base.new_tree_class(:B, [:c1])
9
- @c = Rockit::Tree::Base.new_tree_class(:C, [:c1, :c2])
10
- end
11
-
12
- class TreeVisitor
13
- include Visitor
14
-
15
- def initialize
16
- @visited = []
17
- end
18
-
19
- def [](index); @visited[index]; end
20
-
21
- def visit_A(obj)
22
- @visited << obj
23
- end
24
-
25
- def visit_B(obj)
26
- @visited << obj
27
- end
28
-
29
- def visit_C(obj)
30
- @visited << obj
31
- end
32
- end
33
-
34
- class TreeAndFixnumVisitor < TreeVisitor
35
- def visit_Fixnum(obj)
36
- @visited << obj
37
- end
38
- end
39
-
40
- def test_01_visitor
41
- tree = @c[tb1 = @b[ta = @a[]], tb2 = @b[t1 = 1]]
42
- visitor = TreeVisitor.new
43
- tree.accept_visitor(visitor)
44
- # The visitor pattern by default does a depth-first visit of the nodes
45
- # in the tree. Note that the 1 is not in the visited list since the visitor
46
- # has no method to visit Fixnums.
47
- assert_equal(tree, visitor[0])
48
- assert_equal(tb1, visitor[1])
49
- assert_equal(ta, visitor[2])
50
- assert_equal(tb2, visitor[3])
51
-
52
- # This visitor has a method to visit Fixnums so it should have the same
53
- # obj's in the visited array as the previous one but then followed by
54
- # the 1 that is the child of the tb2 tree above.
55
- visitor2 = TreeAndFixnumVisitor.new
56
- tree.accept_visitor(visitor2)
57
- assert_equal(tree, visitor2[0])
58
- assert_equal(tb1, visitor2[1])
59
- assert_equal(ta, visitor2[2])
60
- assert_equal(tb2, visitor2[3])
61
- assert_equal(t1, visitor2[4])
62
- end
63
- end
@@ -1,145 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/grammar'
4
- include Rockit
5
-
6
- class UTestGrammar < Test::Unit::TestCase
7
- def test_01_creation
8
- g = Rockit::Grammar.new
9
- assert_kind_of(Rockit::Grammar, g)
10
- end
11
-
12
- TestGrammar1 = Rockit::Grammar.new do
13
- rule :A, [["1", :B, :C]]
14
- rule :B, [["2", :D]]
15
- term :C, "a"
16
- term :D, "b"
17
- end
18
-
19
- def symbols_as_strings(symbols)
20
- symbols.map {|s| s.to_s}.sort
21
- end
22
-
23
- def assert_symbols(expected, actual, msg = "")
24
- assert_equal(symbols_as_strings(expected), symbols_as_strings(actual), msg)
25
- end
26
-
27
- def test_02_simple_grammar
28
- assert_kind_of(Rockit::Grammar, TestGrammar1)
29
-
30
- assert_equal(2, TestGrammar1.rules.length)
31
- assert_symbols([:A, :B], TestGrammar1.nonterminals)
32
- assert_equal(2, TestGrammar1.terms.length)
33
- assert_symbols([:C, :D], TestGrammar1.terms.keys)
34
-
35
- assert_kind_of(Rule, ra = TestGrammar1.rules.first)
36
- assert_kind_of(Rule, rb = TestGrammar1.rules.last)
37
-
38
- assert_kind_of(Terminal, TestGrammar1.terms[:C])
39
- assert_kind_of(Terminal, TestGrammar1.terms[:D])
40
-
41
- assert_equal(:A, ra.name)
42
- assert_equal(3, (rarhs = ra.right_hand_side).length)
43
- rarhs1, rarhs2, rarhs3 = rarhs
44
- assert_kind_of(StringTerminal, rarhs1)
45
- assert_kind_of(NonTerminal, rarhs2)
46
- assert_kind_of(NonTerminal, rarhs3)
47
- assert_equal("1", rarhs1.string)
48
- assert_equal(:B, rarhs2.symbol)
49
- assert_equal(:C, rarhs3.symbol)
50
-
51
- assert_equal(:B, rb.name)
52
- assert_equal(2, (rbrhs = rb.right_hand_side).length)
53
- rbrhs1, rbrhs2 = rbrhs
54
- assert_kind_of(StringTerminal, rbrhs1)
55
- assert_kind_of(NonTerminal, rbrhs2)
56
- assert_equal("2", rbrhs1.string)
57
- assert_equal(:D, rbrhs2.symbol)
58
- end
59
-
60
- Arithmetic = Rockit::Grammar.new do
61
- # Additive <- Multitive '+' Additive
62
- # / Multitive
63
- # Multitive <- Primary '*' Multitive
64
- # / Primary
65
- # Primary <- '(' Additive ')'
66
- # / Decimal
67
- # Decimal <- '0' / '1' / '2' / '3' / '4' / '5' / '6' / '7' / '8' / '9'
68
-
69
- start :Additive, [
70
- [:Multitive, '+', :Additive],
71
- [:Multitive],
72
- ]
73
- rule :Multitive, [
74
- [:Primary, '*', :Multitive],
75
- [:Primary]
76
- ]
77
- rule :Primary, [
78
- ['(', :Additive, ')'],
79
- [:Decimal]
80
- ]
81
- term :Decimal, /[0-9]/
82
- end
83
-
84
- def test_03_arithmetic_grammar
85
- assert_equal(6, Arithmetic.rules.length)
86
- assert_symbols([:Additive, :Multitive, :Primary], Arithmetic.nonterminals)
87
- assert_equal(1, Arithmetic.terms.length)
88
- assert_symbols([:Decimal], Arithmetic.terms.keys)
89
- assert_equal(:Additive, Arithmetic.start_symbol)
90
- assert_raise(NotImplementedError) {Arithmetic.new_parser.parse("2")}
91
-
92
- ras = Arithmetic.find_rules(:Additive)
93
- assert_equal(2, ras.length)
94
- ra1, ra2 = ras
95
-
96
- assert_equal(:Additive, ra1.name)
97
- assert_equal(3, (ra1rhs = ra1.right_hand_side).length)
98
- assert_kind_of(NonTerminal, ra1rhs[0])
99
- assert_kind_of(StringTerminal, ra1rhs[1])
100
- assert_kind_of(NonTerminal, ra1rhs[2])
101
- assert_equal(:Multitive, ra1rhs[0].symbol)
102
- assert_equal("+", ra1rhs[1].string)
103
- assert_equal(:Additive, ra1rhs[2].symbol)
104
-
105
- assert_equal(:Additive, ra2.name)
106
- assert_equal(1, (ra2rhs = ra2.right_hand_side).length)
107
- assert_kind_of(NonTerminal, ra2rhs[0])
108
- assert_equal(:Multitive, ra2rhs[0].symbol)
109
-
110
- td = Arithmetic.terms[:Decimal]
111
- assert_equal(:Decimal, td.name)
112
- rdrhs1 = td.right_hand_side
113
- assert_equal(1, rdrhs1.length)
114
- assert_kind_of(RegexpTerminal, rdrhs1[0])
115
- end
116
-
117
- Operators = Rockit::Grammar.new do
118
- start :Number, [
119
- [plus(:Digit), maybe(/e|E/), maybe("-")],
120
- [:Dummy]
121
- ]
122
- rule :Dummy, [[mult("a"), rep("b", 3, 6)]]
123
- term :Digit, /[0-9]/
124
- end
125
-
126
- def test_04_operators
127
- assert_equal(3, Operators.rules.length)
128
- assert_symbols([:Number, :Dummy], Operators.nonterminals)
129
- assert_equal(1, Operators.terms.length)
130
- assert_symbols([:Digit], Operators.terms.keys)
131
- assert_equal(:Number, Operators.start_symbol)
132
-
133
- rn1, rn2 = Operators.find_rules(:Number)
134
- assert_equal(:Number, rn1.name)
135
-
136
- assert_equal(3, (rn1rhs = rn1.right_hand_side).length)
137
- assert_kind_of(Plus, rn1rhs[0])
138
- assert_kind_of(Maybe, rn1rhs[1])
139
- assert_kind_of(Maybe, rn1rhs[2])
140
-
141
- assert_kind_of(NonTerminal, rn1rhs[0].symbol)
142
- assert_kind_of(RegexpTerminal, rn1rhs[1].symbol)
143
- assert_kind_of(StringTerminal, rn1rhs[2].symbol)
144
- end
145
- end