kpeg 1.0.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|