kpeg 0.9.0 → 1.2.0
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.
- checksums.yaml +7 -0
- data/.hoeignore +12 -0
- data/Gemfile +2 -11
- data/History.txt +22 -1
- data/Manifest.txt +10 -3
- data/README.rdoc +40 -8
- data/Rakefile +12 -3
- data/bin/kpeg +9 -2
- data/examples/lua_string/lua_string.kpeg.rb +0 -2
- data/examples/tiny_markdown/Rakefile +3 -0
- data/examples/tiny_markdown/driver.rb +10 -0
- data/examples/tiny_markdown/node.rb +107 -0
- data/examples/tiny_markdown/sample.md +51 -0
- data/examples/tiny_markdown/tiny_markdown.kpeg +199 -0
- data/examples/tiny_markdown/tiny_markdown.kpeg.rb +3892 -0
- data/kpeg.gemspec +20 -20
- data/lib/hoe/kpeg.rb +6 -5
- data/lib/kpeg/code_generator.rb +81 -45
- data/lib/kpeg/compiled_parser.rb +32 -28
- data/lib/kpeg/format_parser.kpeg +22 -10
- data/lib/kpeg/format_parser.rb +94 -73
- data/lib/kpeg/grammar.rb +2 -2
- data/lib/kpeg/grammar_renderer.rb +14 -0
- data/lib/kpeg/position.rb +25 -8
- data/lib/kpeg/string_escape.kpeg +1 -0
- data/lib/kpeg/string_escape.rb +399 -13
- data/lib/kpeg.rb +1 -1
- data/test/test_kpeg.rb +1 -1
- data/test/test_kpeg_code_generator.rb +186 -14
- data/test/test_kpeg_compiled_parser.rb +1 -1
- data/test/test_kpeg_format.rb +25 -6
- data/test/{test_file_parser_roundtrip.rb → test_kpeg_format_parser_round_trip.rb} +1 -1
- data/test/{test_gen_calc.rb → test_kpeg_grammar.rb} +48 -5
- data/test/test_kpeg_grammar_renderer.rb +47 -6
- data/test/test_kpeg_string_escape.rb +42 -0
- metadata +90 -101
- data/.gemtest +0 -0
- data/test/test_left_recursion.rb +0 -50
data/test/test_kpeg_format.rb
CHANGED
@@ -5,7 +5,7 @@ require 'kpeg/grammar_renderer'
|
|
5
5
|
require 'stringio'
|
6
6
|
require 'rubygems'
|
7
7
|
|
8
|
-
class TestKPegFormat <
|
8
|
+
class TestKPegFormat < Minitest::Test
|
9
9
|
G = KPeg::Grammar.new
|
10
10
|
|
11
11
|
gram = File.read File.expand_path("../../lib/kpeg/format_parser.kpeg", __FILE__)
|
@@ -58,7 +58,7 @@ a = c
|
|
58
58
|
b(p) = x
|
59
59
|
STR
|
60
60
|
|
61
|
-
|
61
|
+
assert match(str) # HACK what is this testing?
|
62
62
|
end
|
63
63
|
|
64
64
|
def test_assign_with_multiple_args
|
@@ -157,9 +157,9 @@ b(p) = x
|
|
157
157
|
end
|
158
158
|
|
159
159
|
def test_regexp
|
160
|
-
assert_rule G.reg(
|
161
|
-
assert_rule G.reg(
|
162
|
-
assert_rule G.reg(
|
160
|
+
assert_rule G.reg('foo'), match('a=/foo/')
|
161
|
+
assert_rule G.reg('foo\\/bar'), match('a=/foo\/bar/')
|
162
|
+
assert_rule G.reg('[^"]'), match('a=/[^"]/')
|
163
163
|
end
|
164
164
|
|
165
165
|
def test_regexp_options
|
@@ -289,7 +289,7 @@ Value = NUMBER:i { i }
|
|
289
289
|
| ID:i !ASSIGN { vars[i] }
|
290
290
|
| OPEN Expr:i CLOSE { i }
|
291
291
|
STR
|
292
|
-
|
292
|
+
assert match(str) # HACK what is this testing?
|
293
293
|
end
|
294
294
|
|
295
295
|
def test_seq
|
@@ -431,6 +431,25 @@ a=b
|
|
431
431
|
assert_equal expected, m.directives
|
432
432
|
end
|
433
433
|
|
434
|
+
def test_parser_directive_single_quote
|
435
|
+
m = match <<-GRAMMAR
|
436
|
+
%% header {
|
437
|
+
# It's a bug I found
|
438
|
+
}
|
439
|
+
|
440
|
+
a=b
|
441
|
+
GRAMMAR
|
442
|
+
|
443
|
+
assert_rule G.ref("b"), m
|
444
|
+
|
445
|
+
expected = {
|
446
|
+
"header" => KPeg::Action.new("\n# It's a bug I found\n")
|
447
|
+
}
|
448
|
+
|
449
|
+
assert_equal expected, m.directives
|
450
|
+
end
|
451
|
+
|
452
|
+
|
434
453
|
def test_parser_setup
|
435
454
|
m = match "%% { def initialize; end }\na=b"
|
436
455
|
assert_rule G.ref("b"), m
|
@@ -5,7 +5,7 @@ require 'kpeg/grammar_renderer'
|
|
5
5
|
require 'kpeg/code_generator'
|
6
6
|
require 'stringio'
|
7
7
|
|
8
|
-
class
|
8
|
+
class TestKPegFormatParserRoundtrip < Minitest::Test
|
9
9
|
PATH = File.expand_path("../../lib/kpeg/format_parser.kpeg", __FILE__)
|
10
10
|
def test_roundtrip
|
11
11
|
data = File.read(PATH)
|
@@ -4,8 +4,52 @@ require 'kpeg/format_parser'
|
|
4
4
|
require 'kpeg/code_generator'
|
5
5
|
require 'stringio'
|
6
6
|
|
7
|
-
class
|
8
|
-
|
7
|
+
class TestKpegGrammar < Minitest::Test
|
8
|
+
LEFT_RECURSION = <<-'STR'
|
9
|
+
|
10
|
+
name = name:n "[]" { [:array, n] }
|
11
|
+
| < /\w+/ > { [:word, text] }
|
12
|
+
|
13
|
+
root = name
|
14
|
+
|
15
|
+
STR
|
16
|
+
|
17
|
+
def test_left_recursion_invoke_rule_directly
|
18
|
+
parc = KPeg::FormatParser.new(LEFT_RECURSION)
|
19
|
+
assert parc.parse, "Unable to parse"
|
20
|
+
|
21
|
+
gram = parc.grammar
|
22
|
+
|
23
|
+
# gr = KPeg::GrammarRenderer.new(gram)
|
24
|
+
# puts
|
25
|
+
# gr.render(STDOUT)
|
26
|
+
|
27
|
+
cg = KPeg::CodeGenerator.new "TestCalc", gram
|
28
|
+
|
29
|
+
code = cg.make("blah[]")
|
30
|
+
assert_equal true, code.parse("name")
|
31
|
+
assert_equal [:array, [:word, "blah"]], code.result
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_left_recursion_invoke_rule_via_another
|
35
|
+
parc = KPeg::FormatParser.new(LEFT_RECURSION)
|
36
|
+
assert parc.parse, "Unable to parse"
|
37
|
+
|
38
|
+
gram = parc.grammar
|
39
|
+
|
40
|
+
# gr = KPeg::GrammarRenderer.new(gram)
|
41
|
+
# puts
|
42
|
+
# gr.render(STDOUT)
|
43
|
+
|
44
|
+
cg = KPeg::CodeGenerator.new "TestCalc", gram
|
45
|
+
|
46
|
+
code = cg.make("blah[]")
|
47
|
+
assert_equal true, code.parse("root")
|
48
|
+
assert_equal [:array, [:word, "blah"]], code.result
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_gen_calc
|
52
|
+
parc = KPeg::FormatParser.new(<<-'STR')
|
9
53
|
Stmt = - Expr:e EOL { @answers << e }
|
10
54
|
| ( !EOL . )* EOL { puts "error" }
|
11
55
|
|
@@ -41,9 +85,6 @@ EOL = ('\n' | '\r\n' | '\r' | ';') -
|
|
41
85
|
|
42
86
|
root = Stmt+
|
43
87
|
STR
|
44
|
-
|
45
|
-
def test_parse
|
46
|
-
parc = KPeg::FormatParser.new(GRAMMAR)
|
47
88
|
assert parc.parse, "Unable to parse"
|
48
89
|
|
49
90
|
gram = parc.grammar
|
@@ -60,4 +101,6 @@ root = Stmt+
|
|
60
101
|
assert_equal true, code.parse
|
61
102
|
assert_equal [7,56,119], code.instance_variable_get(:@answers)
|
62
103
|
end
|
104
|
+
|
63
105
|
end
|
106
|
+
|
@@ -3,7 +3,7 @@ require 'kpeg'
|
|
3
3
|
require 'kpeg/grammar_renderer'
|
4
4
|
require 'stringio'
|
5
5
|
|
6
|
-
class TestKPegGrammarRenderer <
|
6
|
+
class TestKPegGrammarRenderer < Minitest::Test
|
7
7
|
def test_escape
|
8
8
|
str = "hello\nbob"
|
9
9
|
assert_equal 'hello\nbob', KPeg::GrammarRenderer.escape(str)
|
@@ -115,8 +115,6 @@ class TestKPegGrammarRenderer < MiniTest::Unit::TestCase
|
|
115
115
|
g.root = g.term
|
116
116
|
end
|
117
117
|
|
118
|
-
m = KPeg.match "4*3-8/9", gram
|
119
|
-
|
120
118
|
io = StringIO.new
|
121
119
|
gr = KPeg::GrammarRenderer.new(gram)
|
122
120
|
gr.render(io)
|
@@ -151,8 +149,6 @@ root = term
|
|
151
149
|
g.root = g.term
|
152
150
|
end
|
153
151
|
|
154
|
-
m = KPeg.match "4*3-8/9", gram
|
155
|
-
|
156
152
|
io = StringIO.new
|
157
153
|
gr = KPeg::GrammarRenderer.new(gram)
|
158
154
|
gr.render(io)
|
@@ -203,6 +199,31 @@ root = < [a-z]+ >
|
|
203
199
|
assert_equal expected, io.string
|
204
200
|
end
|
205
201
|
|
202
|
+
def test_directives
|
203
|
+
gram = KPeg.grammar do |g|
|
204
|
+
g.root = g.dot
|
205
|
+
g.add_directive "header", g.action("\n# coding: UTF-8\n")
|
206
|
+
g.add_directive "footer", g.action("\nrequire 'something'\n")
|
207
|
+
end
|
208
|
+
|
209
|
+
io = StringIO.new
|
210
|
+
gr = KPeg::GrammarRenderer.new(gram)
|
211
|
+
gr.render(io)
|
212
|
+
|
213
|
+
expected = <<-TXT
|
214
|
+
%% footer {
|
215
|
+
require 'something'
|
216
|
+
}
|
217
|
+
|
218
|
+
%% header {
|
219
|
+
# coding: UTF-8
|
220
|
+
}
|
221
|
+
|
222
|
+
root = .
|
223
|
+
TXT
|
224
|
+
assert_equal expected, io.string
|
225
|
+
end
|
226
|
+
|
206
227
|
def test_setup_actions
|
207
228
|
gram = KPeg.grammar do |g|
|
208
229
|
g.root = g.dot
|
@@ -220,7 +241,27 @@ root = .
|
|
220
241
|
TXT
|
221
242
|
assert_equal expected, io.string
|
222
243
|
end
|
223
|
-
|
244
|
+
|
245
|
+
def test_variables
|
246
|
+
gram = KPeg.grammar do |g|
|
247
|
+
g.root = g.dot
|
248
|
+
g.set_variable "name", "Foo"
|
249
|
+
g.set_variable "custom_initialize", "true"
|
250
|
+
end
|
251
|
+
|
252
|
+
io = StringIO.new
|
253
|
+
gr = KPeg::GrammarRenderer.new(gram)
|
254
|
+
gr.render(io)
|
255
|
+
|
256
|
+
expected = <<-TXT
|
257
|
+
%% custom_initialize = true
|
258
|
+
%% name = Foo
|
259
|
+
|
260
|
+
root = .
|
261
|
+
TXT
|
262
|
+
assert_equal expected, io.string
|
263
|
+
end
|
264
|
+
|
224
265
|
def test_multiple_render
|
225
266
|
gram = KPeg.grammar do |g|
|
226
267
|
g.root = g.multiple("a", 3, 5)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'kpeg'
|
3
|
+
require 'kpeg/string_escape'
|
4
|
+
|
5
|
+
class TestKPegStringEscape < Minitest::Test
|
6
|
+
|
7
|
+
def test_bell
|
8
|
+
assert_equal '\b', parse("\b")
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_carriage_return
|
12
|
+
assert_equal '\r', parse("\r")
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_newline
|
16
|
+
assert_equal '\n', parse("\n")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_quote
|
20
|
+
assert_equal '\\\\\"', parse('\\"')
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_slash
|
24
|
+
assert_equal '\\\\', parse('\\')
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_tab
|
28
|
+
assert_equal '\t', parse("\t")
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse(str, embed = false)
|
32
|
+
se = KPeg::StringEscape.new(str)
|
33
|
+
|
34
|
+
rule = (embed ? 'embed' : nil)
|
35
|
+
|
36
|
+
se.raise_error unless se.parse(rule)
|
37
|
+
|
38
|
+
se.text
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
metadata
CHANGED
@@ -1,87 +1,86 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: kpeg
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 0
|
10
|
-
version: 0.9.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Evan Phoenix
|
14
|
-
autorequire:
|
8
|
+
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2021-10-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.14'
|
20
|
+
type: :development
|
22
21
|
prerelease: false
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
26
31
|
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
- 3
|
33
|
-
version: 2.11.3
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '7'
|
34
37
|
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rdoc
|
38
38
|
prerelease: false
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
version: "3.10"
|
49
|
-
type: :development
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '4.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '7'
|
47
|
+
- !ruby/object:Gem::Dependency
|
52
48
|
name: hoe
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
hash: 27
|
60
|
-
segments:
|
61
|
-
- 2
|
62
|
-
- 12
|
63
|
-
version: "2.12"
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3.23'
|
64
54
|
type: :development
|
65
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3.23'
|
66
61
|
description: |-
|
67
62
|
KPeg is a simple PEG library for Ruby. It provides an API as well as native
|
68
63
|
grammar to build the grammar.
|
69
|
-
|
64
|
+
|
70
65
|
KPeg strives to provide a simple, powerful API without being too exotic.
|
71
|
-
|
66
|
+
|
72
67
|
KPeg supports direct left recursion of rules via the
|
73
68
|
{OMeta memoization}[http://www.vpri.org/pdf/tr2008003_experimenting.pdf] trick.
|
74
|
-
email:
|
69
|
+
email:
|
75
70
|
- evan@fallingsnow.net
|
76
|
-
executables:
|
71
|
+
executables:
|
77
72
|
- kpeg
|
78
73
|
extensions: []
|
79
|
-
|
80
|
-
extra_rdoc_files:
|
74
|
+
extra_rdoc_files:
|
81
75
|
- History.txt
|
82
76
|
- Manifest.txt
|
83
|
-
|
84
|
-
- .
|
77
|
+
- README.rdoc
|
78
|
+
- examples/phone_number/README.md
|
79
|
+
- examples/tiny_markdown/sample.md
|
80
|
+
- examples/upper/README.md
|
81
|
+
files:
|
82
|
+
- ".autotest"
|
83
|
+
- ".hoeignore"
|
85
84
|
- Gemfile
|
86
85
|
- History.txt
|
87
86
|
- LICENSE
|
@@ -100,6 +99,12 @@ files:
|
|
100
99
|
- examples/phone_number/README.md
|
101
100
|
- examples/phone_number/phone_number.kpeg
|
102
101
|
- examples/phone_number/phone_number.rb
|
102
|
+
- examples/tiny_markdown/Rakefile
|
103
|
+
- examples/tiny_markdown/driver.rb
|
104
|
+
- examples/tiny_markdown/node.rb
|
105
|
+
- examples/tiny_markdown/sample.md
|
106
|
+
- examples/tiny_markdown/tiny_markdown.kpeg
|
107
|
+
- examples/tiny_markdown/tiny_markdown.kpeg.rb
|
103
108
|
- examples/upper/README.md
|
104
109
|
- examples/upper/upper.kpeg
|
105
110
|
- examples/upper/upper.rb
|
@@ -118,57 +123,41 @@ files:
|
|
118
123
|
- lib/kpeg/string_escape.kpeg
|
119
124
|
- lib/kpeg/string_escape.rb
|
120
125
|
- test/inputs/comments.kpeg
|
121
|
-
- test/test_file_parser_roundtrip.rb
|
122
|
-
- test/test_gen_calc.rb
|
123
126
|
- test/test_kpeg.rb
|
124
127
|
- test/test_kpeg_code_generator.rb
|
125
128
|
- test/test_kpeg_compiled_parser.rb
|
126
129
|
- test/test_kpeg_format.rb
|
130
|
+
- test/test_kpeg_format_parser_round_trip.rb
|
131
|
+
- test/test_kpeg_grammar.rb
|
127
132
|
- test/test_kpeg_grammar_renderer.rb
|
128
|
-
- test/
|
133
|
+
- test/test_kpeg_string_escape.rb
|
129
134
|
- vim/syntax_kpeg/ftdetect/kpeg.vim
|
130
135
|
- vim/syntax_kpeg/syntax/kpeg.vim
|
131
|
-
- .gemtest
|
132
136
|
homepage: https://github.com/evanphx/kpeg
|
133
|
-
licenses:
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
137
|
+
licenses:
|
138
|
+
- MIT
|
139
|
+
metadata:
|
140
|
+
homepage_uri: https://github.com/evanphx/kpeg
|
141
|
+
bug_tracker_uri: https://github.com/evanphx/kpeg/issues
|
142
|
+
post_install_message:
|
143
|
+
rdoc_options:
|
144
|
+
- "--main"
|
138
145
|
- README.rdoc
|
139
|
-
require_paths:
|
146
|
+
require_paths:
|
140
147
|
- lib
|
141
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
-
|
143
|
-
requirements:
|
148
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
144
150
|
- - ">="
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
version: "0"
|
150
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
-
none: false
|
152
|
-
requirements:
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
153
155
|
- - ">="
|
154
|
-
- !ruby/object:Gem::Version
|
155
|
-
|
156
|
-
segments:
|
157
|
-
- 0
|
158
|
-
version: "0"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
159
158
|
requirements: []
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
signing_key:
|
164
|
-
specification_version: 3
|
159
|
+
rubygems_version: 3.2.15
|
160
|
+
signing_key:
|
161
|
+
specification_version: 4
|
165
162
|
summary: KPeg is a simple PEG library for Ruby
|
166
|
-
test_files:
|
167
|
-
- test/test_file_parser_roundtrip.rb
|
168
|
-
- test/test_gen_calc.rb
|
169
|
-
- test/test_kpeg.rb
|
170
|
-
- test/test_kpeg_code_generator.rb
|
171
|
-
- test/test_kpeg_compiled_parser.rb
|
172
|
-
- test/test_kpeg_format.rb
|
173
|
-
- test/test_kpeg_grammar_renderer.rb
|
174
|
-
- test/test_left_recursion.rb
|
163
|
+
test_files: []
|
data/.gemtest
DELETED
File without changes
|
data/test/test_left_recursion.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'kpeg'
|
3
|
-
require 'kpeg/format_parser'
|
4
|
-
require 'kpeg/code_generator'
|
5
|
-
require 'stringio'
|
6
|
-
|
7
|
-
class TestKPegLeftRecursion < MiniTest::Unit::TestCase
|
8
|
-
GRAMMAR = <<-'STR'
|
9
|
-
|
10
|
-
name = name:n "[]" { [:array, n] }
|
11
|
-
| < /\w+/ > { [:word, text] }
|
12
|
-
|
13
|
-
root = name
|
14
|
-
|
15
|
-
STR
|
16
|
-
|
17
|
-
def test_invoke_rule_directly
|
18
|
-
parc = KPeg::FormatParser.new(GRAMMAR)
|
19
|
-
assert parc.parse, "Unable to parse"
|
20
|
-
|
21
|
-
gram = parc.grammar
|
22
|
-
|
23
|
-
# gr = KPeg::GrammarRenderer.new(gram)
|
24
|
-
# puts
|
25
|
-
# gr.render(STDOUT)
|
26
|
-
|
27
|
-
cg = KPeg::CodeGenerator.new "TestCalc", gram
|
28
|
-
|
29
|
-
code = cg.make("blah[]")
|
30
|
-
assert_equal true, code.parse("name")
|
31
|
-
assert_equal [:array, [:word, "blah"]], code.result
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_invoke_rule_via_another
|
35
|
-
parc = KPeg::FormatParser.new(GRAMMAR)
|
36
|
-
assert parc.parse, "Unable to parse"
|
37
|
-
|
38
|
-
gram = parc.grammar
|
39
|
-
|
40
|
-
# gr = KPeg::GrammarRenderer.new(gram)
|
41
|
-
# puts
|
42
|
-
# gr.render(STDOUT)
|
43
|
-
|
44
|
-
cg = KPeg::CodeGenerator.new "TestCalc", gram
|
45
|
-
|
46
|
-
code = cg.make("blah[]")
|
47
|
-
assert_equal true, code.parse("root")
|
48
|
-
assert_equal [:array, [:word, "blah"]], code.result
|
49
|
-
end
|
50
|
-
end
|