kpeg 1.0.0 → 1.3.1
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 +5 -5
- data/.hoeignore +12 -0
- data/Gemfile +3 -0
- data/History.txt +18 -0
- data/Manifest.txt +9 -1
- data/README.rdoc +8 -8
- data/Rakefile +2 -0
- data/bin/kpeg +12 -5
- 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/lib/kpeg/code_generator.rb +1 -1
- data/lib/kpeg/compiled_parser.rb +3 -7
- data/lib/kpeg/format_parser.kpeg +1 -1
- data/lib/kpeg/format_parser.rb +46 -32
- data/lib/kpeg/position.rb +25 -10
- data/lib/kpeg/string_escape.rb +27 -16
- data/lib/kpeg.rb +1 -1
- data/test/test_kpeg_code_generator.rb +3 -3
- data/test/test_kpeg_compiled_parser.rb +10 -1
- data/test/test_kpeg_format.rb +19 -0
- metadata +40 -34
- data/.gemtest +0 -0
- data/.travis.yml +0 -15
data/lib/kpeg/code_generator.rb
CHANGED
@@ -112,7 +112,7 @@ module KPeg
|
|
112
112
|
# Let default ruby string handling figure it out
|
113
113
|
lang = ""
|
114
114
|
end
|
115
|
-
code << indentify("_tmp = scan(/\\
|
115
|
+
code << indentify("_tmp = scan(/\\G#{op.regexp}/#{lang})\n", indent)
|
116
116
|
when CharRange
|
117
117
|
ss = save()
|
118
118
|
if op.start.bytesize == 1 and op.fin.bytesize == 1
|
data/lib/kpeg/compiled_parser.rb
CHANGED
@@ -32,6 +32,7 @@ module KPeg
|
|
32
32
|
@result = nil
|
33
33
|
@failed_rule = nil
|
34
34
|
@failing_rule_offset = -1
|
35
|
+
@line_offsets = nil
|
35
36
|
|
36
37
|
setup_foreign_grammar
|
37
38
|
end
|
@@ -150,9 +151,8 @@ module KPeg
|
|
150
151
|
end
|
151
152
|
|
152
153
|
def scan(reg)
|
153
|
-
if m = reg.match(@string
|
154
|
-
|
155
|
-
@pos += width
|
154
|
+
if m = reg.match(@string, @pos)
|
155
|
+
@pos = m.end(0)
|
156
156
|
return true
|
157
157
|
end
|
158
158
|
|
@@ -265,8 +265,6 @@ module KPeg
|
|
265
265
|
else
|
266
266
|
return ans
|
267
267
|
end
|
268
|
-
|
269
|
-
return ans
|
270
268
|
end
|
271
269
|
end
|
272
270
|
|
@@ -299,8 +297,6 @@ module KPeg
|
|
299
297
|
else
|
300
298
|
return ans
|
301
299
|
end
|
302
|
-
|
303
|
-
return ans
|
304
300
|
end
|
305
301
|
end
|
306
302
|
|
data/lib/kpeg/format_parser.kpeg
CHANGED
@@ -77,7 +77,7 @@ sgl_escape_quote = "\\'" { "'" }
|
|
77
77
|
| "[" - range_num:e - "]" { [e.to_i, e.to_i] }
|
78
78
|
|
79
79
|
curly_block = curly
|
80
|
-
curly = "{" < (/[^{}"']+/ | string | curly)* > "}" { @g.action(text) }
|
80
|
+
curly = "{" < (spaces | /[^{}"']+/ | string | curly)* > "}" { @g.action(text) }
|
81
81
|
nested_paren = "(" (/[^()"']+/ | string | nested_paren)* ")"
|
82
82
|
|
83
83
|
value = value:v ":" var:n { @g.t(v,n) }
|
data/lib/kpeg/format_parser.rb
CHANGED
@@ -10,6 +10,7 @@ class KPeg::FormatParser
|
|
10
10
|
@result = nil
|
11
11
|
@failed_rule = nil
|
12
12
|
@failing_rule_offset = -1
|
13
|
+
@line_offsets = nil
|
13
14
|
|
14
15
|
setup_foreign_grammar
|
15
16
|
end
|
@@ -26,17 +27,32 @@ class KPeg::FormatParser
|
|
26
27
|
target + 1
|
27
28
|
end
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
if [].respond_to? :bsearch_index
|
31
|
+
def current_line(target=pos)
|
32
|
+
unless @line_offsets
|
33
|
+
@line_offsets = []
|
34
|
+
total = 0
|
35
|
+
string.each_line do |line|
|
36
|
+
total += line.size
|
37
|
+
@line_offsets << total
|
38
|
+
end
|
39
|
+
end
|
32
40
|
|
33
|
-
|
34
|
-
cur_line += 1
|
35
|
-
cur_offset += line.size
|
36
|
-
return cur_line if cur_offset >= target
|
41
|
+
@line_offsets.bsearch_index {|x| x >= target } + 1 || -1
|
37
42
|
end
|
43
|
+
else
|
44
|
+
def current_line(target=pos)
|
45
|
+
cur_offset = 0
|
46
|
+
cur_line = 0
|
47
|
+
|
48
|
+
string.each_line do |line|
|
49
|
+
cur_line += 1
|
50
|
+
cur_offset += line.size
|
51
|
+
return cur_line if cur_offset >= target
|
52
|
+
end
|
38
53
|
|
39
|
-
|
54
|
+
-1
|
55
|
+
end
|
40
56
|
end
|
41
57
|
|
42
58
|
def lines
|
@@ -155,9 +171,8 @@ class KPeg::FormatParser
|
|
155
171
|
end
|
156
172
|
|
157
173
|
def scan(reg)
|
158
|
-
if m = reg.match(@string
|
159
|
-
|
160
|
-
@pos += width
|
174
|
+
if m = reg.match(@string, @pos)
|
175
|
+
@pos = m.end(0)
|
161
176
|
return true
|
162
177
|
end
|
163
178
|
|
@@ -270,8 +285,6 @@ class KPeg::FormatParser
|
|
270
285
|
else
|
271
286
|
return ans
|
272
287
|
end
|
273
|
-
|
274
|
-
return ans
|
275
288
|
end
|
276
289
|
end
|
277
290
|
|
@@ -304,8 +317,6 @@ class KPeg::FormatParser
|
|
304
317
|
else
|
305
318
|
return ans
|
306
319
|
end
|
307
|
-
|
308
|
-
return ans
|
309
320
|
end
|
310
321
|
end
|
311
322
|
|
@@ -526,7 +537,7 @@ class KPeg::FormatParser
|
|
526
537
|
_tmp = match_string("-")
|
527
538
|
break if _tmp
|
528
539
|
self.pos = _save1
|
529
|
-
_tmp = scan(/\
|
540
|
+
_tmp = scan(/\G(?i-mx:[a-z][\w-]*)/)
|
530
541
|
break if _tmp
|
531
542
|
self.pos = _save1
|
532
543
|
break
|
@@ -557,7 +568,7 @@ class KPeg::FormatParser
|
|
557
568
|
_save = self.pos
|
558
569
|
while true # sequence
|
559
570
|
_text_start = self.pos
|
560
|
-
_tmp = scan(/\
|
571
|
+
_tmp = scan(/\G(?i-mx:[a-z_]\w*)/)
|
561
572
|
if _tmp
|
562
573
|
text = get_text(_text_start)
|
563
574
|
end
|
@@ -821,7 +832,7 @@ class KPeg::FormatParser
|
|
821
832
|
_save1 = self.pos
|
822
833
|
while true # sequence
|
823
834
|
_text_start = self.pos
|
824
|
-
_tmp = scan(/\
|
835
|
+
_tmp = scan(/\G(?-mix:[0-7]{1,3})/)
|
825
836
|
if _tmp
|
826
837
|
text = get_text(_text_start)
|
827
838
|
end
|
@@ -848,7 +859,7 @@ class KPeg::FormatParser
|
|
848
859
|
break
|
849
860
|
end
|
850
861
|
_text_start = self.pos
|
851
|
-
_tmp = scan(/\
|
862
|
+
_tmp = scan(/\G(?i-mx:[a-f\d]{2})/)
|
852
863
|
if _tmp
|
853
864
|
text = get_text(_text_start)
|
854
865
|
end
|
@@ -879,7 +890,7 @@ class KPeg::FormatParser
|
|
879
890
|
_save = self.pos
|
880
891
|
while true # sequence
|
881
892
|
_text_start = self.pos
|
882
|
-
_tmp = scan(/\
|
893
|
+
_tmp = scan(/\G(?-mix:[^\\"]+)/)
|
883
894
|
if _tmp
|
884
895
|
text = get_text(_text_start)
|
885
896
|
end
|
@@ -1017,7 +1028,7 @@ class KPeg::FormatParser
|
|
1017
1028
|
_save = self.pos
|
1018
1029
|
while true # sequence
|
1019
1030
|
_text_start = self.pos
|
1020
|
-
_tmp = scan(/\
|
1031
|
+
_tmp = scan(/\G(?-mix:[^'])/)
|
1021
1032
|
if _tmp
|
1022
1033
|
text = get_text(_text_start)
|
1023
1034
|
end
|
@@ -1142,7 +1153,7 @@ class KPeg::FormatParser
|
|
1142
1153
|
_tmp = match_string("\\/")
|
1143
1154
|
break if _tmp
|
1144
1155
|
self.pos = _save2
|
1145
|
-
_tmp = scan(/\
|
1156
|
+
_tmp = scan(/\G(?-mix:[^\/])/)
|
1146
1157
|
break if _tmp
|
1147
1158
|
self.pos = _save2
|
1148
1159
|
break
|
@@ -1156,7 +1167,7 @@ class KPeg::FormatParser
|
|
1156
1167
|
_tmp = match_string("\\/")
|
1157
1168
|
break if _tmp
|
1158
1169
|
self.pos = _save3
|
1159
|
-
_tmp = scan(/\
|
1170
|
+
_tmp = scan(/\G(?-mix:[^\/])/)
|
1160
1171
|
break if _tmp
|
1161
1172
|
self.pos = _save3
|
1162
1173
|
break
|
@@ -1269,7 +1280,7 @@ class KPeg::FormatParser
|
|
1269
1280
|
_save = self.pos
|
1270
1281
|
while true # sequence
|
1271
1282
|
_text_start = self.pos
|
1272
|
-
_tmp = scan(/\
|
1283
|
+
_tmp = scan(/\G(?i-mx:[a-z\d])/)
|
1273
1284
|
if _tmp
|
1274
1285
|
text = get_text(_text_start)
|
1275
1286
|
end
|
@@ -1339,7 +1350,7 @@ class KPeg::FormatParser
|
|
1339
1350
|
_save = self.pos
|
1340
1351
|
while true # sequence
|
1341
1352
|
_text_start = self.pos
|
1342
|
-
_tmp = scan(/\
|
1353
|
+
_tmp = scan(/\G(?-mix:[1-9]\d*)/)
|
1343
1354
|
if _tmp
|
1344
1355
|
text = get_text(_text_start)
|
1345
1356
|
end
|
@@ -1514,7 +1525,7 @@ class KPeg::FormatParser
|
|
1514
1525
|
return _tmp
|
1515
1526
|
end
|
1516
1527
|
|
1517
|
-
# curly = "{" < (/[^{}"']+/ | string | curly)* > "}" { @g.action(text) }
|
1528
|
+
# curly = "{" < (spaces | /[^{}"']+/ | string | curly)* > "}" { @g.action(text) }
|
1518
1529
|
def _curly
|
1519
1530
|
|
1520
1531
|
_save = self.pos
|
@@ -1529,7 +1540,10 @@ class KPeg::FormatParser
|
|
1529
1540
|
|
1530
1541
|
_save2 = self.pos
|
1531
1542
|
while true # choice
|
1532
|
-
_tmp =
|
1543
|
+
_tmp = apply(:_spaces)
|
1544
|
+
break if _tmp
|
1545
|
+
self.pos = _save2
|
1546
|
+
_tmp = scan(/\G(?-mix:[^{}"']+)/)
|
1533
1547
|
break if _tmp
|
1534
1548
|
self.pos = _save2
|
1535
1549
|
_tmp = apply(:_string)
|
@@ -1582,7 +1596,7 @@ class KPeg::FormatParser
|
|
1582
1596
|
|
1583
1597
|
_save2 = self.pos
|
1584
1598
|
while true # choice
|
1585
|
-
_tmp = scan(/\
|
1599
|
+
_tmp = scan(/\G(?-mix:[^()"']+)/)
|
1586
1600
|
break if _tmp
|
1587
1601
|
self.pos = _save2
|
1588
1602
|
_tmp = apply(:_string)
|
@@ -2619,7 +2633,7 @@ class KPeg::FormatParser
|
|
2619
2633
|
break
|
2620
2634
|
end
|
2621
2635
|
_text_start = self.pos
|
2622
|
-
_tmp = scan(/\
|
2636
|
+
_tmp = scan(/\G(?-mix:[:\w]+)/)
|
2623
2637
|
if _tmp
|
2624
2638
|
text = get_text(_text_start)
|
2625
2639
|
end
|
@@ -2917,7 +2931,7 @@ class KPeg::FormatParser
|
|
2917
2931
|
_save = self.pos
|
2918
2932
|
while true # sequence
|
2919
2933
|
_text_start = self.pos
|
2920
|
-
_tmp = scan(/\
|
2934
|
+
_tmp = scan(/\G(?-mix:[A-Z]\w*)/)
|
2921
2935
|
if _tmp
|
2922
2936
|
text = get_text(_text_start)
|
2923
2937
|
end
|
@@ -2943,7 +2957,7 @@ class KPeg::FormatParser
|
|
2943
2957
|
_save = self.pos
|
2944
2958
|
while true # sequence
|
2945
2959
|
_text_start = self.pos
|
2946
|
-
_tmp = scan(/\
|
2960
|
+
_tmp = scan(/\G(?i-mx:[a-z_]\w*)/)
|
2947
2961
|
if _tmp
|
2948
2962
|
text = get_text(_text_start)
|
2949
2963
|
end
|
@@ -3160,7 +3174,7 @@ class KPeg::FormatParser
|
|
3160
3174
|
Rules[:_range_elem] = rule_info("range_elem", "< (range_num | kleene) > { text }")
|
3161
3175
|
Rules[:_mult_range] = rule_info("mult_range", "(\"[\" - range_elem:l - \",\" - range_elem:r - \"]\" { [l == \"*\" ? nil : l.to_i, r == \"*\" ? nil : r.to_i] } | \"[\" - range_num:e - \"]\" { [e.to_i, e.to_i] })")
|
3162
3176
|
Rules[:_curly_block] = rule_info("curly_block", "curly")
|
3163
|
-
Rules[:_curly] = rule_info("curly", "\"{\" < (/[^{}\"']+/ | string | curly)* > \"}\" { @g.action(text) }")
|
3177
|
+
Rules[:_curly] = rule_info("curly", "\"{\" < (spaces | /[^{}\"']+/ | string | curly)* > \"}\" { @g.action(text) }")
|
3164
3178
|
Rules[:_nested_paren] = rule_info("nested_paren", "\"(\" (/[^()\"']+/ | string | nested_paren)* \")\"")
|
3165
3179
|
Rules[:_value] = rule_info("value", "(value:v \":\" var:n { @g.t(v,n) } | value:v \"?\" { @g.maybe(v) } | value:v \"+\" { @g.many(v) } | value:v \"*\" { @g.kleene(v) } | value:v mult_range:r { @g.multiple(v, *r) } | \"&\" value:v { @g.andp(v) } | \"!\" value:v { @g.notp(v) } | \"(\" - expression:o - \")\" { o } | \"@<\" - expression:o - \">\" { @g.bounds(o) } | \"<\" - expression:o - \">\" { @g.collect(o) } | curly_block | \"~\" method:m < nested_paren? > { @g.action(\"\#{m}\#{text}\") } | \".\" { @g.dot } | \"@\" var:name < nested_paren? > !(- \"=\") { @g.invoke(name, text.empty? ? nil : text) } | \"^\" var:name < nested_paren? > { @g.foreign_invoke(\"parent\", name, text) } | \"%\" var:gram \".\" var:name < nested_paren? > { @g.foreign_invoke(gram, name, text) } | var:name < nested_paren? > !(- \"=\") { @g.ref(name, nil, text.empty? ? nil : text) } | char_range | regexp | string)")
|
3166
3180
|
Rules[:_spaces] = rule_info("spaces", "(space | comment)+")
|
data/lib/kpeg/position.rb
CHANGED
@@ -10,17 +10,32 @@ module KPeg
|
|
10
10
|
target + 1
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
if [].respond_to? :bsearch_index
|
14
|
+
def current_line(target=pos)
|
15
|
+
unless @line_offsets
|
16
|
+
@line_offsets = []
|
17
|
+
total = 0
|
18
|
+
string.each_line do |line|
|
19
|
+
total += line.size
|
20
|
+
@line_offsets << total
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@line_offsets.bsearch_index {|x| x >= target } + 1 || -1
|
25
|
+
end
|
26
|
+
else
|
27
|
+
def current_line(target=pos)
|
28
|
+
cur_offset = 0
|
29
|
+
cur_line = 0
|
30
|
+
|
31
|
+
string.each_line do |line|
|
32
|
+
cur_line += 1
|
33
|
+
cur_offset += line.size
|
34
|
+
return cur_line if cur_offset >= target
|
35
|
+
end
|
36
|
+
|
37
|
+
-1
|
21
38
|
end
|
22
|
-
|
23
|
-
-1
|
24
39
|
end
|
25
40
|
|
26
41
|
def lines
|
data/lib/kpeg/string_escape.rb
CHANGED
@@ -18,6 +18,7 @@ class KPeg::StringEscape
|
|
18
18
|
@result = nil
|
19
19
|
@failed_rule = nil
|
20
20
|
@failing_rule_offset = -1
|
21
|
+
@line_offsets = nil
|
21
22
|
|
22
23
|
setup_foreign_grammar
|
23
24
|
end
|
@@ -34,17 +35,32 @@ class KPeg::StringEscape
|
|
34
35
|
target + 1
|
35
36
|
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
if [].respond_to? :bsearch_index
|
39
|
+
def current_line(target=pos)
|
40
|
+
unless @line_offsets
|
41
|
+
@line_offsets = []
|
42
|
+
total = 0
|
43
|
+
string.each_line do |line|
|
44
|
+
total += line.size
|
45
|
+
@line_offsets << total
|
46
|
+
end
|
47
|
+
end
|
40
48
|
|
41
|
-
|
42
|
-
cur_line += 1
|
43
|
-
cur_offset += line.size
|
44
|
-
return cur_line if cur_offset >= target
|
49
|
+
@line_offsets.bsearch_index {|x| x >= target } + 1 || -1
|
45
50
|
end
|
51
|
+
else
|
52
|
+
def current_line(target=pos)
|
53
|
+
cur_offset = 0
|
54
|
+
cur_line = 0
|
55
|
+
|
56
|
+
string.each_line do |line|
|
57
|
+
cur_line += 1
|
58
|
+
cur_offset += line.size
|
59
|
+
return cur_line if cur_offset >= target
|
60
|
+
end
|
46
61
|
|
47
|
-
|
62
|
+
-1
|
63
|
+
end
|
48
64
|
end
|
49
65
|
|
50
66
|
def lines
|
@@ -163,9 +179,8 @@ class KPeg::StringEscape
|
|
163
179
|
end
|
164
180
|
|
165
181
|
def scan(reg)
|
166
|
-
if m = reg.match(@string
|
167
|
-
|
168
|
-
@pos += width
|
182
|
+
if m = reg.match(@string, @pos)
|
183
|
+
@pos = m.end(0)
|
169
184
|
return true
|
170
185
|
end
|
171
186
|
|
@@ -278,8 +293,6 @@ class KPeg::StringEscape
|
|
278
293
|
else
|
279
294
|
return ans
|
280
295
|
end
|
281
|
-
|
282
|
-
return ans
|
283
296
|
end
|
284
297
|
end
|
285
298
|
|
@@ -312,8 +325,6 @@ class KPeg::StringEscape
|
|
312
325
|
else
|
313
326
|
return ans
|
314
327
|
end
|
315
|
-
|
316
|
-
return ans
|
317
328
|
end
|
318
329
|
end
|
319
330
|
|
@@ -371,7 +382,7 @@ class KPeg::StringEscape
|
|
371
382
|
_save1 = self.pos
|
372
383
|
while true # sequence
|
373
384
|
_text_start = self.pos
|
374
|
-
_tmp = scan(/\
|
385
|
+
_tmp = scan(/\G(?-mix:[\w ]+)/)
|
375
386
|
if _tmp
|
376
387
|
text = get_text(_text_start)
|
377
388
|
end
|
data/lib/kpeg.rb
CHANGED
@@ -80,7 +80,7 @@ class Test < KPeg::CompiledParser
|
|
80
80
|
|
81
81
|
# root = /[0-9]/
|
82
82
|
def _root
|
83
|
-
_tmp = scan(/\\
|
83
|
+
_tmp = scan(/\\G(?-mix:[0-9])/)
|
84
84
|
set_failed_rule :_root unless _tmp
|
85
85
|
return _tmp
|
86
86
|
end
|
@@ -114,7 +114,7 @@ class Test < KPeg::CompiledParser
|
|
114
114
|
|
115
115
|
# root = /./
|
116
116
|
def _root
|
117
|
-
_tmp = scan(/\\
|
117
|
+
_tmp = scan(/\\G(?-mix:.)/)
|
118
118
|
set_failed_rule :_root unless _tmp
|
119
119
|
return _tmp
|
120
120
|
end
|
@@ -133,7 +133,7 @@ class Test < KPeg::CompiledParser
|
|
133
133
|
|
134
134
|
# root = /./u
|
135
135
|
def _root
|
136
|
-
_tmp = scan(/\\
|
136
|
+
_tmp = scan(/\\G(?-mix:.)/u)
|
137
137
|
set_failed_rule :_root unless _tmp
|
138
138
|
return _tmp
|
139
139
|
end
|
@@ -7,6 +7,7 @@ class TestKPegCompiledParser < Minitest::Test
|
|
7
7
|
|
8
8
|
gram = <<-GRAM
|
9
9
|
letter = [a-z]
|
10
|
+
number = [0-9]
|
10
11
|
root = letter
|
11
12
|
GRAM
|
12
13
|
|
@@ -14,7 +15,7 @@ class TestKPegCompiledParser < Minitest::Test
|
|
14
15
|
|
15
16
|
gram = <<-GRAM
|
16
17
|
%test = TestKPegCompiledParser::TestParser
|
17
|
-
root = %test.letter "!"
|
18
|
+
root = %test.letter %test.number? "!"
|
18
19
|
GRAM
|
19
20
|
|
20
21
|
KPeg.compile gram, "CompTestParser", self
|
@@ -78,4 +79,12 @@ class TestKPegCompiledParser < Minitest::Test
|
|
78
79
|
assert_equal expected, r.failure_oneline
|
79
80
|
end
|
80
81
|
|
82
|
+
def test_composite_two_char_error
|
83
|
+
r = CompTestParser.new "aa"
|
84
|
+
assert_nil r.parse, "should not parse"
|
85
|
+
|
86
|
+
expected = "@1:2 failed rule 'TestKPegCompiledParser::TestParser#_number', got 'a'"
|
87
|
+
assert_equal expected, r.failure_oneline
|
88
|
+
end
|
89
|
+
|
81
90
|
end
|
data/test/test_kpeg_format.rb
CHANGED
@@ -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
|
metadata
CHANGED
@@ -1,57 +1,63 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kpeg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Phoenix
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '5.
|
19
|
+
version: '5.14'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '5.
|
26
|
+
version: '5.14'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rdoc
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '4.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '7'
|
34
37
|
type: :development
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
|
-
- -
|
41
|
+
- - ">="
|
39
42
|
- !ruby/object:Gem::Version
|
40
43
|
version: '4.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '7'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: hoe
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
|
-
- - ~>
|
51
|
+
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
53
|
+
version: '3.23'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
|
-
- - ~>
|
58
|
+
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
60
|
+
version: '3.23'
|
55
61
|
description: |-
|
56
62
|
KPeg is a simple PEG library for Ruby. It provides an API as well as native
|
57
63
|
grammar to build the grammar.
|
@@ -70,10 +76,12 @@ extra_rdoc_files:
|
|
70
76
|
- Manifest.txt
|
71
77
|
- README.rdoc
|
72
78
|
- examples/phone_number/README.md
|
79
|
+
- examples/tiny_markdown/sample.md
|
73
80
|
- examples/upper/README.md
|
74
81
|
files:
|
75
|
-
- .autotest
|
76
|
-
- .
|
82
|
+
- ".autotest"
|
83
|
+
- ".hoeignore"
|
84
|
+
- Gemfile
|
77
85
|
- History.txt
|
78
86
|
- LICENSE
|
79
87
|
- Manifest.txt
|
@@ -91,6 +99,12 @@ files:
|
|
91
99
|
- examples/phone_number/README.md
|
92
100
|
- examples/phone_number/phone_number.kpeg
|
93
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
|
94
108
|
- examples/upper/README.md
|
95
109
|
- examples/upper/upper.kpeg
|
96
110
|
- examples/upper/upper.rb
|
@@ -116,42 +130,34 @@ files:
|
|
116
130
|
- test/test_kpeg_format_parser_round_trip.rb
|
117
131
|
- test/test_kpeg_grammar.rb
|
118
132
|
- test/test_kpeg_grammar_renderer.rb
|
133
|
+
- test/test_kpeg_string_escape.rb
|
119
134
|
- vim/syntax_kpeg/ftdetect/kpeg.vim
|
120
135
|
- vim/syntax_kpeg/syntax/kpeg.vim
|
121
|
-
- test/test_kpeg_string_escape.rb
|
122
|
-
- .gemtest
|
123
136
|
homepage: https://github.com/evanphx/kpeg
|
124
137
|
licenses:
|
125
138
|
- MIT
|
126
|
-
metadata:
|
127
|
-
|
139
|
+
metadata:
|
140
|
+
homepage_uri: https://github.com/evanphx/kpeg
|
141
|
+
bug_tracker_uri: https://github.com/evanphx/kpeg/issues
|
142
|
+
post_install_message:
|
128
143
|
rdoc_options:
|
129
|
-
- --main
|
144
|
+
- "--main"
|
130
145
|
- README.rdoc
|
131
146
|
require_paths:
|
132
147
|
- lib
|
133
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
134
149
|
requirements:
|
135
|
-
- -
|
150
|
+
- - ">="
|
136
151
|
- !ruby/object:Gem::Version
|
137
152
|
version: '0'
|
138
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
154
|
requirements:
|
140
|
-
- -
|
155
|
+
- - ">="
|
141
156
|
- !ruby/object:Gem::Version
|
142
157
|
version: '0'
|
143
158
|
requirements: []
|
144
|
-
|
145
|
-
|
146
|
-
signing_key:
|
159
|
+
rubygems_version: 3.2.15
|
160
|
+
signing_key:
|
147
161
|
specification_version: 4
|
148
162
|
summary: KPeg is a simple PEG library for Ruby
|
149
|
-
test_files:
|
150
|
-
- test/test_kpeg.rb
|
151
|
-
- test/test_kpeg_code_generator.rb
|
152
|
-
- test/test_kpeg_compiled_parser.rb
|
153
|
-
- test/test_kpeg_format.rb
|
154
|
-
- test/test_kpeg_format_parser_round_trip.rb
|
155
|
-
- test/test_kpeg_grammar.rb
|
156
|
-
- test/test_kpeg_grammar_renderer.rb
|
157
|
-
- test/test_kpeg_string_escape.rb
|
163
|
+
test_files: []
|
data/.gemtest
DELETED
File without changes
|
data/.travis.yml
DELETED
@@ -1,15 +0,0 @@
|
|
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
|