-
Notifications
You must be signed in to change notification settings - Fork 37
/
test_left_recursion.rb
50 lines (36 loc) · 1.09 KB
/
test_left_recursion.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
require 'minitest/autorun'
require 'kpeg'
require 'kpeg/format_parser'
require 'kpeg/code_generator'
require 'stringio'
class TestKPegLeftRecursion < MiniTest::Unit::TestCase
GRAMMAR = <<-'STR'
name = name:n "[]" { [:array, n] }
| < /\w+/ > { [:word, text] }
root = name
STR
def test_invoke_rule_directly
parc = KPeg::FormatParser.new(GRAMMAR)
assert parc.parse, "Unable to parse"
gram = parc.grammar
# gr = KPeg::GrammarRenderer.new(gram)
# puts
# gr.render(STDOUT)
cg = KPeg::CodeGenerator.new "TestCalc", gram
code = cg.make("blah[]")
assert_equal true, code.parse("name")
assert_equal [:array, [:word, "blah"]], code.result
end
def test_invoke_rule_via_another
parc = KPeg::FormatParser.new(GRAMMAR)
assert parc.parse, "Unable to parse"
gram = parc.grammar
# gr = KPeg::GrammarRenderer.new(gram)
# puts
# gr.render(STDOUT)
cg = KPeg::CodeGenerator.new "TestCalc", gram
code = cg.make("blah[]")
assert_equal true, code.parse("root")
assert_equal [:array, [:word, "blah"]], code.result
end
end