treetop 1.6.5 → 1.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/treetop/compiler/metagrammar.rb +32 -3
- data/lib/treetop/compiler/metagrammar.treetop +32 -3
- data/lib/treetop/compiler/node_classes/anything_symbol.rb +7 -3
- data/lib/treetop/compiler/node_classes/atomic_expression.rb +2 -2
- data/lib/treetop/compiler/node_classes/character_class.rb +5 -1
- data/lib/treetop/compiler/node_classes/choice.rb +3 -3
- data/lib/treetop/compiler/node_classes/nonterminal.rb +4 -0
- data/lib/treetop/compiler/node_classes/parenthesized_expression.rb +1 -1
- data/lib/treetop/compiler/node_classes/parsing_expression.rb +7 -8
- data/lib/treetop/compiler/node_classes/parsing_rule.rb +1 -1
- data/lib/treetop/compiler/node_classes/predicate.rb +6 -6
- data/lib/treetop/compiler/node_classes/predicate_block.rb +1 -1
- data/lib/treetop/compiler/node_classes/repetition.rb +14 -14
- data/lib/treetop/compiler/node_classes/sequence.rb +1 -1
- data/lib/treetop/compiler/node_classes/terminal.rb +32 -28
- data/lib/treetop/runtime/compiled_parser.rb +12 -12
- data/lib/treetop/runtime/syntax_node.rb +15 -15
- data/lib/treetop/runtime/terminal_parse_failure.rb +2 -2
- data/lib/treetop/runtime/terminal_syntax_node.rb +4 -4
- data/lib/treetop/version.rb +1 -1
- data/spec/compiler/anything_symbol_spec.rb +2 -2
- data/spec/compiler/character_class_spec.rb +3 -3
- data/spec/compiler/grammar_spec.rb +2 -2
- data/spec/compiler/not_predicate_spec.rb +6 -6
- data/spec/compiler/occurrence_range_spec.rb +4 -4
- data/spec/compiler/parenthesized_expression_spec.rb +5 -5
- data/spec/compiler/semantic_predicate_spec.rb +7 -7
- data/spec/compiler/terminal_spec.rb +6 -6
- data/spec/compiler/terminal_symbol_spec.rb +2 -2
- data/spec/runtime/compiled_parser_spec.rb +7 -7
- data/spec/spec_helper.rb +6 -1
- data/treetop.gemspec +12 -21
- metadata +8 -17
- data/spec/runtime/interval_skip_list/delete_spec.rb +0 -147
- data/spec/runtime/interval_skip_list/expire_range_spec.rb +0 -349
- data/spec/runtime/interval_skip_list/insert_and_delete_node_spec.rb +0 -385
- data/spec/runtime/interval_skip_list/insert_spec.rb +0 -660
- data/spec/runtime/interval_skip_list/interval_skip_list_spec.graffle +0 -6175
- data/spec/runtime/interval_skip_list/interval_skip_list_spec.rb +0 -58
- data/spec/runtime/interval_skip_list/palindromic_fixture.rb +0 -35
- data/spec/runtime/interval_skip_list/palindromic_fixture_spec.rb +0 -163
- data/spec/runtime/interval_skip_list/spec_helper.rb +0 -91
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6c63e11a7cd088f719f8fefa071cee15cceb8de
|
4
|
+
data.tar.gz: 4ab071ec035ca3d1e6348335643c2cb547c8426d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 742cb0ea64d92e63f27c0742881eefb6098ec36f2c492828d2f4626ce11935fc9702c8f1a10e8adbc1dbd33149b912c97f2341a4d01678efb2f0efb62038c4ee
|
7
|
+
data.tar.gz: b06ab49b6d5ec07dfffbc7403036073d1cc6557343d53c025b43f5ea7986dd8ba888ed552de57296ef12b526e38968f2c16930a47251b558283fde5d2b19aadd
|
@@ -1078,6 +1078,10 @@ module Treetop
|
|
1078
1078
|
def inline_modules
|
1079
1079
|
(alternatives.map {|alt| alt.inline_modules }).flatten
|
1080
1080
|
end
|
1081
|
+
|
1082
|
+
def inline_module
|
1083
|
+
nil
|
1084
|
+
end
|
1081
1085
|
end
|
1082
1086
|
|
1083
1087
|
def _nt_choice
|
@@ -1192,6 +1196,10 @@ module Treetop
|
|
1192
1196
|
parent_modules
|
1193
1197
|
end
|
1194
1198
|
|
1199
|
+
def inline_module
|
1200
|
+
node_class_declarations.inline_module
|
1201
|
+
end
|
1202
|
+
|
1195
1203
|
def inline_module_name
|
1196
1204
|
node_class_declarations.inline_module_name
|
1197
1205
|
end
|
@@ -1435,6 +1443,10 @@ module Treetop
|
|
1435
1443
|
atomic.inline_modules
|
1436
1444
|
end
|
1437
1445
|
|
1446
|
+
def inline_module
|
1447
|
+
atomic.inline_module
|
1448
|
+
end
|
1449
|
+
|
1438
1450
|
def inline_module_name
|
1439
1451
|
nil
|
1440
1452
|
end
|
@@ -1463,6 +1475,9 @@ module Treetop
|
|
1463
1475
|
def inline_modules
|
1464
1476
|
[]
|
1465
1477
|
end
|
1478
|
+
def inline_module
|
1479
|
+
nil
|
1480
|
+
end
|
1466
1481
|
end
|
1467
1482
|
|
1468
1483
|
module Primary4
|
@@ -1481,7 +1496,9 @@ module Treetop
|
|
1481
1496
|
|
1482
1497
|
module Primary5
|
1483
1498
|
def compile(address, builder, parent_expression=nil)
|
1484
|
-
|
1499
|
+
if node_class_declarations.inline_module && atomic.inline_module
|
1500
|
+
STDERR.puts "Extraneous module ignored after suffix: #{input[interval].inspect}"
|
1501
|
+
end
|
1485
1502
|
suffix.compile(address, builder, self)
|
1486
1503
|
end
|
1487
1504
|
|
@@ -1501,6 +1518,10 @@ module Treetop
|
|
1501
1518
|
atomic.inline_modules + parent_modules
|
1502
1519
|
end
|
1503
1520
|
|
1521
|
+
def inline_module
|
1522
|
+
node_class_declarations.inline_module
|
1523
|
+
end
|
1524
|
+
|
1504
1525
|
def inline_module_name
|
1505
1526
|
node_class_declarations.inline_module_name
|
1506
1527
|
end
|
@@ -1518,7 +1539,9 @@ module Treetop
|
|
1518
1539
|
|
1519
1540
|
module Primary7
|
1520
1541
|
def compile(address, builder, parent_expression=nil)
|
1521
|
-
|
1542
|
+
if node_class_declarations.inline_module && atomic.inline_module
|
1543
|
+
STDERR.puts "Extraneous module ignored with nested atomic: #{input[interval].inspect}"
|
1544
|
+
end
|
1522
1545
|
atomic.compile(address, builder, self)
|
1523
1546
|
end
|
1524
1547
|
|
@@ -1534,6 +1557,10 @@ module Treetop
|
|
1534
1557
|
atomic.inline_modules + parent_modules
|
1535
1558
|
end
|
1536
1559
|
|
1560
|
+
def inline_module
|
1561
|
+
node_class_declarations.inline_module
|
1562
|
+
end
|
1563
|
+
|
1537
1564
|
def inline_module_name
|
1538
1565
|
node_class_declarations.inline_module_name
|
1539
1566
|
end
|
@@ -2202,7 +2229,6 @@ module Treetop
|
|
2202
2229
|
node_class_expression.node_class_name
|
2203
2230
|
end
|
2204
2231
|
|
2205
|
-
# !!!! cjh !!!!!
|
2206
2232
|
def inline_modules
|
2207
2233
|
trailing_inline_module.inline_modules
|
2208
2234
|
end
|
@@ -2496,6 +2522,9 @@ module Treetop
|
|
2496
2522
|
def inline_modules
|
2497
2523
|
parsing_expression.inline_modules
|
2498
2524
|
end
|
2525
|
+
def inline_module
|
2526
|
+
parsing_expression.inline_module
|
2527
|
+
end
|
2499
2528
|
end
|
2500
2529
|
|
2501
2530
|
def _nt_parenthesized_expression
|
@@ -91,6 +91,10 @@ module Treetop
|
|
91
91
|
def inline_modules
|
92
92
|
(alternatives.map {|alt| alt.inline_modules }).flatten
|
93
93
|
end
|
94
|
+
|
95
|
+
def inline_module
|
96
|
+
nil
|
97
|
+
end
|
94
98
|
}
|
95
99
|
end
|
96
100
|
|
@@ -114,6 +118,10 @@ module Treetop
|
|
114
118
|
parent_modules
|
115
119
|
end
|
116
120
|
|
121
|
+
def inline_module
|
122
|
+
node_class_declarations.inline_module
|
123
|
+
end
|
124
|
+
|
117
125
|
def inline_module_name
|
118
126
|
node_class_declarations.inline_module_name
|
119
127
|
end
|
@@ -166,6 +174,10 @@ module Treetop
|
|
166
174
|
atomic.inline_modules
|
167
175
|
end
|
168
176
|
|
177
|
+
def inline_module
|
178
|
+
atomic.inline_module
|
179
|
+
end
|
180
|
+
|
169
181
|
def inline_module_name
|
170
182
|
nil
|
171
183
|
end
|
@@ -184,11 +196,16 @@ module Treetop
|
|
184
196
|
def inline_modules
|
185
197
|
[]
|
186
198
|
end
|
199
|
+
def inline_module
|
200
|
+
nil
|
201
|
+
end
|
187
202
|
}
|
188
203
|
/
|
189
204
|
atomic suffix node_class_declarations {
|
190
205
|
def compile(address, builder, parent_expression=nil)
|
191
|
-
|
206
|
+
if node_class_declarations.inline_module && atomic.inline_module
|
207
|
+
STDERR.puts "Extraneous module ignored after suffix: #{input[interval].inspect}"
|
208
|
+
end
|
192
209
|
suffix.compile(address, builder, self)
|
193
210
|
end
|
194
211
|
|
@@ -208,6 +225,10 @@ module Treetop
|
|
208
225
|
atomic.inline_modules + parent_modules
|
209
226
|
end
|
210
227
|
|
228
|
+
def inline_module
|
229
|
+
node_class_declarations.inline_module
|
230
|
+
end
|
231
|
+
|
211
232
|
def inline_module_name
|
212
233
|
node_class_declarations.inline_module_name
|
213
234
|
end
|
@@ -215,7 +236,9 @@ module Treetop
|
|
215
236
|
/
|
216
237
|
atomic node_class_declarations {
|
217
238
|
def compile(address, builder, parent_expression=nil)
|
218
|
-
|
239
|
+
if node_class_declarations.inline_module && atomic.inline_module
|
240
|
+
STDERR.puts "Extraneous module ignored with nested atomic: #{input[interval].inspect}"
|
241
|
+
end
|
219
242
|
atomic.compile(address, builder, self)
|
220
243
|
end
|
221
244
|
|
@@ -231,6 +254,10 @@ module Treetop
|
|
231
254
|
atomic.inline_modules + parent_modules
|
232
255
|
end
|
233
256
|
|
257
|
+
def inline_module
|
258
|
+
node_class_declarations.inline_module
|
259
|
+
end
|
260
|
+
|
234
261
|
def inline_module_name
|
235
262
|
node_class_declarations.inline_module_name
|
236
263
|
end
|
@@ -382,7 +409,6 @@ module Treetop
|
|
382
409
|
node_class_expression.node_class_name
|
383
410
|
end
|
384
411
|
|
385
|
-
# !!!! cjh !!!!!
|
386
412
|
def inline_modules
|
387
413
|
trailing_inline_module.inline_modules
|
388
414
|
end
|
@@ -425,6 +451,9 @@ module Treetop
|
|
425
451
|
def inline_modules
|
426
452
|
parsing_expression.inline_modules
|
427
453
|
end
|
454
|
+
def inline_module
|
455
|
+
parsing_expression.inline_module
|
456
|
+
end
|
428
457
|
}
|
429
458
|
end
|
430
459
|
|
@@ -5,8 +5,8 @@ module Treetop
|
|
5
5
|
super
|
6
6
|
builder.if__ "index < input_length" do
|
7
7
|
if address == 0 || decorated?
|
8
|
-
|
9
|
-
|
8
|
+
assign_result "instantiate_node(#{node_class_name},input, index...(index + 1))"
|
9
|
+
extend_result_with_inline_module parent_expression
|
10
10
|
else
|
11
11
|
assign_lazily_instantiated_node
|
12
12
|
end
|
@@ -19,7 +19,11 @@ module Treetop
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def expected
|
22
|
-
|
22
|
+
'"any character"'
|
23
|
+
end
|
24
|
+
|
25
|
+
def inline_module
|
26
|
+
nil
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
@@ -6,8 +6,8 @@ module Treetop
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def single_quote(string)
|
9
|
-
|
10
|
-
|
9
|
+
# Double any backslashes, then backslash any single-quotes:
|
10
|
+
"'#{string.gsub(/\\/) { '\\\\' }.gsub(/'/) { "\\'"}}'"
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -13,8 +13,8 @@ module Treetop
|
|
13
13
|
obtain_new_subexpression_address
|
14
14
|
alternatives.first.compile(subexpression_address, builder)
|
15
15
|
builder.if__ subexpression_success? do
|
16
|
-
|
17
|
-
|
16
|
+
# Undo lazy instantiation:
|
17
|
+
builder << "#{subexpression_result_var} = SyntaxNode.new(input, (index-1)...index) if #{subexpression_result_var} == true"
|
18
18
|
assign_result subexpression_result_var
|
19
19
|
extend_result_with_declared_module
|
20
20
|
extend_result_with_inline_module parent_expression
|
@@ -30,7 +30,7 @@ module Treetop
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def expected
|
33
|
-
|
33
|
+
'"(any alternative)"'
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -79,13 +79,12 @@ module Treetop
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def extend_result_with_inline_module parent_expression = nil
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
extend_result inline_module_name if inline_module_name
|
82
|
+
if parent_expression && parent_expression.parent_modules.size > 0
|
83
|
+
parent_expression.parent_modules.each do |inline|
|
84
|
+
extend_result inline.module_name
|
85
|
+
end
|
86
|
+
end
|
87
|
+
extend_result inline_module_name if inline_module_name
|
89
88
|
end
|
90
89
|
|
91
90
|
def reset_index
|
@@ -149,7 +148,7 @@ module Treetop
|
|
149
148
|
end
|
150
149
|
|
151
150
|
def expected
|
152
|
-
|
151
|
+
nil # Overridden for terminal parse failures
|
153
152
|
end
|
154
153
|
end
|
155
154
|
end
|
@@ -33,7 +33,7 @@ module Treetop
|
|
33
33
|
|
34
34
|
def generate_cache_lookup(builder)
|
35
35
|
builder.if_ "node_cache[:#{name}].has_key?(index)" do
|
36
|
-
|
36
|
+
cache_address = "node_cache[:#{name}][index]"
|
37
37
|
builder.assign 'cached', cache_address
|
38
38
|
builder.if_ "cached" do
|
39
39
|
# Handle lazily instantiated nodes:
|
@@ -36,15 +36,15 @@ module Treetop
|
|
36
36
|
class NotPredicate < Predicate
|
37
37
|
def when_success
|
38
38
|
assign_failure
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
if (e = parent.atomic.expected)
|
40
|
+
builder << "terminal_parse_failure(#{e}, true)"
|
41
|
+
end
|
42
42
|
end
|
43
43
|
|
44
44
|
def when_failure
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
if (e = parent.atomic.expected)
|
46
|
+
builder << "@terminal_failures.pop"
|
47
|
+
end
|
48
48
|
assign_success
|
49
49
|
end
|
50
50
|
end
|
@@ -65,7 +65,7 @@ module Treetop
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def expected
|
68
|
-
|
68
|
+
parent_expression.atomic.expected && '"at least one "+'+parent_expression.atomic.expected
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -78,30 +78,30 @@ module Treetop
|
|
78
78
|
builder.if__ "#{accumulator_var}.size < #{min.text_value}" do
|
79
79
|
reset_index
|
80
80
|
assign_failure start_index_var
|
81
|
-
|
81
|
+
end
|
82
82
|
builder.else_ do
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
clean_unsaturated
|
84
|
+
assign_and_extend_result parent_expression
|
85
|
+
end
|
86
86
|
else
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
clean_unsaturated
|
88
|
+
assign_and_extend_result parent_expression
|
89
|
+
end
|
90
90
|
|
91
91
|
end_comment(parent_expression)
|
92
92
|
end
|
93
93
|
|
94
94
|
# remove the last terminal_failure if we merely failed to reach the maximum
|
95
95
|
def clean_unsaturated
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
96
|
+
if !max.empty? && max.text_value.to_i > 0
|
97
|
+
builder.if_ "#{accumulator_var}.size < #{max.text_value}" do
|
98
|
+
builder << '@terminal_failures.pop' # Ignore the last failure.
|
99
|
+
end
|
100
|
+
end
|
101
101
|
end
|
102
102
|
|
103
103
|
def expected
|
104
|
-
|
104
|
+
parent_expression.atomic.expected && "at least #{min.text_value} "+parent_expression.atomic.expected
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -3,38 +3,38 @@ module Treetop
|
|
3
3
|
class Terminal < AtomicExpression
|
4
4
|
def compile(address, builder, parent_expression = nil)
|
5
5
|
super
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
6
|
+
# Handle modifiers:
|
7
|
+
insensitive = modifiers.text_value.include? 'i'
|
8
|
+
re = modifiers.text_value.include? 'r'
|
9
|
+
if re
|
10
|
+
grounded_regexp = "#{('\A'+eval(string)).inspect}"
|
11
|
+
cache_key = "'__#{modifiers.text_value}__'+(gr = #{grounded_regexp})"
|
12
|
+
re_modifiers = "#{insensitive ? 'Regexp::IGNORECASE' : 0}"
|
13
|
+
str = "@regexps[#{cache_key}] ||= Regexp.new(gr, #{re_modifiers})"
|
14
|
+
mode = ':regexp'
|
15
|
+
elsif insensitive
|
16
|
+
str = string.downcase
|
17
|
+
string_length = eval(str).length
|
18
|
+
mode = ':insens'
|
19
|
+
else
|
20
|
+
str = string
|
21
|
+
string_length = eval(str).length
|
22
|
+
mode = 'false'
|
23
|
+
end
|
24
24
|
|
25
25
|
builder.if__ "(match_len = has_terminal?(#{str}, #{mode}, index))" do
|
26
26
|
if address == 0 || decorated? || mode != 'false' || string_length > 1
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
assign_result "instantiate_node(#{node_class_name},input, index...(index + match_len))"
|
28
|
+
# debugger if parent_expression and parent_expression.inline_modules.size > 0
|
29
|
+
# extend_result_with_inline_module parent_expression
|
30
|
+
if parent_expression
|
31
|
+
parent_expression.inline_modules.each do |inline|
|
32
|
+
extend_result inline.module_name
|
33
|
+
end
|
34
|
+
end
|
35
35
|
else
|
36
36
|
assign_lazily_instantiated_node
|
37
|
-
|
37
|
+
end
|
38
38
|
builder << "@index += match_len"
|
39
39
|
end
|
40
40
|
builder.else_ do
|
@@ -44,7 +44,11 @@ module Treetop
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def expected
|
47
|
-
|
47
|
+
single_quote(string)
|
48
|
+
end
|
49
|
+
|
50
|
+
def inline_module
|
51
|
+
nil
|
48
52
|
end
|
49
53
|
end
|
50
54
|
end
|