kpeg 0.10.0 → 1.0.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/.travis.yml +15 -0
- data/Manifest.txt +1 -0
- data/kpeg.gemspec +20 -20
- data/lib/kpeg.rb +1 -1
- data/lib/kpeg/code_generator.rb +9 -6
- data/lib/kpeg/compiled_parser.rb +14 -10
- data/lib/kpeg/format_parser.rb +14 -11
- data/lib/kpeg/grammar.rb +1 -1
- data/lib/kpeg/string_escape.kpeg +1 -0
- data/lib/kpeg/string_escape.rb +42 -21
- data/test/test_kpeg.rb +1 -1
- data/test/test_kpeg_code_generator.rb +17 -11
- data/test/test_kpeg_compiled_parser.rb +1 -1
- data/test/test_kpeg_format.rb +4 -4
- data/test/test_kpeg_format_parser_round_trip.rb +1 -1
- data/test/test_kpeg_grammar.rb +1 -1
- data/test/test_kpeg_grammar_renderer.rb +1 -1
- data/test/test_kpeg_string_escape.rb +42 -0
- metadata +68 -82
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7cbdc1c35b943bc3f71391cb377b422b91e68f52
|
4
|
+
data.tar.gz: 43d2cb391965f7ffd22f9afcbfee3f02b952ae3c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0a6aa682aefebb2c59f72e17a88be5a7c956bb87d8d1700b29916bbb624297959e7273ab57262f895ea073e2a08a91dd40b2879d532dfdef729720df980fb3fb
|
7
|
+
data.tar.gz: cdb1452be3a93769b4aba53e58cc13224b66eeca67b21b21df4731d4445d06b84c85f70432510e004f011e6902d1dcf34d3bb205fe661eacbaf1a6fda088f2d0
|
data/.travis.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
script: rake travis
|
3
|
+
before_script:
|
4
|
+
- gem install hoe-travis --no-rdoc --no-ri
|
5
|
+
- rake travis:before -t
|
6
|
+
language: ruby
|
7
|
+
notifications:
|
8
|
+
email:
|
9
|
+
- evan@fallingsnow.net
|
10
|
+
- drbrain@segment7.net
|
11
|
+
rvm:
|
12
|
+
- 1.8.7
|
13
|
+
- 1.9.2
|
14
|
+
- 1.9.3
|
15
|
+
- 2.0.0
|
data/Manifest.txt
CHANGED
data/kpeg.gemspec
CHANGED
@@ -1,42 +1,42 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: kpeg 1.0.0.20140103162640 ruby lib
|
2
3
|
|
3
4
|
Gem::Specification.new do |s|
|
4
5
|
s.name = "kpeg"
|
5
|
-
s.version = "0.
|
6
|
+
s.version = "1.0.0.20140103162640"
|
6
7
|
|
7
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["
|
9
|
-
s.
|
10
|
-
s.date = "2012-03-07"
|
9
|
+
s.authors = ["Evan Phoenix"]
|
10
|
+
s.date = "2014-01-04"
|
11
11
|
s.description = "KPeg is a simple PEG library for Ruby. It provides an API as well as native\ngrammar to build the grammar.\n\nKPeg strives to provide a simple, powerful API without being too exotic.\n\nKPeg supports direct left recursion of rules via the\n{OMeta memoization}[http://www.vpri.org/pdf/tr2008003_experimenting.pdf] trick."
|
12
|
-
s.email = ["
|
12
|
+
s.email = ["evan@fallingsnow.net"]
|
13
13
|
s.executables = ["kpeg"]
|
14
|
-
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
|
15
|
-
s.files = [".autotest", "
|
14
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc", "examples/phone_number/README.md", "examples/upper/README.md"]
|
15
|
+
s.files = [".autotest", ".travis.yml", "History.txt", "LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "bin/kpeg", "examples/calculator/calculator.kpeg", "examples/calculator/calculator.rb", "examples/foreign_reference/literals.kpeg", "examples/foreign_reference/matcher.kpeg", "examples/foreign_reference/matcher.rb", "examples/lua_string/driver.rb", "examples/lua_string/lua_string.kpeg", "examples/lua_string/lua_string.kpeg.rb", "examples/phone_number/README.md", "examples/phone_number/phone_number.kpeg", "examples/phone_number/phone_number.rb", "examples/upper/README.md", "examples/upper/upper.kpeg", "examples/upper/upper.rb", "kpeg.gemspec", "lib/hoe/kpeg.rb", "lib/kpeg.rb", "lib/kpeg/code_generator.rb", "lib/kpeg/compiled_parser.rb", "lib/kpeg/format_parser.kpeg", "lib/kpeg/format_parser.rb", "lib/kpeg/grammar.rb", "lib/kpeg/grammar_renderer.rb", "lib/kpeg/match.rb", "lib/kpeg/parser.rb", "lib/kpeg/position.rb", "lib/kpeg/string_escape.kpeg", "lib/kpeg/string_escape.rb", "test/inputs/comments.kpeg", "test/test_kpeg.rb", "test/test_kpeg_code_generator.rb", "test/test_kpeg_compiled_parser.rb", "test/test_kpeg_format.rb", "test/test_kpeg_format_parser_round_trip.rb", "test/test_kpeg_grammar.rb", "test/test_kpeg_grammar_renderer.rb", "vim/syntax_kpeg/ftdetect/kpeg.vim", "vim/syntax_kpeg/syntax/kpeg.vim", "test/test_kpeg_string_escape.rb", ".gemtest"]
|
16
16
|
s.homepage = "https://github.com/evanphx/kpeg"
|
17
|
+
s.licenses = ["MIT"]
|
17
18
|
s.rdoc_options = ["--main", "README.rdoc"]
|
18
19
|
s.require_paths = ["lib"]
|
19
20
|
s.rubyforge_project = "kpeg"
|
20
|
-
s.rubygems_version = "1.
|
21
|
-
s.signing_key = "/Users/drbrain/.gem/gem-private_key.pem"
|
21
|
+
s.rubygems_version = "2.1.10"
|
22
22
|
s.summary = "KPeg is a simple PEG library for Ruby"
|
23
|
-
s.test_files = ["test/
|
23
|
+
s.test_files = ["test/test_kpeg.rb", "test/test_kpeg_code_generator.rb", "test/test_kpeg_compiled_parser.rb", "test/test_kpeg_format.rb", "test/test_kpeg_format_parser_round_trip.rb", "test/test_kpeg_grammar.rb", "test/test_kpeg_grammar_renderer.rb", "test/test_kpeg_string_escape.rb"]
|
24
24
|
|
25
25
|
if s.respond_to? :specification_version then
|
26
|
-
s.specification_version =
|
26
|
+
s.specification_version = 4
|
27
27
|
|
28
28
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
29
|
-
s.add_development_dependency(%q<minitest>, ["~> 2
|
30
|
-
s.add_development_dependency(%q<rdoc>, ["~>
|
31
|
-
s.add_development_dependency(%q<hoe>, ["~>
|
29
|
+
s.add_development_dependency(%q<minitest>, ["~> 5.2"])
|
30
|
+
s.add_development_dependency(%q<rdoc>, ["~> 4.0"])
|
31
|
+
s.add_development_dependency(%q<hoe>, ["~> 3.7"])
|
32
32
|
else
|
33
|
-
s.add_dependency(%q<minitest>, ["~> 2
|
34
|
-
s.add_dependency(%q<rdoc>, ["~>
|
35
|
-
s.add_dependency(%q<hoe>, ["~>
|
33
|
+
s.add_dependency(%q<minitest>, ["~> 5.2"])
|
34
|
+
s.add_dependency(%q<rdoc>, ["~> 4.0"])
|
35
|
+
s.add_dependency(%q<hoe>, ["~> 3.7"])
|
36
36
|
end
|
37
37
|
else
|
38
|
-
s.add_dependency(%q<minitest>, ["~> 2
|
39
|
-
s.add_dependency(%q<rdoc>, ["~>
|
40
|
-
s.add_dependency(%q<hoe>, ["~>
|
38
|
+
s.add_dependency(%q<minitest>, ["~> 5.2"])
|
39
|
+
s.add_dependency(%q<rdoc>, ["~> 4.0"])
|
40
|
+
s.add_dependency(%q<hoe>, ["~> 3.7"])
|
41
41
|
end
|
42
42
|
end
|
data/lib/kpeg.rb
CHANGED
data/lib/kpeg/code_generator.rb
CHANGED
@@ -83,11 +83,14 @@ module KPeg
|
|
83
83
|
|
84
84
|
if output_node
|
85
85
|
code << " end\n"
|
86
|
+
code << " module #{root}Construction\n"
|
86
87
|
methods.each do |short, name, attrs|
|
87
|
-
code << "
|
88
|
-
code << "
|
89
|
-
code << "
|
88
|
+
code << " def #{short}(#{attrs.join(', ')})\n"
|
89
|
+
code << " #{root}::#{name}.new(#{attrs.join(', ')})\n"
|
90
|
+
code << " end\n"
|
90
91
|
end
|
92
|
+
code << " end\n"
|
93
|
+
code << " include #{root}Construction\n"
|
91
94
|
end
|
92
95
|
end
|
93
96
|
|
@@ -124,7 +127,7 @@ module KPeg
|
|
124
127
|
left = op.start[0]
|
125
128
|
right = op.fin[0]
|
126
129
|
end
|
127
|
-
|
130
|
+
|
128
131
|
code << indentify(" unless _tmp >= #{left} and _tmp <= #{right}\n", indent)
|
129
132
|
code << indentify(" self.pos = #{ss}\n", indent)
|
130
133
|
code << indentify(" _tmp = nil\n", indent)
|
@@ -140,7 +143,7 @@ module KPeg
|
|
140
143
|
code << indentify("while true # choice\n", indent)
|
141
144
|
op.ops.each_with_index do |n,idx|
|
142
145
|
output_op code, n, (indent+1)
|
143
|
-
|
146
|
+
|
144
147
|
code << indentify(" break if _tmp\n", indent)
|
145
148
|
code << indentify(" self.pos = #{ss}\n", indent)
|
146
149
|
if idx == op.ops.size - 1
|
@@ -447,7 +450,7 @@ module KPeg
|
|
447
450
|
cpi = standalone_region("compiled_parser.rb", "INITIALIZE")
|
448
451
|
pp = standalone_region("position.rb")
|
449
452
|
|
450
|
-
cp.gsub!(
|
453
|
+
cp.gsub!(/^\s*include Position/, pp)
|
451
454
|
code << " # :stopdoc:\n"
|
452
455
|
code << cpi << "\n" unless @grammar.variables['custom_initialize']
|
453
456
|
code << cp << "\n"
|
data/lib/kpeg/compiled_parser.rb
CHANGED
@@ -27,8 +27,7 @@ module KPeg
|
|
27
27
|
# Prepares for parsing +str+. If you define a custom initialize you must
|
28
28
|
# call this method before #parse
|
29
29
|
def setup_parser(str, debug=false)
|
30
|
-
|
31
|
-
@pos = 0
|
30
|
+
set_string str, 0
|
32
31
|
@memoizations = Hash.new { |h,k| h[k] = {} }
|
33
32
|
@result = nil
|
34
33
|
@failed_rule = nil
|
@@ -47,6 +46,13 @@ module KPeg
|
|
47
46
|
@string[start..@pos-1]
|
48
47
|
end
|
49
48
|
|
49
|
+
# Sets the string and current parsing position for the parser.
|
50
|
+
def set_string string, pos
|
51
|
+
@string = string
|
52
|
+
@string_size = string ? string.size : 0
|
53
|
+
@pos = pos
|
54
|
+
end
|
55
|
+
|
50
56
|
def show_pos
|
51
57
|
width = 10
|
52
58
|
if @pos < width
|
@@ -153,19 +159,19 @@ module KPeg
|
|
153
159
|
return nil
|
154
160
|
end
|
155
161
|
|
156
|
-
if "".respond_to? :
|
162
|
+
if "".respond_to? :ord
|
157
163
|
def get_byte
|
158
|
-
if @pos >= @
|
164
|
+
if @pos >= @string_size
|
159
165
|
return nil
|
160
166
|
end
|
161
167
|
|
162
|
-
s = @string
|
168
|
+
s = @string[@pos].ord
|
163
169
|
@pos += 1
|
164
170
|
s
|
165
171
|
end
|
166
172
|
else
|
167
173
|
def get_byte
|
168
|
-
if @pos >= @
|
174
|
+
if @pos >= @string_size
|
169
175
|
return nil
|
170
176
|
end
|
171
177
|
|
@@ -214,8 +220,7 @@ module KPeg
|
|
214
220
|
old_pos = @pos
|
215
221
|
old_string = @string
|
216
222
|
|
217
|
-
|
218
|
-
@string = other.string
|
223
|
+
set_string other.string, other.pos
|
219
224
|
|
220
225
|
begin
|
221
226
|
if val = __send__(rule, *args)
|
@@ -226,8 +231,7 @@ module KPeg
|
|
226
231
|
end
|
227
232
|
val
|
228
233
|
ensure
|
229
|
-
|
230
|
-
@string = old_string
|
234
|
+
set_string old_string, old_pos
|
231
235
|
end
|
232
236
|
end
|
233
237
|
|
data/lib/kpeg/format_parser.rb
CHANGED
@@ -5,8 +5,7 @@ class KPeg::FormatParser
|
|
5
5
|
# Prepares for parsing +str+. If you define a custom initialize you must
|
6
6
|
# call this method before #parse
|
7
7
|
def setup_parser(str, debug=false)
|
8
|
-
|
9
|
-
@pos = 0
|
8
|
+
set_string str, 0
|
10
9
|
@memoizations = Hash.new { |h,k| h[k] = {} }
|
11
10
|
@result = nil
|
12
11
|
@failed_rule = nil
|
@@ -19,7 +18,6 @@ class KPeg::FormatParser
|
|
19
18
|
attr_reader :failing_rule_offset
|
20
19
|
attr_accessor :result, :pos
|
21
20
|
|
22
|
-
|
23
21
|
def current_column(target=pos)
|
24
22
|
if c = string.rindex("\n", target-1)
|
25
23
|
return target - c - 1
|
@@ -53,6 +51,13 @@ class KPeg::FormatParser
|
|
53
51
|
@string[start..@pos-1]
|
54
52
|
end
|
55
53
|
|
54
|
+
# Sets the string and current parsing position for the parser.
|
55
|
+
def set_string string, pos
|
56
|
+
@string = string
|
57
|
+
@string_size = string ? string.size : 0
|
58
|
+
@pos = pos
|
59
|
+
end
|
60
|
+
|
56
61
|
def show_pos
|
57
62
|
width = 10
|
58
63
|
if @pos < width
|
@@ -159,19 +164,19 @@ class KPeg::FormatParser
|
|
159
164
|
return nil
|
160
165
|
end
|
161
166
|
|
162
|
-
if "".respond_to? :
|
167
|
+
if "".respond_to? :ord
|
163
168
|
def get_byte
|
164
|
-
if @pos >= @
|
169
|
+
if @pos >= @string_size
|
165
170
|
return nil
|
166
171
|
end
|
167
172
|
|
168
|
-
s = @string
|
173
|
+
s = @string[@pos].ord
|
169
174
|
@pos += 1
|
170
175
|
s
|
171
176
|
end
|
172
177
|
else
|
173
178
|
def get_byte
|
174
|
-
if @pos >= @
|
179
|
+
if @pos >= @string_size
|
175
180
|
return nil
|
176
181
|
end
|
177
182
|
|
@@ -220,8 +225,7 @@ class KPeg::FormatParser
|
|
220
225
|
old_pos = @pos
|
221
226
|
old_string = @string
|
222
227
|
|
223
|
-
|
224
|
-
@string = other.string
|
228
|
+
set_string other.string, other.pos
|
225
229
|
|
226
230
|
begin
|
227
231
|
if val = __send__(rule, *args)
|
@@ -232,8 +236,7 @@ class KPeg::FormatParser
|
|
232
236
|
end
|
233
237
|
val
|
234
238
|
ensure
|
235
|
-
|
236
|
-
@string = old_string
|
239
|
+
set_string old_string, old_pos
|
237
240
|
end
|
238
241
|
end
|
239
242
|
|
data/lib/kpeg/grammar.rb
CHANGED
@@ -834,7 +834,7 @@ module KPeg
|
|
834
834
|
# Invoke a rule defined on a foreign grammar
|
835
835
|
# == Parameters:
|
836
836
|
# gram::
|
837
|
-
# The name of the grammar that the rule will be reference from
|
837
|
+
# The name of the grammar that the rule will be reference from
|
838
838
|
# name::
|
839
839
|
# The name of the rule that will be invoked
|
840
840
|
# args::
|
data/lib/kpeg/string_escape.kpeg
CHANGED
data/lib/kpeg/string_escape.rb
CHANGED
@@ -13,8 +13,7 @@ class KPeg::StringEscape
|
|
13
13
|
# Prepares for parsing +str+. If you define a custom initialize you must
|
14
14
|
# call this method before #parse
|
15
15
|
def setup_parser(str, debug=false)
|
16
|
-
|
17
|
-
@pos = 0
|
16
|
+
set_string str, 0
|
18
17
|
@memoizations = Hash.new { |h,k| h[k] = {} }
|
19
18
|
@result = nil
|
20
19
|
@failed_rule = nil
|
@@ -27,7 +26,6 @@ class KPeg::StringEscape
|
|
27
26
|
attr_reader :failing_rule_offset
|
28
27
|
attr_accessor :result, :pos
|
29
28
|
|
30
|
-
|
31
29
|
def current_column(target=pos)
|
32
30
|
if c = string.rindex("\n", target-1)
|
33
31
|
return target - c - 1
|
@@ -61,6 +59,13 @@ class KPeg::StringEscape
|
|
61
59
|
@string[start..@pos-1]
|
62
60
|
end
|
63
61
|
|
62
|
+
# Sets the string and current parsing position for the parser.
|
63
|
+
def set_string string, pos
|
64
|
+
@string = string
|
65
|
+
@string_size = string ? string.size : 0
|
66
|
+
@pos = pos
|
67
|
+
end
|
68
|
+
|
64
69
|
def show_pos
|
65
70
|
width = 10
|
66
71
|
if @pos < width
|
@@ -167,19 +172,19 @@ class KPeg::StringEscape
|
|
167
172
|
return nil
|
168
173
|
end
|
169
174
|
|
170
|
-
if "".respond_to? :
|
175
|
+
if "".respond_to? :ord
|
171
176
|
def get_byte
|
172
|
-
if @pos >= @
|
177
|
+
if @pos >= @string_size
|
173
178
|
return nil
|
174
179
|
end
|
175
180
|
|
176
|
-
s = @string
|
181
|
+
s = @string[@pos].ord
|
177
182
|
@pos += 1
|
178
183
|
s
|
179
184
|
end
|
180
185
|
else
|
181
186
|
def get_byte
|
182
|
-
if @pos >= @
|
187
|
+
if @pos >= @string_size
|
183
188
|
return nil
|
184
189
|
end
|
185
190
|
|
@@ -228,8 +233,7 @@ class KPeg::StringEscape
|
|
228
233
|
old_pos = @pos
|
229
234
|
old_string = @string
|
230
235
|
|
231
|
-
|
232
|
-
@string = other.string
|
236
|
+
set_string other.string, other.pos
|
233
237
|
|
234
238
|
begin
|
235
239
|
if val = __send__(rule, *args)
|
@@ -240,8 +244,7 @@ class KPeg::StringEscape
|
|
240
244
|
end
|
241
245
|
val
|
242
246
|
ensure
|
243
|
-
|
244
|
-
@string = old_string
|
247
|
+
set_string old_string, old_pos
|
245
248
|
end
|
246
249
|
end
|
247
250
|
|
@@ -359,7 +362,7 @@ class KPeg::StringEscape
|
|
359
362
|
# :stopdoc:
|
360
363
|
def setup_foreign_grammar; end
|
361
364
|
|
362
|
-
# segment = (< /[\w ]+/ > { text } | "\\" { "\\\\" } | "\n" { "\\n" } | "\t" { "\\t" } | "\b" { "\\b" } | "\"" { "\\\"" } | < . > { text })
|
365
|
+
# segment = (< /[\w ]+/ > { text } | "\\" { "\\\\" } | "\n" { "\\n" } | "\r" { "\\r" } | "\t" { "\\t" } | "\b" { "\\b" } | "\"" { "\\\"" } | < . > { text })
|
363
366
|
def _segment
|
364
367
|
|
365
368
|
_save = self.pos
|
@@ -425,12 +428,12 @@ class KPeg::StringEscape
|
|
425
428
|
|
426
429
|
_save4 = self.pos
|
427
430
|
while true # sequence
|
428
|
-
_tmp = match_string("\
|
431
|
+
_tmp = match_string("\r")
|
429
432
|
unless _tmp
|
430
433
|
self.pos = _save4
|
431
434
|
break
|
432
435
|
end
|
433
|
-
@result = begin; "\\
|
436
|
+
@result = begin; "\\r" ; end
|
434
437
|
_tmp = true
|
435
438
|
unless _tmp
|
436
439
|
self.pos = _save4
|
@@ -443,12 +446,12 @@ class KPeg::StringEscape
|
|
443
446
|
|
444
447
|
_save5 = self.pos
|
445
448
|
while true # sequence
|
446
|
-
_tmp = match_string("\
|
449
|
+
_tmp = match_string("\t")
|
447
450
|
unless _tmp
|
448
451
|
self.pos = _save5
|
449
452
|
break
|
450
453
|
end
|
451
|
-
@result = begin; "\\
|
454
|
+
@result = begin; "\\t" ; end
|
452
455
|
_tmp = true
|
453
456
|
unless _tmp
|
454
457
|
self.pos = _save5
|
@@ -461,12 +464,12 @@ class KPeg::StringEscape
|
|
461
464
|
|
462
465
|
_save6 = self.pos
|
463
466
|
while true # sequence
|
464
|
-
_tmp = match_string("\"
|
467
|
+
_tmp = match_string("\b")
|
465
468
|
unless _tmp
|
466
469
|
self.pos = _save6
|
467
470
|
break
|
468
471
|
end
|
469
|
-
@result = begin; "
|
472
|
+
@result = begin; "\\b" ; end
|
470
473
|
_tmp = true
|
471
474
|
unless _tmp
|
472
475
|
self.pos = _save6
|
@@ -478,6 +481,24 @@ class KPeg::StringEscape
|
|
478
481
|
self.pos = _save
|
479
482
|
|
480
483
|
_save7 = self.pos
|
484
|
+
while true # sequence
|
485
|
+
_tmp = match_string("\"")
|
486
|
+
unless _tmp
|
487
|
+
self.pos = _save7
|
488
|
+
break
|
489
|
+
end
|
490
|
+
@result = begin; "\\\"" ; end
|
491
|
+
_tmp = true
|
492
|
+
unless _tmp
|
493
|
+
self.pos = _save7
|
494
|
+
end
|
495
|
+
break
|
496
|
+
end # end sequence
|
497
|
+
|
498
|
+
break if _tmp
|
499
|
+
self.pos = _save
|
500
|
+
|
501
|
+
_save8 = self.pos
|
481
502
|
while true # sequence
|
482
503
|
_text_start = self.pos
|
483
504
|
_tmp = get_byte
|
@@ -485,13 +506,13 @@ class KPeg::StringEscape
|
|
485
506
|
text = get_text(_text_start)
|
486
507
|
end
|
487
508
|
unless _tmp
|
488
|
-
self.pos =
|
509
|
+
self.pos = _save8
|
489
510
|
break
|
490
511
|
end
|
491
512
|
@result = begin; text ; end
|
492
513
|
_tmp = true
|
493
514
|
unless _tmp
|
494
|
-
self.pos =
|
515
|
+
self.pos = _save8
|
495
516
|
end
|
496
517
|
break
|
497
518
|
end # end sequence
|
@@ -599,7 +620,7 @@ class KPeg::StringEscape
|
|
599
620
|
end
|
600
621
|
|
601
622
|
Rules = {}
|
602
|
-
Rules[:_segment] = rule_info("segment", "(< /[\\w ]+/ > { text } | \"\\\\\" { \"\\\\\\\\\" } | \"\\n\" { \"\\\\n\" } | \"\\t\" { \"\\\\t\" } | \"\\b\" { \"\\\\b\" } | \"\\\"\" { \"\\\\\\\"\" } | < . > { text })")
|
623
|
+
Rules[:_segment] = rule_info("segment", "(< /[\\w ]+/ > { text } | \"\\\\\" { \"\\\\\\\\\" } | \"\\n\" { \"\\\\n\" } | \"\\r\" { \"\\\\r\" } | \"\\t\" { \"\\\\t\" } | \"\\b\" { \"\\\\b\" } | \"\\\"\" { \"\\\\\\\"\" } | < . > { text })")
|
603
624
|
Rules[:_root] = rule_info("root", "segment*:s { @text = s.join }")
|
604
625
|
Rules[:_embed_seg] = rule_info("embed_seg", "(\"\#\" { \"\\\\\#\" } | segment)")
|
605
626
|
Rules[:_embed] = rule_info("embed", "embed_seg*:s { @text = s.join }")
|
data/test/test_kpeg.rb
CHANGED
@@ -4,7 +4,7 @@ require 'kpeg'
|
|
4
4
|
require 'kpeg/code_generator'
|
5
5
|
require 'stringio'
|
6
6
|
|
7
|
-
class TestKPegCodeGenerator <
|
7
|
+
class TestKPegCodeGenerator < Minitest::Test
|
8
8
|
def test_dot
|
9
9
|
gram = KPeg.grammar do |g|
|
10
10
|
g.root = g.dot
|
@@ -1661,15 +1661,18 @@ class Test < KPeg::CompiledParser
|
|
1661
1661
|
end
|
1662
1662
|
end
|
1663
1663
|
end
|
1664
|
-
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
|
1664
|
+
module ASTConstruction
|
1665
|
+
def bracket(receiver, argument)
|
1666
|
+
AST::BracketOperator.new(receiver, argument)
|
1667
|
+
end
|
1668
|
+
def simple()
|
1669
|
+
AST::Simple.new()
|
1670
|
+
end
|
1671
|
+
def simple2()
|
1672
|
+
AST::Simple2.new()
|
1673
|
+
end
|
1672
1674
|
end
|
1675
|
+
include ASTConstruction
|
1673
1676
|
|
1674
1677
|
# root = .
|
1675
1678
|
def _root
|
@@ -1715,9 +1718,12 @@ class Test < KPeg::CompiledParser
|
|
1715
1718
|
attr_reader :argument
|
1716
1719
|
end
|
1717
1720
|
end
|
1718
|
-
|
1719
|
-
|
1721
|
+
module MegaASTConstruction
|
1722
|
+
def bracket(receiver, argument)
|
1723
|
+
MegaAST::BracketOperator.new(receiver, argument)
|
1724
|
+
end
|
1720
1725
|
end
|
1726
|
+
include MegaASTConstruction
|
1721
1727
|
|
1722
1728
|
# root = .
|
1723
1729
|
def _root
|
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__)
|
@@ -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
|
@@ -5,7 +5,7 @@ require 'kpeg/grammar_renderer'
|
|
5
5
|
require 'kpeg/code_generator'
|
6
6
|
require 'stringio'
|
7
7
|
|
8
|
-
class TestKPegFormatParserRoundtrip <
|
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)
|
data/test/test_kpeg_grammar.rb
CHANGED
@@ -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)
|
@@ -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,79 @@
|
|
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
|
-
- 10
|
9
|
-
- 0
|
10
|
-
version: 0.10.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Evan Phoenix
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-01-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: minitest
|
22
|
-
|
23
|
-
|
24
|
-
none: false
|
25
|
-
requirements:
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
26
17
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 12
|
32
|
-
version: "2.12"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.2'
|
33
20
|
type: :development
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rdoc
|
37
21
|
prerelease: false
|
38
|
-
|
39
|
-
|
40
|
-
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
41
31
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 3
|
46
|
-
- 10
|
47
|
-
version: "3.10"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
48
34
|
type: :development
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: hoe
|
52
35
|
prerelease: false
|
53
|
-
|
54
|
-
|
55
|
-
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hoe
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
56
45
|
- - ~>
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 2
|
61
|
-
- 16
|
62
|
-
version: "2.16"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.7'
|
63
48
|
type: :development
|
64
|
-
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.7'
|
65
55
|
description: |-
|
66
56
|
KPeg is a simple PEG library for Ruby. It provides an API as well as native
|
67
57
|
grammar to build the grammar.
|
68
|
-
|
58
|
+
|
69
59
|
KPeg strives to provide a simple, powerful API without being too exotic.
|
70
|
-
|
60
|
+
|
71
61
|
KPeg supports direct left recursion of rules via the
|
72
62
|
{OMeta memoization}[http://www.vpri.org/pdf/tr2008003_experimenting.pdf] trick.
|
73
|
-
email:
|
63
|
+
email:
|
74
64
|
- evan@fallingsnow.net
|
75
|
-
executables:
|
65
|
+
executables:
|
76
66
|
- kpeg
|
77
67
|
extensions: []
|
78
|
-
|
79
|
-
extra_rdoc_files:
|
68
|
+
extra_rdoc_files:
|
80
69
|
- History.txt
|
81
70
|
- Manifest.txt
|
82
71
|
- README.rdoc
|
83
|
-
|
72
|
+
- examples/phone_number/README.md
|
73
|
+
- examples/upper/README.md
|
74
|
+
files:
|
84
75
|
- .autotest
|
76
|
+
- .travis.yml
|
85
77
|
- History.txt
|
86
78
|
- LICENSE
|
87
79
|
- Manifest.txt
|
@@ -126,42 +118,35 @@ files:
|
|
126
118
|
- test/test_kpeg_grammar_renderer.rb
|
127
119
|
- vim/syntax_kpeg/ftdetect/kpeg.vim
|
128
120
|
- vim/syntax_kpeg/syntax/kpeg.vim
|
121
|
+
- test/test_kpeg_string_escape.rb
|
129
122
|
- .gemtest
|
130
123
|
homepage: https://github.com/evanphx/kpeg
|
131
|
-
licenses:
|
132
|
-
|
124
|
+
licenses:
|
125
|
+
- MIT
|
126
|
+
metadata: {}
|
133
127
|
post_install_message:
|
134
|
-
rdoc_options:
|
128
|
+
rdoc_options:
|
135
129
|
- --main
|
136
130
|
- README.rdoc
|
137
|
-
require_paths:
|
131
|
+
require_paths:
|
138
132
|
- lib
|
139
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
none: false
|
150
|
-
requirements:
|
151
|
-
- - ">="
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
hash: 3
|
154
|
-
segments:
|
155
|
-
- 0
|
156
|
-
version: "0"
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - '>='
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
157
143
|
requirements: []
|
158
|
-
|
159
144
|
rubyforge_project: kpeg
|
160
|
-
rubygems_version: 1.
|
145
|
+
rubygems_version: 2.1.10
|
161
146
|
signing_key:
|
162
|
-
specification_version:
|
147
|
+
specification_version: 4
|
163
148
|
summary: KPeg is a simple PEG library for Ruby
|
164
|
-
test_files:
|
149
|
+
test_files:
|
165
150
|
- test/test_kpeg.rb
|
166
151
|
- test/test_kpeg_code_generator.rb
|
167
152
|
- test/test_kpeg_compiled_parser.rb
|
@@ -169,3 +154,4 @@ test_files:
|
|
169
154
|
- test/test_kpeg_format_parser_round_trip.rb
|
170
155
|
- test/test_kpeg_grammar.rb
|
171
156
|
- test/test_kpeg_grammar_renderer.rb
|
157
|
+
- test/test_kpeg_string_escape.rb
|