/
test_grammar.rb
105 lines (95 loc) · 2.9 KB
/
test_grammar.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
require 'test/unit'
require 'racc/static'
require 'tempfile'
class TestGrammar < Test::Unit::TestCase
private def with_parser(rule)
parser = Racc::GrammarFileParser.new
result = parser.parse(<<"eom", "foo.y")
class MyParser
rule
#{rule}
end
---- header
require 'strscan'
---- inner
def parse(str)
@ss = StringScanner.new(str)
do_parse
end
def next_token
@ss.skip(/\\s+/)
token = @ss.scan(/\\S+/) and [token, token]
end
eom
states = Racc::States.new(result.grammar).nfa
params = result.params.dup
generator = Racc::ParserFileGenerator.new(states, params)
Tempfile.create(%w[y .tab.rb]) do |f|
generator.generate_parser_file(f.path)
require f.path
parser = MyParser.new
yield parser
end
Object.__send__(:remove_const, :MyParser)
end
def test_optional
with_parser("stmt: 'abc'?") do |parser|
assert_equal "abc", parser.parse("abc")
assert_equal nil, parser.parse("")
end
end
def test_many
with_parser("stmt: 'abc'*") do |parser|
assert_equal [], parser.parse("")
assert_equal ["abc"], parser.parse("abc")
assert_equal ["abc", "abc"], parser.parse("abc abc")
assert_equal ["abc", "abc", "abc"], parser.parse("abc abc abc")
end
end
def test_many1
with_parser("stmt: 'abc'+") do |parser|
assert_raise(Racc::ParseError){ parser.parse("") }
assert_equal ["abc"], parser.parse("abc")
assert_equal ["abc", "abc"], parser.parse("abc abc")
assert_equal ["abc", "abc", "abc"], parser.parse("abc abc abc")
end
end
def test_group
with_parser("stmt: ('a')") do |parser|
assert_raise(Racc::ParseError){ parser.parse("") }
assert_equal ["a"], parser.parse("a")
end
with_parser("stmt: ('a' 'b')") do |parser|
assert_raise(Racc::ParseError){ parser.parse("") }
assert_raise(Racc::ParseError){ parser.parse("a") }
assert_equal ["a", "b"], parser.parse("a b")
end
end
def test_group_or
with_parser("stmt: ('a' | 'b')") do |parser|
assert_raise(Racc::ParseError){ parser.parse("") }
assert_equal ["a"], parser.parse("a")
assert_equal ["b"], parser.parse("b")
end
end
def test_group_many
with_parser("stmt: ('a')*") do |parser|
assert_equal [], parser.parse("")
assert_equal [["a"]], parser.parse("a")
assert_equal [["a"], ["a"]], parser.parse("a a")
end
with_parser("start: stmt\n stmt: ('a' 'b')*") do |parser|
assert_equal [], parser.parse("")
assert_equal [["a", "b"]], parser.parse("a b")
assert_equal [["a", "b"], ["a", "b"]], parser.parse("a b a b")
end
end
def test_group_or_many
with_parser("stmt: ('a' | 'b')*") do |parser|
assert_equal [], parser.parse("")
assert_equal [["a"], ["a"]], parser.parse("a a")
assert_equal [["a"], ["b"]], parser.parse("a b")
assert_equal [["a"], ["b"], ["b"], ["a"]], parser.parse("a b b a")
end
end
end