rockit 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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