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,103 +0,0 @@
1
- # Tests common to several calculators
2
- module CalcTestsCommon
3
- def parser
4
- @parser ||= @grammar.new_parser
5
- end
6
-
7
- def test_01_grammar
8
- assert_kind_of(Rockit::DParser::Grammar, @grammar)
9
- end
10
-
11
- def test_02_creation_of_parser
12
- assert_kind_of(Rockit::DParser::Parser, parser)
13
- end
14
-
15
- def test_03_constant
16
- ast = parser.parse "1234567890"
17
- assert_equal("Constant", ast.name)
18
- assert_kind_of(parser.astclass_of_name(:Constant), ast)
19
- assert_equal(1, ast.num_children)
20
- assert_equal("1234567890", ast[0])
21
- assert_equal("1234567890", ast.num)
22
- end
23
-
24
- Ops = [["+", :Plus], ["-", :Minus], ["*", :Mul], ["/", :Div]]
25
-
26
- def test_04_operators
27
- Ops.each do |op, n|
28
- num1, num2 = rand(10).to_s, rand(10).to_s
29
- str = num1 + op + num2
30
- ast = parser.parse str
31
- assert_equal(n.to_s, ast.name)
32
- assert_kind_of(parser.astclass_of_name(n), ast)
33
- assert_equal(2, ast.num_children)
34
-
35
- assert_kind_of(parser.astclass_of_name(:Constant), ast[0])
36
- assert_equal(num1, ast[0].num)
37
- assert_kind_of(parser.astclass_of_name(:Constant), ast.left)
38
- assert_equal(num1, ast.left.num)
39
-
40
- assert_kind_of(parser.astclass_of_name(:Constant), ast[1])
41
- assert_equal(num2, ast[1].num)
42
- assert_kind_of(parser.astclass_of_name(:Constant), ast.right)
43
- assert_equal(num2, ast.right.num)
44
- end
45
- end
46
-
47
- def test_05_paren
48
- ast = parser.parse "2 * (4 + 67)"
49
- assert_kind_of(parser.astclass_of_name(:Mul), ast)
50
- assert_equal(2, ast.num_children)
51
-
52
- assert_kind_of(parser.astclass_of_name(:Constant), ast.left)
53
- assert_equal("2", ast.left.num)
54
-
55
- assert_kind_of(parser.astclass_of_name(:Plus), ast.right)
56
-
57
- assert_kind_of(parser.astclass_of_name(:Constant), ast.right.left)
58
- assert_equal("4", ast.right.left.num)
59
-
60
- assert_kind_of(parser.astclass_of_name(:Constant), ast.right.right)
61
- assert_equal("67", ast.right.right.num)
62
-
63
- assert_equal('Mul[Constant["2"], Plus[Constant["4"], Constant["67"]]]',
64
- ast.inspect)
65
- end
66
-
67
- def assert_calc(expected, str)
68
- assert_equal(expected, @calculator.eval(parser.parse(str)))
69
- end
70
-
71
- def test_06_left_associative_operators
72
- Ops.each do |op, name|
73
- ast = parser.parse "1 #{op} 2 #{op} 3"
74
- assert_kind_of(parser.astclass_of_name(name), ast)
75
-
76
- assert_kind_of(parser.astclass_of_name(name), ast.left)
77
- assert_equal("1", ast.left.left.num)
78
- assert_equal("2", ast.left.right.num)
79
-
80
- assert_kind_of(parser.astclass_of_name(:Constant), ast.right)
81
- assert_equal("3", ast.right.num)
82
- end
83
- end
84
-
85
- def test_07_mul_higher_precedence_than_plus
86
- ast = parser.parse "1 + 2 * 3"
87
- assert_kind_of(parser.astclass_of_name(:Plus), ast)
88
-
89
- assert_kind_of(parser.astclass_of_name(:Constant), ast.left)
90
- assert_equal("1", ast.left.num)
91
-
92
- assert_kind_of(parser.astclass_of_name(:Mul), ast.right)
93
- assert_equal("2", ast.right.left.num)
94
- assert_equal("3", ast.right.right.num)
95
- end
96
-
97
- def test_08_eval
98
- assert_calc(2, "2")
99
- assert_calc(2 * (4+67), "2 * (4 + 67)")
100
- assert_calc(987 * (456+671), "987*(456+671)")
101
- assert_calc((9-5) * (100/10), "(9-5) * (100/10)")
102
- end
103
- end
@@ -1,50 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'parse/ebnf_grammar'
4
- include Parse::Grammar
5
-
6
- class UT_Parse_ebnf_grammar < Test::Unit::TestCase
7
- def test_01_Maybe_expansion
8
- g = Grammar.new do
9
- r :Start, [
10
- [maybe(:A), "1"]
11
- ]
12
- r :A, ["a"]
13
- end
14
- g.expand!
15
- assert_equal(3, g.nonterminals.length)
16
- end
17
-
18
- def test_02_Plus_expansion
19
- g = Grammar.new do
20
- r :Start, [
21
- [plus(:A), "1"]
22
- ]
23
- r :A, ["a"]
24
- end
25
- g.expand!
26
- assert_equal(4, g.nonterminals.length)
27
- end
28
-
29
- def test_03_Mult_expansion
30
- g = Grammar.new do
31
- r :Start, [
32
- [mult(:A), "1"]
33
- ]
34
- r :A, ["a"]
35
- end
36
- g.expand!
37
- assert_equal(3, g.nonterminals.length)
38
- end
39
-
40
- def test_04_Group_expansion
41
- g = Grammar.new do
42
- r :Start, [
43
- [group("1", "2"), "3"]
44
- ]
45
- end
46
- g.expand!
47
- puts g.inspect
48
- assert_equal(2, g.nonterminals.length)
49
- end
50
- end
@@ -1,23 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'parse/expand_grammar'
4
- include Parse::Grammar
5
-
6
- class UT_Parse_expand_grammar < Test::Unit::TestCase
7
- def test_01_internal_nonterm_num
8
- g = Grammar.new
9
- assert_equal(1, g.next_free_internal_nonterminal_num)
10
- assert_equal(2, g.next_free_internal_nonterminal_num)
11
- assert_equal(3, g.next_free_internal_nonterminal_num)
12
- end
13
-
14
- def test_02_create_fresh_nonterminal
15
- g = Grammar.new
16
- nt = g.create_fresh_nonterminal
17
- assert_kind_of(NonTerminal, nt)
18
-
19
- # The name should start with the prefix
20
- re = Regexp.new("^" + Grammar::InternalNontermNamePrefix)
21
- assert_match(re, nt.name.to_s)
22
- end
23
- end
@@ -1,160 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'parse/grammar'
4
- include Parse::Grammar
5
-
6
- class UT_Parse_Grammar < Test::Unit::TestCase
7
- def test_01_Symbol
8
- s = Parse::Grammar::GrammarSymbol.new "name"
9
- assert_equal("name", s.name)
10
- assert_equal("name", s.inspect)
11
- assert_equal(s, s.to_grammar_symbol)
12
- end
13
-
14
- def test_02_Symbol_name_not_needed
15
- s = Parse::Grammar::GrammarSymbol.new
16
- assert_equal(nil, s.name)
17
- assert_equal(s, s.to_grammar_symbol)
18
- end
19
-
20
- def test_03_NonTerminal
21
- s = NonTerminal.new :name
22
- assert_equal(:name, s.name)
23
- assert_equal("name", s.inspect)
24
- assert_kind_of(Parse::Grammar::GrammarSymbol, s)
25
- assert_equal(s, s.to_grammar_symbol)
26
- end
27
-
28
- def test_04_Terminal
29
- s = Terminal.new
30
- assert_kind_of(Parse::Grammar::GrammarSymbol, s)
31
- end
32
-
33
- def test_05_Production
34
- p = Production.new(n = NonTerminal.new(:N), [t = Terminal.new(:T)])
35
- assert_equal(n, p.symbol)
36
- assert_equal(t, p.rhs.first)
37
- assert_equal(t, p.right_hand_side.first)
38
- end
39
-
40
- def test_06_Production_short_hand
41
- p = Prod[n = NonTerminal.new(:N), [t = Terminal.new(:T)]]
42
- assert_equal(n, p.symbol)
43
- assert_equal(t, p.rhs.first)
44
- assert_equal(t, p.right_hand_side.first)
45
-
46
- p2 = Prod[:N, [t]]
47
- assert_equal("N", p2.symbol.inspect)
48
- end
49
-
50
- def test_07_nonterminal_equality
51
- n1 = NonTerminal.new(:N)
52
- n2 = NonTerminal.new(:N)
53
- assert(n1 == n2)
54
- assert(n2 == n1)
55
- end
56
-
57
- def test_08_Rule
58
- p1 = Prod[n = NonTerminal.new(:N), [Terminal.new(:T1)]]
59
- p2 = Prod[:N, [Terminal.new(:T2)]]
60
- r = Rule[p1]
61
-
62
- assert(n == r.symbol)
63
- assert_equal(1, r.productions.length)
64
-
65
- r.add_production p2
66
- assert_equal(n, r.symbol)
67
- assert_equal(2, r.productions.length)
68
-
69
- assert_raises(ArgumentError) {r.add_production(Prod[:N2, [Terminal[:T3]]])}
70
- end
71
-
72
- def test_09_Grammar
73
- g = Grammar.new(:name => "Test Grammar 1", :author => "Robert")
74
- assert_kind_of(Grammar, g)
75
- assert_equal("Test Grammar 1", g.meta[:name])
76
- assert_equal("Robert", g.meta[:author])
77
- assert_equal(0, g.rules.length)
78
- assert_equal(0, g.nonterminals.length)
79
- assert_equal(0, g.terminals.length)
80
- assert_equal(0, g.symbols.length)
81
-
82
- g.add_rule(Rule[Prod[:N, [Terminal[:T1]]]])
83
- assert_equal(1, g.rules.length)
84
- assert_equal(1, g.nonterminals.length)
85
- assert_equal(1, g.terminals.length)
86
- assert_equal(2, g.symbols.length)
87
- end
88
-
89
- def test_10_symbol_predicates
90
- nt = NonTerminal[:N]
91
- assert_equal(true, nt.nonterminal?)
92
- assert_equal(false, nt.terminal?)
93
- assert_equal(false, nt.action?)
94
-
95
- t = Terminal[:T]
96
- assert_equal(false, t.nonterminal?)
97
- assert_equal(true, t.terminal?)
98
- assert_equal(false, t.action?)
99
-
100
- a = Action[:A]
101
- assert_equal(false, a.nonterminal?)
102
- assert_equal(false, a.terminal?)
103
- assert_equal(true, a.action?)
104
- end
105
-
106
- class TestGrammar < Grammar
107
- r :S, [[:B]]
108
- r :B, [
109
- [Terminal.new(:T1)],
110
- [Terminal.new(:T2), Terminal.new(:T3)],
111
- ]
112
- t :CT1, ["A"]
113
- end
114
-
115
- def test_11_embedded_grammar_def
116
- t = TestGrammar.new
117
-
118
- assert_equal(2, t.rules.length)
119
-
120
- assert_equal(:S, t.rules.first.symbol.name)
121
- assert_equal(1, t.rules.first.productions.length)
122
-
123
- assert_equal(:B, t.rules.last.symbol.name)
124
- assert_equal(2, t.rules.last.productions.length)
125
- assert_equal(:T1, t.rules.last.productions.first.rhs.first.name)
126
- assert_equal(:T2, t.rules.last.productions.last.rhs.first.name)
127
- assert_equal(:T3, t.rules.last.productions.last.rhs.last.name)
128
-
129
- assert_equal(1, t.complex_terminals.length)
130
-
131
- assert_equal(:CT1, t.complex_terminals.first.name)
132
- end
133
-
134
- TestDeepClone = Struct.new(:a)
135
-
136
- def test_12_deep_clone
137
- a = [1,2,3]
138
- t1 = TestDeepClone.new(a)
139
- t1a = t1.clone
140
- t1b = t1.deep_clone
141
- assert_equal(t1.a.object_id, t1a.a.object_id)
142
- assert_not_equal(t1.a.object_id, t1b.a.object_id)
143
- end
144
-
145
- def test_13_define_grammar_in_a_block
146
- g = Grammar.new do
147
- r :S, [["a", :B]]
148
- r :B, [["b"]]
149
- end
150
- assert_equal(2, g.nonterminals.length)
151
- end
152
-
153
- def test_14_extending_a_grammar_with_a_block
154
- g = TestGrammar.new do
155
- r :A, [["a"]]
156
- end
157
- # Two nonterminals in the original grammar and one new here => 3
158
- assert_equal(3, g.nonterminals.length)
159
- end
160
- end
@@ -1,41 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/assembler/llvm/instructions'
4
- include Rockit::Assembler::LLVM
5
-
6
- class UTestLLVMInstructions < Test::Unit::TestCase
7
- def test_01_NamedValue_valid
8
- nv1 = NamedValue.new("foo")
9
- assert_equal("%foo", nv1.to_llvm)
10
-
11
- nv2 = NamedValue.new("DivByZero")
12
- assert_equal("%DivByZero", nv2.to_llvm)
13
-
14
- nv3 = NamedValue.new("a.really.long.identifier")
15
- assert_equal("%a.really.long.identifier", nv3.to_llvm)
16
- end
17
-
18
- def test_02_NamedValue_invalid
19
- assert_raises(ArgumentError) {NamedValue.new("12")}
20
- assert_raises(ArgumentError) {NamedValue.new("%")}
21
- end
22
-
23
- def test_03_UnnamedValue_valid
24
- u1 = UnnamedValue.new(0)
25
- assert_equal("%0", u1.to_llvm)
26
-
27
- u2 = UnnamedValue.new(12)
28
- assert_equal("%12", u2.to_llvm)
29
-
30
- u3 = UnnamedValue.new(2)
31
- assert_equal("%2", u3.to_llvm)
32
-
33
- u4 = UnnamedValue.new(44)
34
- assert_equal("%44", u4.to_llvm)
35
- end
36
-
37
- def test_04_UnnamedValue_invalid
38
- assert_raises(ArgumentError) {UnnamedValue.new(-1)}
39
- assert_raises(ArgumentError) {UnnamedValue.new(-18743)}
40
- end
41
- end
@@ -1,19 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/assembler/llvm/module'
4
- include Rockit::Assembler::LLVM
5
-
6
- class UTestLLVMInstructions < Test::Unit::TestCase
7
- # Hello world example module
8
- class TestModule1 < LLVM::Module
9
- LC0 = internal constant '[13 x sbyte]' c("hello world\0A")
10
-
11
- declare int "puts", [sbytep]
12
-
13
- defmethod("main", int, []) do
14
-
15
- end
16
- end
17
-
18
- def te
19
- end
@@ -1,44 +0,0 @@
1
- require 'test/unit'
2
-
3
- require 'rockit/prettyprint/box'
4
- include Rockit::PrettyPrint
5
-
6
- class UTestBox < Test::Unit::TestCase
7
- def setup
8
- @h = Box::H.new(1, "a")
9
- @h1 = Box::H.new(1, "a", "b")
10
- @h2 = Box::H.new(2, "a", "b")
11
- @h3 = Box::H.new(3, "a", "b", "c")
12
- @v = Box::V.new("a", "2 2", "c")
13
- @e = Box::Epsilon.new("x", " ", ":=")
14
- end
15
-
16
- def test_01_creation
17
- assert_kind_of(Box::H, @h)
18
- assert_equal(1, @h.num_spaces)
19
- assert_equal(["a"], @h.elements)
20
-
21
- assert_kind_of(Box::H, @h3)
22
- assert_equal(3, @h3.num_spaces)
23
- assert_equal(["a", "b", "c"], @h3.elements)
24
-
25
- assert_kind_of(Box::V, @v)
26
- assert_equal(["a", "2 2", "c"], @v.elements)
27
-
28
- assert_kind_of(Box::Epsilon, @e)
29
- end
30
-
31
- def test_02_render
32
- assert_equal("a", @h.render)
33
- assert_equal("a b", @h1.render)
34
- assert_equal("a b", @h2.render)
35
- assert_equal("a b c", @h3.render)
36
- assert_equal("a\n2 2\nc", @v.render)
37
- assert_equal("x :=", @e.render)
38
- end
39
-
40
- def test_03_prepend
41
- p = Box::Prepend["#", "A comment"]
42
- assert_equal("# A comment", p.render)
43
- end
44
- end