rockit 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +24 -160
- data/TODO +17 -17
- data/VERSION +1 -1
- data/doc/rockit_paper.pdf +0 -0
- data/lib/packrat/grammar.rb +139 -84
- data/rakefile +27 -9
- data/tests/acceptance/packrat/java/atest_java.rb +37 -0
- data/tests/acceptance/packrat/java/java.rb +136 -0
- data/tests/acceptance/packrat/java/t.rb +10 -0
- data/tests/acceptance/packrat/java/todo +10 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/Java.rats +446 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/JavaConstant.rats +111 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/JavaCore.rats +508 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/JavaIdentifier.rats +62 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/JavaSymbol.rats +38 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/JavaTree.rats +40 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/JavaType.rats +61 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/Spacing.rats +36 -0
- data/tests/acceptance/packrat/java/xtc.lang.java/Symbol.rats +77 -0
- data/tests/acceptance/packrat/minibasic/README +13 -0
- data/tests/acceptance/packrat/minibasic/atest_minibasic.rb +151 -13
- data/tests/acceptance/packrat/minibasic/minibasic.rb +94 -76
- data/tests/acceptance/packrat/minibasic/mult3.basic +6 -0
- data/tests/acceptance/packrat/minibasic/sumeven.basic +19 -0
- data/tests/unit/packrat/test_ast.rb +116 -0
- data/tests/unit/packrat/test_interpreting_parser.rb +15 -55
- metadata +22 -59
- data/lib/rockit/prettyprint/box.rb +0 -60
- data/lib/rockit/prettyprint/renderer.rb +0 -41
- data/lib/rockit/prettyprint/text_renderer.rb +0 -47
- data/lib/rockit/tree/base.rb +0 -223
- data/lib/rockit/tree/enter_leave_visitor.rb +0 -12
- data/lib/rockit/tree/graphviz.rb +0 -69
- data/lib/rockit/tree/visitor.rb +0 -12
- data/lib/util/array_alternatives.rb +0 -20
- data/lib/util/enter_leave_visitor.rb +0 -69
- data/lib/util/graphviz_dot.rb +0 -182
- data/lib/util/string_location.rb +0 -42
- data/lib/util/visitor.rb +0 -49
- data/lib/util/visitor_combinators.rb +0 -14
- data/tests/acceptance/rockit/dparser/atest_any_operator.rb +0 -33
- data/tests/acceptance/rockit/dparser/atest_arithmetic_grammar.rb +0 -30
- data/tests/acceptance/rockit/dparser/atest_list_operator.rb +0 -57
- data/tests/acceptance/rockit/dparser/atest_mult_operator.rb +0 -60
- data/tests/acceptance/rockit/dparser/atest_operator_grammar.rb +0 -61
- data/tests/acceptance/rockit/dparser/atest_plus_operator.rb +0 -55
- data/tests/acceptance/rockit/dparser/atest_samples_calculator.rb +0 -14
- data/tests/acceptance/rockit/dparser/atest_samples_minibasic.rb +0 -20
- data/tests/acceptance/rockit/dparser/atest_samples_multifunccalculator.rb +0 -36
- data/tests/acceptance/rockit/dparser/atest_simple_grammar.rb +0 -34
- data/tests/acceptance/rockit/dparser/atest_speculative_code_action.rb +0 -128
- data/tests/acceptance/rockit/dparser/calc_tests_common.rb +0 -103
- data/tests/unit/parse/utest_ebnf_grammar.rb +0 -50
- data/tests/unit/parse/utest_expand_grammar.rb +0 -23
- data/tests/unit/parse/utest_grammar.rb +0 -160
- data/tests/unit/rockit/assembler/llvm/utest_instructions.rb +0 -41
- data/tests/unit/rockit/assembler/llvm/utest_module.rb +0 -19
- data/tests/unit/rockit/prettyprint/utest_box.rb +0 -44
- data/tests/unit/rockit/tree/utest_tree_base.rb +0 -301
- data/tests/unit/rockit/tree/utest_tree_enter_leave_visitor.rb +0 -69
- data/tests/unit/rockit/tree/utest_tree_visitor.rb +0 -63
- data/tests/unit/rockit/utest_grammar.rb +0 -145
- data/tests/unit/rockit/utest_grammar_symbol.rb +0 -11
- data/tests/unit/rockit/utest_maybe_operator.rb +0 -12
- data/tests/unit/rockit/utest_regexp_terminal.rb +0 -45
- data/tests/unit/rockit/utest_repetition_operators.rb +0 -35
- data/tests/unit/rockit/utest_rule.rb +0 -23
- data/tests/unit/rockit/utest_string_terminal.rb +0 -40
- data/tests/unit/util/utest_array_alternatives.rb +0 -23
- data/tests/unit/util/utest_enter_leave_visitor.rb +0 -89
- data/tests/unit/util/utest_string_location.rb +0 -42
- data/tests/unit/util/utest_visitor.rb +0 -92
- data/tests/unit/util/utest_visitor_combinators.rb +0 -64
@@ -34,52 +34,6 @@
|
|
34
34
|
require 'packrat/grammar'
|
35
35
|
|
36
36
|
module MiniBasic
|
37
|
-
class Interpreter
|
38
|
-
def initialize
|
39
|
-
# For variables and their values. Default value is 0.
|
40
|
-
@vars = Hash.new(0)
|
41
|
-
end
|
42
|
-
|
43
|
-
def eval(sexpr)
|
44
|
-
case sexpr.first
|
45
|
-
when :Statements
|
46
|
-
sexpr.statements.each {|stmt| mb_eval(stmt)}
|
47
|
-
when "If"
|
48
|
-
if mb_eval(sexpr.condition) # What is true and false in basic?
|
49
|
-
mb_eval(sexpr.statements)
|
50
|
-
elsif sexpr.optelse
|
51
|
-
mb_eval(sexpr.optelse[2])
|
52
|
-
end
|
53
|
-
when "For"
|
54
|
-
for i in (mb_eval(sexpr.from)..mb_eval(sexpr.to))
|
55
|
-
$vars[sexpr.ident.id] = i
|
56
|
-
mb_eval(sexpr.statements)
|
57
|
-
end
|
58
|
-
when "Read"
|
59
|
-
print "? "; STDOUT.flush
|
60
|
-
$vars[sexpr.ident.id] = STDIN.gets.to_i # Error catching?!
|
61
|
-
when "Print"
|
62
|
-
print mb_eval(sexpr.message); STDOUT.flush
|
63
|
-
when "PrintLn"
|
64
|
-
print "\n"; STDOUT.flush
|
65
|
-
when "Assignment"
|
66
|
-
$vars[sexpr.ident.id] = mb_eval(sexpr.expression)
|
67
|
-
when "Condition"
|
68
|
-
map = {">" => :>, "<" => :<, "=" => :==}
|
69
|
-
mb_eval(sexpr.left).send(map[sexpr.op], mb_eval(sexpr.right))
|
70
|
-
when "BinExpr"
|
71
|
-
map = {"+"=>:+, "-"=>:-, "*"=>:*, "/"=>"/".intern, "MOD"=>"%".intern }
|
72
|
-
mb_eval(sexpr.left).send(map[sexpr.op], mb_eval(sexpr.right))
|
73
|
-
when "String"
|
74
|
-
sexpr.value[1..-2] # Skip leading and trailing double quotes
|
75
|
-
when "Identifier"
|
76
|
-
$vars[sexpr.id]
|
77
|
-
when "Number"
|
78
|
-
sexpr.lexeme.to_i
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
37
|
Grammar = Packrat::Grammar.new do
|
84
38
|
start_symbol :Program
|
85
39
|
|
@@ -87,51 +41,115 @@ module MiniBasic
|
|
87
41
|
S = hidden(/\s*/)
|
88
42
|
FS = hidden(/\s\s*/)
|
89
43
|
|
90
|
-
prod :Program, [S, :Statements, eos(), lift(
|
44
|
+
prod :Program, [S, :Statements, eos(), lift(1)]
|
91
45
|
|
92
46
|
prod :Statements, [plus(:Statement), lift(0)]
|
93
47
|
|
94
|
-
rule :Statement,
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
48
|
+
rule( :Statement,
|
49
|
+
['IF', FS, :Condition, FS, 'THEN', FS,
|
50
|
+
:Statements, S,
|
51
|
+
maybe(:OptElse), S,
|
52
|
+
'ENDIF', S, ast(:If)],
|
99
53
|
|
100
|
-
|
101
|
-
|
102
|
-
|
54
|
+
['FOR', FS, :Identifier, S, ':=', S, :Expr, FS, 'TO', FS, :Expr, S,
|
55
|
+
:Statements, S,
|
56
|
+
'NEXT', S, ast(:For, :expr1 => :from, :expr2 => :to)],
|
103
57
|
|
104
|
-
|
58
|
+
['READ', FS, :Identifier, S, ast(:Read)],
|
105
59
|
|
106
|
-
|
60
|
+
['PRINTLN', S, ast(:PrintLn)],
|
107
61
|
|
108
|
-
|
62
|
+
['PRINT', FS, any(:Expr, :String), S, ast(:Print)],
|
109
63
|
|
110
|
-
|
111
|
-
|
64
|
+
[:Identifier, S, ':=', S, :Expr, S, ast(:Assign)]
|
65
|
+
)
|
112
66
|
|
113
|
-
prod :OptElse, ['ELSE', FS, :Statements, lift(
|
67
|
+
prod :OptElse, ['ELSE', FS, :Statements, lift(2)]
|
114
68
|
|
115
|
-
prod :Condition, [:Expr, S, any('<', '>', '='), S, :Expr,
|
69
|
+
prod :Condition, [:Expr, S, any('<', '>', '='), S, :Expr,
|
70
|
+
ast(:Cond, :expr1 => :left, :expr2 => :right)]
|
116
71
|
|
117
72
|
# This is crude! No precedence levels or handling of associativity.
|
118
|
-
rule :Expr,
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
prod :String, [/
|
73
|
+
rule( :Expr,
|
74
|
+
[:BaseExpr, S, any('+', '-', '*', '/', 'MOD'), S, :BaseExpr,
|
75
|
+
ast(:BinExpr, :base_expr1 => :left, :base_expr2 => :right)],
|
76
|
+
[:BaseExpr, lift(0)]
|
77
|
+
)
|
78
|
+
|
79
|
+
rule( :BaseExpr,
|
80
|
+
[:Number, lift(0)],
|
81
|
+
[:Identifier, lift(0)],
|
82
|
+
[:String, lift(0)],
|
83
|
+
['(', S, :Expr, S, ')', lift(2)]
|
84
|
+
)
|
85
|
+
|
86
|
+
prod :String, ['"', /[^"]*/, '"', lift(1)] #"
|
132
87
|
prod :Identifier, [/[A-Z]([A-Z0-9])*/, lift(0) {|r| r.intern}]
|
133
88
|
prod :Number, [/[0-9]+/, lift(0) {|r| r.to_i}]
|
134
89
|
end
|
135
90
|
|
136
91
|
Parser = Grammar.interpreting_parser
|
92
|
+
|
93
|
+
class Interpreter
|
94
|
+
attr_reader :vars
|
95
|
+
|
96
|
+
def initialize(options = {})
|
97
|
+
# For variables and their values. Default value is 0.
|
98
|
+
@vars = Hash.new(0)
|
99
|
+
@stdout = options[:stdout] || STDOUT
|
100
|
+
@stdin = options[:stdin] || STDIN
|
101
|
+
end
|
102
|
+
|
103
|
+
include MiniBasic::Grammar::ASTs
|
104
|
+
|
105
|
+
def interpret_program(str)
|
106
|
+
ast = MiniBasic::Parser.parse_string(str)
|
107
|
+
interpret(ast)
|
108
|
+
end
|
109
|
+
|
110
|
+
def interpret(ast)
|
111
|
+
case ast
|
112
|
+
when Array
|
113
|
+
ast.each {|stmt| interpret(stmt)}
|
114
|
+
when If
|
115
|
+
if interpret(ast.condition) # What is true and false in basic?
|
116
|
+
interpret(ast.statements)
|
117
|
+
elsif ast[4]
|
118
|
+
interpret(ast[4])
|
119
|
+
end
|
120
|
+
when For
|
121
|
+
for i in (interpret(ast.from)..interpret(ast.to))
|
122
|
+
@vars[ast.identifier] = i
|
123
|
+
interpret(ast.statements)
|
124
|
+
end
|
125
|
+
when Read
|
126
|
+
@stdout.print "? "
|
127
|
+
@stdout.flush
|
128
|
+
@vars[ast.identifier] = @stdin.gets.to_i # Error catching?!
|
129
|
+
when Print
|
130
|
+
@stdout.print(interpret(ast[1]).to_s)
|
131
|
+
@stdout.flush
|
132
|
+
when PrintLn
|
133
|
+
@stdout.print "\n"
|
134
|
+
@stdout.flush
|
135
|
+
when Assign
|
136
|
+
@vars[ast.identifier] = interpret(ast.expr)
|
137
|
+
when Cond
|
138
|
+
map = {">" => :>, "<" => :<, "=" => :==}
|
139
|
+
interpret(ast.left).send(map[ast[1]], interpret(ast.right))
|
140
|
+
when BinExpr
|
141
|
+
map = {"+"=>:+, "-"=>:-, "*"=>:*, "/"=>"/".intern, "MOD"=>"%".intern }
|
142
|
+
interpret(ast.left).send(map[ast[1]], interpret(ast.right))
|
143
|
+
when Symbol
|
144
|
+
@vars[ast]
|
145
|
+
else
|
146
|
+
ast # Return the value itself
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
if $0 == __FILE__
|
153
|
+
prg = File.open(ARGV[0]) {|fh| fh.read}
|
154
|
+
MiniBasic::Interpreter.new.interpret_program(prg)
|
137
155
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
PRINT "I can sum even numbers."
|
2
|
+
PRINTLN
|
3
|
+
PRINT "At what number should I start summing"
|
4
|
+
READ START
|
5
|
+
PRINT "At what number should I stop"
|
6
|
+
READ STOP
|
7
|
+
SUM := 0
|
8
|
+
FOR I := START TO STOP
|
9
|
+
IF (I MOD 2) = 0 THEN
|
10
|
+
SUM := (SUM + I)
|
11
|
+
ENDIF
|
12
|
+
NEXT
|
13
|
+
PRINT "The sum of all even numbers between (inclusive) "
|
14
|
+
PRINT START
|
15
|
+
PRINT " and "
|
16
|
+
PRINT STOP
|
17
|
+
PRINT " is = "
|
18
|
+
PRINT SUM
|
19
|
+
PRINTLN
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'packrat/grammar'
|
4
|
+
include Packrat
|
5
|
+
|
6
|
+
class TestAST < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@g1 = Packrat::Grammar.new do
|
9
|
+
start_symbol :s
|
10
|
+
|
11
|
+
s = hidden(/\s*/)
|
12
|
+
fs = hidden(/\s\s*/)
|
13
|
+
|
14
|
+
rule(:s,
|
15
|
+
["P", ast(:P)],
|
16
|
+
["S2a", :Num, :Num, ast(:S2a)],
|
17
|
+
["S2b", :Num, :Num, ast(:S2b, :num1 => :n1)],
|
18
|
+
["S2c", :Num, :Num, ast(:S2c, :num2 => :n2)],
|
19
|
+
["S2d", :Num, :Num, ast(:S2d, :num1 => :n1, :num2 => :n2)],
|
20
|
+
['FOR', fs, :Ident, s, ':=', s, :Expr, fs, 'TO', fs, :Expr, s,
|
21
|
+
:Statements, s,
|
22
|
+
'NEXT', s, ast(:For, :expr1 => :from, :expr2 => :to)],
|
23
|
+
[:Num, lift(0)],
|
24
|
+
[:Id, lift(0)]
|
25
|
+
)
|
26
|
+
|
27
|
+
prod :Num, [/\d{1,2}/, ast(:Num)]
|
28
|
+
prod :Id, ["ID", :Num, maybe("?"), ast(:Id)]
|
29
|
+
|
30
|
+
prod :Statements, [plus(:s), lift(0)]
|
31
|
+
prod :Ident, [/[A-Z]([A-Z0-9])*/, lift(0) {|r| r.intern}]
|
32
|
+
prod :Expr, [any(:Num, :Ident), lift(0)]
|
33
|
+
end
|
34
|
+
|
35
|
+
@ip = @g1.interpreting_parser
|
36
|
+
@mAst = @g1::ASTs
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_01_ast_module_and_classes_initialized_after_grammar_finalization
|
40
|
+
@g1.finalize!
|
41
|
+
|
42
|
+
assert(@g1.constants.include?("ASTs"))
|
43
|
+
assert_kind_of(Module, @mAst)
|
44
|
+
|
45
|
+
expected_ast_names = ["P", "Num", "Id", "For", "S2a", "S2b", "S2c", "S2d"]
|
46
|
+
assert_equal(expected_ast_names.sort, @mAst.constants.sort)
|
47
|
+
expected_ast_names.each do |exp_ast_name|
|
48
|
+
ast = @mAst.const_get(exp_ast_name)
|
49
|
+
assert(Packrat::AST, ast.superclass)
|
50
|
+
assert_kind_of(ast, ast[])
|
51
|
+
end
|
52
|
+
|
53
|
+
assert_equal(["P"], @mAst::P.sig)
|
54
|
+
assert_equal([nil], @mAst::Num.sig)
|
55
|
+
assert_equal(["ID", :num, nil], @mAst::Id.sig)
|
56
|
+
assert_equal(["S2a", :num1, :num2], @mAst::S2a.sig)
|
57
|
+
assert_equal(["S2b", :n1, :num2], @mAst::S2b.sig)
|
58
|
+
assert_equal(["S2c", :num1, :n2], @mAst::S2c.sig)
|
59
|
+
assert_equal(["S2d", :n1, :n2], @mAst::S2d.sig)
|
60
|
+
assert_equal(["FOR", :ident, ":=", :from, "TO", :to,
|
61
|
+
:statements, "NEXT"],
|
62
|
+
@mAst::For.sig)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_02_ast_parsing_no_nonconst_children
|
66
|
+
r = @ip.parse_string("P")
|
67
|
+
assert_equal(@mAst::P[], r)
|
68
|
+
assert_equal("P", r[0])
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_03_ast_parsing_single_nonconst_child
|
72
|
+
r = @ip.parse_string("1")
|
73
|
+
assert_equal(@mAst::Num["1"], r)
|
74
|
+
assert_equal("1", r[0])
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_04_ast_parsing_multi_mixed_children_default_naming
|
78
|
+
r = @ip.parse_string("ID10")
|
79
|
+
assert_equal('Id["ID", Num["10"], nil]', r.inspect)
|
80
|
+
assert_equal(@mAst::Id[@mAst::Num["10"]], r)
|
81
|
+
assert_equal(@mAst::Num["10"], r[1])
|
82
|
+
assert_equal("ID", r[0])
|
83
|
+
assert_equal("10", r[1][0])
|
84
|
+
assert_equal(nil, r[2])
|
85
|
+
assert_equal("10", r.num[0])
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_05_multi_mixed_overlapping_symbol_names
|
89
|
+
r = @ip.parse_string("S2a112")
|
90
|
+
assert_equal(@mAst::S2a[@mAst::Num["11"], @mAst::Num["2"]], r)
|
91
|
+
assert_equal(@mAst::Num["11"], r[1])
|
92
|
+
assert_equal(@mAst::Num["2"], r[2])
|
93
|
+
assert_equal(@mAst::Num["11"], r.num1)
|
94
|
+
assert_equal(@mAst::Num["2"], r.num2)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_06_multi_mixed_overlapping_symbol_names_with_override
|
98
|
+
r = @ip.parse_string("S2b1134")
|
99
|
+
assert_equal(@mAst::Num["11"], r.n1)
|
100
|
+
assert_equal(@mAst::Num["34"], r.num2)
|
101
|
+
|
102
|
+
r = @ip.parse_string("S2c1134")
|
103
|
+
assert_equal(@mAst::Num["11"], r.num1)
|
104
|
+
assert_equal(@mAst::Num["34"], r.n2)
|
105
|
+
|
106
|
+
r = @ip.parse_string("S2d7465")
|
107
|
+
assert_equal(@mAst::Num["74"], r.n1)
|
108
|
+
assert_equal(@mAst::Num["65"], r.n2)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_07_complex_ast_parsing
|
112
|
+
r = @ip.parse_string("FOR A := 1 TO 3 P NEXT")
|
113
|
+
assert_equal(@mAst::For[:A, @mAst::Num["1"], @mAst::Num["3"],
|
114
|
+
[@mAst::P[]]], r)
|
115
|
+
end
|
116
|
+
end
|
@@ -40,10 +40,10 @@ class TestInterpretingParser < Test::Unit::TestCase
|
|
40
40
|
def test_03_grammar_with_single_rule_with_multi_prods
|
41
41
|
g = Packrat::Grammar.new do
|
42
42
|
start_symbol :s
|
43
|
-
rule
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
rule(:s,
|
44
|
+
[/a+/, /b+/, /dc*/],
|
45
|
+
[/a+/, /d+/]
|
46
|
+
)
|
47
47
|
end
|
48
48
|
ip = g.interpreting_parser
|
49
49
|
|
@@ -60,10 +60,10 @@ class TestInterpretingParser < Test::Unit::TestCase
|
|
60
60
|
def test_04_grammar_with_single_rule_and_ref_to_one_external_prod
|
61
61
|
g = Packrat::Grammar.new do
|
62
62
|
start_symbol :s
|
63
|
-
rule :s,
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
rule( :s,
|
64
|
+
[:a, /b+/, /dc*/],
|
65
|
+
[:a, /d+/]
|
66
|
+
)
|
67
67
|
prod :a, [/a+/]
|
68
68
|
end
|
69
69
|
ip = g.interpreting_parser
|
@@ -81,13 +81,13 @@ class TestInterpretingParser < Test::Unit::TestCase
|
|
81
81
|
def test_05_grammar_with_multi_rules
|
82
82
|
g = Packrat::Grammar.new do
|
83
83
|
start_symbol :Constant
|
84
|
-
rule :Constant,
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
rule :DecimalInt, [
|
90
|
-
rule :HexInt, [
|
84
|
+
rule( :Constant,
|
85
|
+
[:DecimalInt],
|
86
|
+
[:HexInt],
|
87
|
+
[:OctalInt]
|
88
|
+
)
|
89
|
+
rule :DecimalInt, [/[1-9][0-9]*[uUlL]?/]
|
90
|
+
rule :HexInt, [/(0x|0X)[0-9a-fA-F]+[uUlL]?/]
|
91
91
|
prod :OctalInt, [/0[0-7]*[uUlL]?/]
|
92
92
|
end
|
93
93
|
ip = g.interpreting_parser
|
@@ -253,44 +253,4 @@ class TestInterpretingParser < Test::Unit::TestCase
|
|
253
253
|
r = ip.parse_string("7/18")
|
254
254
|
assert_equal([:s, "7", "/", "18"], r)
|
255
255
|
end
|
256
|
-
|
257
|
-
def test_14_ast
|
258
|
-
g = Packrat::Grammar.new do
|
259
|
-
start_symbol :s
|
260
|
-
rule :s, [
|
261
|
-
[:Num, lift(0)],
|
262
|
-
[:Id, lift(0)],
|
263
|
-
]
|
264
|
-
prod :Num, [/\d+/, ast(:Num)]
|
265
|
-
prod :Id, ["ID", :Num, maybe("?"), ast(:Id)]
|
266
|
-
end
|
267
|
-
ip = g.interpreting_parser
|
268
|
-
|
269
|
-
mAst = g::ASTs
|
270
|
-
assert_kind_of(Module, mAst)
|
271
|
-
|
272
|
-
r = ip.parse_string("1")
|
273
|
-
|
274
|
-
# The AST classes are added during the parse so now we can see
|
275
|
-
# that they are there.
|
276
|
-
assert_kind_of(Class, mAst.const_get("Num"))
|
277
|
-
assert(mAst::Num.ancestors.include?(Packrat::AST))
|
278
|
-
|
279
|
-
as = mAst::Num[]
|
280
|
-
assert_kind_of(mAst::Num, as)
|
281
|
-
|
282
|
-
assert_kind_of(Packrat::AST, r)
|
283
|
-
assert_equal('Num["1"]', r.inspect)
|
284
|
-
assert_equal("1", r[0])
|
285
|
-
|
286
|
-
r = ip.parse_string("ID10")
|
287
|
-
assert_kind_of(Class, mAst.const_get("Id"))
|
288
|
-
assert(mAst::Id.ancestors.include?(Packrat::AST))
|
289
|
-
assert_kind_of(Packrat::AST, r)
|
290
|
-
assert_equal('Id["ID", Num["10"], nil]', r.inspect)
|
291
|
-
assert_equal("ID", r[0])
|
292
|
-
assert_equal("10", r[1][0])
|
293
|
-
assert_equal(nil, r[2])
|
294
|
-
assert_equal("10", r.num[0])
|
295
|
-
end
|
296
256
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rockit
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
7
|
-
date: 2006-03-
|
6
|
+
version: 0.7.2
|
7
|
+
date: 2006-03-27 00:00:00 +02:00
|
8
8
|
summary: Rockit is the Ruby Object-oriented Compiler construction toolKIT
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,67 +35,30 @@ files:
|
|
35
35
|
- VERSION
|
36
36
|
- rakefile
|
37
37
|
- lib/packrat/grammar.rb
|
38
|
-
-
|
39
|
-
- lib/rockit/prettyprint/renderer.rb
|
40
|
-
- lib/rockit/prettyprint/box.rb
|
41
|
-
- lib/rockit/tree/visitor.rb
|
42
|
-
- lib/rockit/tree/base.rb
|
43
|
-
- lib/rockit/tree/graphviz.rb
|
44
|
-
- lib/rockit/tree/enter_leave_visitor.rb
|
45
|
-
- lib/util/array_alternatives.rb
|
46
|
-
- lib/util/string_location.rb
|
47
|
-
- lib/util/graphviz_dot.rb
|
48
|
-
- lib/util/visitor.rb
|
49
|
-
- lib/util/visitor_combinators.rb
|
50
|
-
- lib/util/enter_leave_visitor.rb
|
51
|
-
- tests/acceptance/rockit
|
52
|
-
- tests/acceptance/packrat
|
53
|
-
- tests/acceptance/rockit/dparser
|
54
|
-
- tests/acceptance/rockit/dparser/atest_speculative_code_action.rb
|
55
|
-
- tests/acceptance/rockit/dparser/atest_samples_calculator.rb
|
56
|
-
- tests/acceptance/rockit/dparser/atest_plus_operator.rb
|
57
|
-
- tests/acceptance/rockit/dparser/atest_arithmetic_grammar.rb
|
58
|
-
- tests/acceptance/rockit/dparser/atest_simple_grammar.rb
|
59
|
-
- tests/acceptance/rockit/dparser/atest_operator_grammar.rb
|
60
|
-
- tests/acceptance/rockit/dparser/atest_any_operator.rb
|
61
|
-
- tests/acceptance/rockit/dparser/atest_samples_minibasic.rb
|
62
|
-
- tests/acceptance/rockit/dparser/atest_list_operator.rb
|
63
|
-
- tests/acceptance/rockit/dparser/atest_samples_multifunccalculator.rb
|
64
|
-
- tests/acceptance/rockit/dparser/atest_mult_operator.rb
|
65
|
-
- tests/acceptance/rockit/dparser/calc_tests_common.rb
|
38
|
+
- doc/rockit_paper.pdf
|
66
39
|
- tests/acceptance/packrat/minibasic
|
40
|
+
- tests/acceptance/packrat/java
|
67
41
|
- tests/acceptance/packrat/minibasic/minibasic.rb
|
42
|
+
- tests/acceptance/packrat/minibasic/mult3.basic
|
68
43
|
- tests/acceptance/packrat/minibasic/atest_minibasic.rb
|
69
|
-
- tests/
|
70
|
-
- tests/
|
71
|
-
- tests/
|
72
|
-
- tests/
|
73
|
-
- tests/
|
74
|
-
- tests/
|
75
|
-
- tests/
|
76
|
-
- tests/
|
77
|
-
- tests/
|
78
|
-
- tests/
|
79
|
-
- tests/
|
80
|
-
- tests/
|
81
|
-
- tests/
|
82
|
-
- tests/
|
83
|
-
- tests/
|
84
|
-
- tests/
|
85
|
-
- tests/unit/rockit/tree/utest_tree_enter_leave_visitor.rb
|
86
|
-
- tests/unit/rockit/prettyprint/utest_box.rb
|
87
|
-
- tests/unit/rockit/assembler/llvm
|
88
|
-
- tests/unit/rockit/assembler/llvm/utest_instructions.rb
|
89
|
-
- tests/unit/rockit/assembler/llvm/utest_module.rb
|
90
|
-
- tests/unit/util/utest_array_alternatives.rb
|
91
|
-
- tests/unit/util/utest_string_location.rb
|
92
|
-
- tests/unit/util/utest_visitor.rb
|
93
|
-
- tests/unit/util/utest_visitor_combinators.rb
|
94
|
-
- tests/unit/util/utest_enter_leave_visitor.rb
|
95
|
-
- tests/unit/parse/utest_grammar.rb
|
96
|
-
- tests/unit/parse/utest_expand_grammar.rb
|
97
|
-
- tests/unit/parse/utest_ebnf_grammar.rb
|
44
|
+
- tests/acceptance/packrat/minibasic/README
|
45
|
+
- tests/acceptance/packrat/minibasic/sumeven.basic
|
46
|
+
- tests/acceptance/packrat/java/xtc.lang.java
|
47
|
+
- tests/acceptance/packrat/java/java.rb
|
48
|
+
- tests/acceptance/packrat/java/todo
|
49
|
+
- tests/acceptance/packrat/java/atest_java.rb
|
50
|
+
- tests/acceptance/packrat/java/t.rb
|
51
|
+
- tests/acceptance/packrat/java/xtc.lang.java/JavaConstant.rats
|
52
|
+
- tests/acceptance/packrat/java/xtc.lang.java/JavaCore.rats
|
53
|
+
- tests/acceptance/packrat/java/xtc.lang.java/JavaIdentifier.rats
|
54
|
+
- tests/acceptance/packrat/java/xtc.lang.java/Spacing.rats
|
55
|
+
- tests/acceptance/packrat/java/xtc.lang.java/Java.rats
|
56
|
+
- tests/acceptance/packrat/java/xtc.lang.java/JavaSymbol.rats
|
57
|
+
- tests/acceptance/packrat/java/xtc.lang.java/Symbol.rats
|
58
|
+
- tests/acceptance/packrat/java/xtc.lang.java/JavaTree.rats
|
59
|
+
- tests/acceptance/packrat/java/xtc.lang.java/JavaType.rats
|
98
60
|
- tests/unit/packrat/test_interpreting_parser.rb
|
61
|
+
- tests/unit/packrat/test_ast.rb
|
99
62
|
test_files: []
|
100
63
|
|
101
64
|
rdoc_options: []
|