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,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