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.
@@ -5,7 +5,7 @@ require 'kpeg/grammar_renderer'
5
5
  require 'stringio'
6
6
  require 'rubygems'
7
7
 
8
- class TestKPegFormat < MiniTest::Unit::TestCase
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
- gram = match(str)
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(/foo/), match('a=/foo/')
161
- assert_rule G.reg(/foo\/bar/), match('a=/foo\/bar/')
162
- assert_rule G.reg(/[^"]/), match('a=/[^"]/')
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
- m = match(str)
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 TestKPegRoundtrip < MiniTest::Unit::TestCase
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 TestKPegCodeGenerator < MiniTest::Unit::TestCase
8
- GRAMMAR = <<-'STR'
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 < MiniTest::Unit::TestCase
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
- hash: 59
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
- date: 2012-03-07 00:00:00 Z
19
- dependencies:
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
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
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
- hash: 37
29
- segments:
30
- - 2
31
- - 11
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
- requirement: &id002 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 19
45
- segments:
46
- - 3
47
- - 10
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
- prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
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
- version_requirements: *id003
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
- files:
84
- - .autotest
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/test_left_recursion.rb
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
- post_install_message:
136
- rdoc_options:
137
- - --main
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
- none: false
143
- requirements:
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
144
150
  - - ">="
145
- - !ruby/object:Gem::Version
146
- hash: 3
147
- segments:
148
- - 0
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
- hash: 3
156
- segments:
157
- - 0
158
- version: "0"
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
159
158
  requirements: []
160
-
161
- rubyforge_project: kpeg
162
- rubygems_version: 1.8.17
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
@@ -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