myco 0.1.0.dev → 0.1.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 -7
- data/LICENSE +1 -1
- data/README.md +79 -0
- data/lib/myco/backtrace.rb +1 -1
- data/lib/myco/bootstrap/component.rb +78 -39
- data/lib/myco/bootstrap/find_constant.rb +12 -1
- data/lib/myco/bootstrap/instance.rb +5 -12
- data/lib/myco/bootstrap/meme.rb +176 -28
- data/lib/myco/bootstrap.my +8 -7
- data/lib/myco/code_loader.rb +332 -0
- data/lib/myco/command/inoculate.my +83 -0
- data/lib/myco/command.my +26 -26
- data/lib/myco/core/BasicDecorators.my +62 -0
- data/lib/myco/core/BasicObject.my +12 -34
- data/lib/myco/core/Decorator.my +1 -0
- data/lib/myco/core/FileToplevel.my +0 -3
- data/lib/myco/core/Myco.my +4 -0
- data/lib/myco/core/Object.my +6 -4
- data/lib/myco/eval.rb +17 -18
- data/lib/myco/misc.rb +16 -0
- data/lib/myco/parser/ast/argument_assembly.rb +76 -0
- data/lib/myco/parser/ast/array_assembly.rb +57 -0
- data/lib/myco/parser/ast/branch_operator.rb +73 -0
- data/lib/myco/parser/ast/constant_access.rb +4 -18
- data/lib/myco/parser/ast/constant_define.rb +3 -3
- data/lib/myco/parser/ast/constant_reopen.rb +12 -13
- data/lib/myco/parser/ast/declare_category.rb +8 -6
- data/lib/myco/parser/ast/declare_decorator.rb +4 -4
- data/lib/myco/parser/ast/declare_file.rb +4 -4
- data/lib/myco/parser/ast/declare_meme.rb +53 -11
- data/lib/myco/parser/ast/declare_object.rb +9 -7
- data/lib/myco/parser/ast/declare_string.rb +5 -5
- data/lib/myco/parser/ast/invoke.rb +18 -36
- data/lib/myco/parser/ast/invoke_method.rb +28 -0
- data/lib/myco/parser/ast/local_variable_access_ambiguous.rb +9 -13
- data/lib/myco/parser/ast/misc.rb +128 -33
- data/lib/myco/parser/ast/myco_module_scope.rb +26 -0
- data/lib/myco/parser/ast/quest.rb +3 -3
- data/lib/myco/parser/ast/to_ruby/array_assembly.rb +15 -0
- data/lib/myco/parser/ast/to_ruby/block.rb +14 -0
- data/lib/myco/parser/ast/to_ruby/block_pass.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/branch_operator.rb +9 -0
- data/lib/myco/parser/ast/to_ruby/constant_access.rb +10 -0
- data/lib/myco/parser/ast/to_ruby/constant_assignment.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/constant_define.rb +9 -0
- data/lib/myco/parser/ast/to_ruby/constant_reopen.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/declare_category.rb +7 -0
- data/lib/myco/parser/ast/to_ruby/declare_decorator.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/declare_file.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/declare_meme.rb +16 -0
- data/lib/myco/parser/ast/to_ruby/declare_object.rb +8 -0
- data/lib/myco/parser/ast/to_ruby/declare_string.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/dynamic_string.rb +14 -0
- data/lib/myco/parser/ast/to_ruby/dynamic_symbol.rb +7 -0
- data/lib/myco/parser/ast/to_ruby/eval_expression.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/false_literal.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/hash_literal.rb +16 -0
- data/lib/myco/parser/ast/to_ruby/invoke.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/invoke_method.rb +35 -0
- data/lib/myco/parser/ast/to_ruby/iter.rb +10 -0
- data/lib/myco/parser/ast/to_ruby/local_variable_access_ambiguous.rb +16 -0
- data/lib/myco/parser/ast/to_ruby/local_variable_assignment.rb +8 -0
- data/lib/myco/parser/ast/to_ruby/myco_module_scope.rb +8 -0
- data/lib/myco/parser/ast/to_ruby/null_literal.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/parameters.rb +60 -0
- data/lib/myco/parser/ast/to_ruby/quest.rb +13 -0
- data/lib/myco/parser/ast/to_ruby/return.rb +7 -0
- data/lib/myco/parser/ast/to_ruby/scoped_constant.rb +11 -0
- data/lib/myco/parser/ast/to_ruby/self.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/splat_value.rb +33 -0
- data/lib/myco/parser/ast/to_ruby/string_literal.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/symbol_literal.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/toplevel_constant.rb +11 -0
- data/lib/myco/parser/ast/to_ruby/true_literal.rb +6 -0
- data/lib/myco/parser/ast/to_ruby/void_literal.rb +6 -0
- data/lib/myco/parser/ast/to_ruby.rb +138 -0
- data/lib/myco/parser/ast.rb +6 -0
- data/lib/myco/parser/peg_parser.rb +361 -181
- data/lib/myco/parser.rb +27 -11
- data/lib/myco/tools/BasicCommand.my +42 -0
- data/lib/myco/tools/Generator.my +18 -0
- data/lib/myco/toolset.rb +0 -3
- data/lib/myco/version.rb +1 -4
- data/lib/myco.rb +2 -0
- metadata +230 -160
- data/lib/myco/parser/builder.output +0 -3995
- data/lib/myco/parser/builder.racc +0 -585
- data/lib/myco/parser/builder.rb +0 -1592
- data/lib/myco/parser/lexer.rb +0 -2306
- data/lib/myco/parser/lexer.rl +0 -393
- data/lib/myco/parser/lexer_char_classes.rl +0 -56
- data/lib/myco/parser/lexer_common.rb +0 -95
- data/lib/myco/parser/lexer_skeleton.rl +0 -154
- data/lib/myco/parser/peg_parser.kpeg +0 -759
- data/lib/myco/tools/OptionParser.my +0 -38
|
@@ -356,12 +356,12 @@ class CodeTools::PegParser
|
|
|
356
356
|
# :startdoc:
|
|
357
357
|
|
|
358
358
|
#%
|
|
359
|
-
attr_accessor :
|
|
359
|
+
attr_accessor :builder
|
|
360
360
|
attr_accessor :root_node
|
|
361
361
|
|
|
362
|
-
# Generate an AST::Node of the given type (generated by the @
|
|
362
|
+
# Generate an AST::Node of the given type (generated by the @builder)
|
|
363
363
|
def node type, locator, *args
|
|
364
|
-
@
|
|
364
|
+
@builder.__send__ type, locator, *args
|
|
365
365
|
end
|
|
366
366
|
|
|
367
367
|
# Generate a Token with the given type, text, and row_col
|
|
@@ -402,7 +402,25 @@ class CodeTools::PegParser
|
|
|
402
402
|
# TODO: rigorously test and refine
|
|
403
403
|
#
|
|
404
404
|
def encode_escapes str
|
|
405
|
-
str.gsub /\\(.)/ do
|
|
405
|
+
str.gsub /\\(.)/ do
|
|
406
|
+
case $1
|
|
407
|
+
when "a"; "\a" # \a 0x07 Bell or alert
|
|
408
|
+
when "b"; "\b" # \b 0x08 Backspace
|
|
409
|
+
# TODO: # \cx Control-x
|
|
410
|
+
# TODO: # \C-x Control-x
|
|
411
|
+
when "e"; "\e" # \e 0x1b Escape
|
|
412
|
+
when "f"; "\f" # \f 0x0c Formfeed
|
|
413
|
+
# TODO: # \M-\C-x Meta-Control-x
|
|
414
|
+
when "n"; "\n" # \n 0x0a Newline
|
|
415
|
+
# TODO: # \nnn Octal notation, where n is a digit
|
|
416
|
+
when "r"; "\r" # \r 0x0d Carriage return
|
|
417
|
+
when "s"; "\s" # \s 0x20 Space
|
|
418
|
+
when "t"; "\t" # \t 0x09 Tab
|
|
419
|
+
when "v"; "\v" # \v 0x0b Vertical tab
|
|
420
|
+
# TODO: # \xnn Hexadecimal notation, where n is a digit
|
|
421
|
+
else; "#{$1}"
|
|
422
|
+
end
|
|
423
|
+
end
|
|
406
424
|
end
|
|
407
425
|
|
|
408
426
|
# Given a node,op list ([node, op, node, op, ... node]) and operator types,
|
|
@@ -424,7 +442,7 @@ class CodeTools::PegParser
|
|
|
424
442
|
|
|
425
443
|
result = block_given? ?
|
|
426
444
|
yield(n0,op,n1) :
|
|
427
|
-
node(:
|
|
445
|
+
node(:invoke, op, n0, op.sym, node(:argass, n1, [n1]))
|
|
428
446
|
input.unshift result
|
|
429
447
|
else
|
|
430
448
|
output.push n0
|
|
@@ -437,44 +455,6 @@ class CodeTools::PegParser
|
|
|
437
455
|
|
|
438
456
|
input.replace output
|
|
439
457
|
end
|
|
440
|
-
|
|
441
|
-
# Given a locator and an node(:array), refactor the splat-related nodes
|
|
442
|
-
# in a copy of the original node body and return a replacement for the node.
|
|
443
|
-
#
|
|
444
|
-
def args_assemble loc, orig_node
|
|
445
|
-
list = orig_node.body.dup
|
|
446
|
-
tmp = []
|
|
447
|
-
|
|
448
|
-
special_type_check = Proc.new { |x|
|
|
449
|
-
case x
|
|
450
|
-
when Myco::ToolSet::AST::SplatValue; :splat
|
|
451
|
-
when Myco::ToolSet::AST::ConcatArgs; :argscat
|
|
452
|
-
when Myco::ToolSet::AST::PushArgs; :argspush
|
|
453
|
-
when Myco::ToolSet::AST::BlockPass; :block_pass
|
|
454
|
-
else; nil
|
|
455
|
-
end
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
# Get the original value in the new_node
|
|
459
|
-
tmp << list.shift until list.empty? or special_type_check.call(list.first)
|
|
460
|
-
new_node = tmp.empty? ? list.shift : node(:array, loc, tmp)
|
|
461
|
-
|
|
462
|
-
# Continue to reduce until all elements have been used
|
|
463
|
-
until list.empty?
|
|
464
|
-
arg = list.shift
|
|
465
|
-
type = special_type_check.call(arg)
|
|
466
|
-
if type == :block_pass
|
|
467
|
-
new_node = arg.tap { |n| n.arguments = new_node }
|
|
468
|
-
elsif type != nil
|
|
469
|
-
new_node = node(:argscat, loc, new_node, arg)
|
|
470
|
-
else
|
|
471
|
-
new_node = node(:argspush, loc, new_node, arg)
|
|
472
|
-
end
|
|
473
|
-
end
|
|
474
|
-
|
|
475
|
-
new_node || orig_node
|
|
476
|
-
end
|
|
477
|
-
|
|
478
458
|
|
|
479
459
|
|
|
480
460
|
# :stopdoc:
|
|
@@ -1718,7 +1698,7 @@ class CodeTools::PegParser
|
|
|
1718
1698
|
return _tmp
|
|
1719
1699
|
end
|
|
1720
1700
|
|
|
1721
|
-
# t_FLOAT = < c_num+ "." c_num+ > {token(:t_FLOAT, text)}
|
|
1701
|
+
# t_FLOAT = < "-"? c_num+ "." c_num+ > {token(:t_FLOAT, text)}
|
|
1722
1702
|
def _t_FLOAT
|
|
1723
1703
|
|
|
1724
1704
|
_save = self.pos
|
|
@@ -1728,6 +1708,16 @@ class CodeTools::PegParser
|
|
|
1728
1708
|
_save1 = self.pos
|
|
1729
1709
|
while true # sequence
|
|
1730
1710
|
_save2 = self.pos
|
|
1711
|
+
_tmp = match_string("-")
|
|
1712
|
+
unless _tmp
|
|
1713
|
+
_tmp = true
|
|
1714
|
+
self.pos = _save2
|
|
1715
|
+
end
|
|
1716
|
+
unless _tmp
|
|
1717
|
+
self.pos = _save1
|
|
1718
|
+
break
|
|
1719
|
+
end
|
|
1720
|
+
_save3 = self.pos
|
|
1731
1721
|
_tmp = apply(:_c_num)
|
|
1732
1722
|
if _tmp
|
|
1733
1723
|
while true
|
|
@@ -1736,7 +1726,7 @@ class CodeTools::PegParser
|
|
|
1736
1726
|
end
|
|
1737
1727
|
_tmp = true
|
|
1738
1728
|
else
|
|
1739
|
-
self.pos =
|
|
1729
|
+
self.pos = _save3
|
|
1740
1730
|
end
|
|
1741
1731
|
unless _tmp
|
|
1742
1732
|
self.pos = _save1
|
|
@@ -1747,7 +1737,7 @@ class CodeTools::PegParser
|
|
|
1747
1737
|
self.pos = _save1
|
|
1748
1738
|
break
|
|
1749
1739
|
end
|
|
1750
|
-
|
|
1740
|
+
_save4 = self.pos
|
|
1751
1741
|
_tmp = apply(:_c_num)
|
|
1752
1742
|
if _tmp
|
|
1753
1743
|
while true
|
|
@@ -1756,7 +1746,7 @@ class CodeTools::PegParser
|
|
|
1756
1746
|
end
|
|
1757
1747
|
_tmp = true
|
|
1758
1748
|
else
|
|
1759
|
-
self.pos =
|
|
1749
|
+
self.pos = _save4
|
|
1760
1750
|
end
|
|
1761
1751
|
unless _tmp
|
|
1762
1752
|
self.pos = _save1
|
|
@@ -1783,23 +1773,42 @@ class CodeTools::PegParser
|
|
|
1783
1773
|
return _tmp
|
|
1784
1774
|
end
|
|
1785
1775
|
|
|
1786
|
-
# t_INTEGER = < c_num+ > {token(:t_INTEGER, text)}
|
|
1776
|
+
# t_INTEGER = < "-"? c_num+ > {token(:t_INTEGER, text)}
|
|
1787
1777
|
def _t_INTEGER
|
|
1788
1778
|
|
|
1789
1779
|
_save = self.pos
|
|
1790
1780
|
while true # sequence
|
|
1791
1781
|
_text_start = self.pos
|
|
1782
|
+
|
|
1792
1783
|
_save1 = self.pos
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1784
|
+
while true # sequence
|
|
1785
|
+
_save2 = self.pos
|
|
1786
|
+
_tmp = match_string("-")
|
|
1787
|
+
unless _tmp
|
|
1788
|
+
_tmp = true
|
|
1789
|
+
self.pos = _save2
|
|
1798
1790
|
end
|
|
1799
|
-
_tmp
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1791
|
+
unless _tmp
|
|
1792
|
+
self.pos = _save1
|
|
1793
|
+
break
|
|
1794
|
+
end
|
|
1795
|
+
_save3 = self.pos
|
|
1796
|
+
_tmp = apply(:_c_num)
|
|
1797
|
+
if _tmp
|
|
1798
|
+
while true
|
|
1799
|
+
_tmp = apply(:_c_num)
|
|
1800
|
+
break unless _tmp
|
|
1801
|
+
end
|
|
1802
|
+
_tmp = true
|
|
1803
|
+
else
|
|
1804
|
+
self.pos = _save3
|
|
1805
|
+
end
|
|
1806
|
+
unless _tmp
|
|
1807
|
+
self.pos = _save1
|
|
1808
|
+
end
|
|
1809
|
+
break
|
|
1810
|
+
end # end sequence
|
|
1811
|
+
|
|
1803
1812
|
if _tmp
|
|
1804
1813
|
text = get_text(_text_start)
|
|
1805
1814
|
end
|
|
@@ -2232,6 +2241,84 @@ class CodeTools::PegParser
|
|
|
2232
2241
|
return _tmp
|
|
2233
2242
|
end
|
|
2234
2243
|
|
|
2244
|
+
# t_OP_AND_Q = < "&?" > {token(:t_OP_AND_Q, text)}
|
|
2245
|
+
def _t_OP_AND_Q
|
|
2246
|
+
|
|
2247
|
+
_save = self.pos
|
|
2248
|
+
while true # sequence
|
|
2249
|
+
_text_start = self.pos
|
|
2250
|
+
_tmp = match_string("&?")
|
|
2251
|
+
if _tmp
|
|
2252
|
+
text = get_text(_text_start)
|
|
2253
|
+
end
|
|
2254
|
+
unless _tmp
|
|
2255
|
+
self.pos = _save
|
|
2256
|
+
break
|
|
2257
|
+
end
|
|
2258
|
+
@result = begin; token(:t_OP_AND_Q, text); end
|
|
2259
|
+
_tmp = true
|
|
2260
|
+
unless _tmp
|
|
2261
|
+
self.pos = _save
|
|
2262
|
+
end
|
|
2263
|
+
break
|
|
2264
|
+
end # end sequence
|
|
2265
|
+
|
|
2266
|
+
set_failed_rule :_t_OP_AND_Q unless _tmp
|
|
2267
|
+
return _tmp
|
|
2268
|
+
end
|
|
2269
|
+
|
|
2270
|
+
# t_OP_OR_Q = < "|?" > {token(:t_OP_OR_Q, text)}
|
|
2271
|
+
def _t_OP_OR_Q
|
|
2272
|
+
|
|
2273
|
+
_save = self.pos
|
|
2274
|
+
while true # sequence
|
|
2275
|
+
_text_start = self.pos
|
|
2276
|
+
_tmp = match_string("|?")
|
|
2277
|
+
if _tmp
|
|
2278
|
+
text = get_text(_text_start)
|
|
2279
|
+
end
|
|
2280
|
+
unless _tmp
|
|
2281
|
+
self.pos = _save
|
|
2282
|
+
break
|
|
2283
|
+
end
|
|
2284
|
+
@result = begin; token(:t_OP_OR_Q, text); end
|
|
2285
|
+
_tmp = true
|
|
2286
|
+
unless _tmp
|
|
2287
|
+
self.pos = _save
|
|
2288
|
+
end
|
|
2289
|
+
break
|
|
2290
|
+
end # end sequence
|
|
2291
|
+
|
|
2292
|
+
set_failed_rule :_t_OP_OR_Q unless _tmp
|
|
2293
|
+
return _tmp
|
|
2294
|
+
end
|
|
2295
|
+
|
|
2296
|
+
# t_OP_VOID_Q = < "??" > {token(:t_OP_VOID_Q, text)}
|
|
2297
|
+
def _t_OP_VOID_Q
|
|
2298
|
+
|
|
2299
|
+
_save = self.pos
|
|
2300
|
+
while true # sequence
|
|
2301
|
+
_text_start = self.pos
|
|
2302
|
+
_tmp = match_string("??")
|
|
2303
|
+
if _tmp
|
|
2304
|
+
text = get_text(_text_start)
|
|
2305
|
+
end
|
|
2306
|
+
unless _tmp
|
|
2307
|
+
self.pos = _save
|
|
2308
|
+
break
|
|
2309
|
+
end
|
|
2310
|
+
@result = begin; token(:t_OP_VOID_Q, text); end
|
|
2311
|
+
_tmp = true
|
|
2312
|
+
unless _tmp
|
|
2313
|
+
self.pos = _save
|
|
2314
|
+
end
|
|
2315
|
+
break
|
|
2316
|
+
end # end sequence
|
|
2317
|
+
|
|
2318
|
+
set_failed_rule :_t_OP_VOID_Q unless _tmp
|
|
2319
|
+
return _tmp
|
|
2320
|
+
end
|
|
2321
|
+
|
|
2235
2322
|
# t_OP_COMPARE = < ("<=>" | "=~" | "==" | "<=" | ">=" | "<" | ">") > {token(:t_OP_COMPARE, text)}
|
|
2236
2323
|
def _t_OP_COMPARE
|
|
2237
2324
|
|
|
@@ -3426,7 +3513,7 @@ class CodeTools::PegParser
|
|
|
3426
3513
|
return _tmp
|
|
3427
3514
|
end
|
|
3428
3515
|
|
|
3429
|
-
# constant_list = constant:n0 (const_sep constant:n)*:nrest {node(:
|
|
3516
|
+
# constant_list = constant:n0 (const_sep constant:n)*:nrest {node(:arrass, n0, [n0, *nrest])}
|
|
3430
3517
|
def _constant_list
|
|
3431
3518
|
|
|
3432
3519
|
_save = self.pos
|
|
@@ -3465,7 +3552,7 @@ class CodeTools::PegParser
|
|
|
3465
3552
|
self.pos = _save
|
|
3466
3553
|
break
|
|
3467
3554
|
end
|
|
3468
|
-
@result = begin; node(:
|
|
3555
|
+
@result = begin; node(:arrass, n0, [n0, *nrest]); end
|
|
3469
3556
|
_tmp = true
|
|
3470
3557
|
unless _tmp
|
|
3471
3558
|
self.pos = _save
|
|
@@ -3673,11 +3760,16 @@ class CodeTools::PegParser
|
|
|
3673
3760
|
return _tmp
|
|
3674
3761
|
end
|
|
3675
3762
|
|
|
3676
|
-
# category_sepd_exprs = category_expr:n0 (arg_sep category_expr:n)*:nrest { [n0, *nrest] }
|
|
3763
|
+
# category_sepd_exprs = arg_sep category_expr:n0 (arg_sep category_expr:n)*:nrest { [n0, *nrest] }
|
|
3677
3764
|
def _category_sepd_exprs
|
|
3678
3765
|
|
|
3679
3766
|
_save = self.pos
|
|
3680
3767
|
while true # sequence
|
|
3768
|
+
_tmp = apply(:_arg_sep)
|
|
3769
|
+
unless _tmp
|
|
3770
|
+
self.pos = _save
|
|
3771
|
+
break
|
|
3772
|
+
end
|
|
3681
3773
|
_tmp = apply(:_category_expr)
|
|
3682
3774
|
n0 = @result
|
|
3683
3775
|
unless _tmp
|
|
@@ -3724,7 +3816,7 @@ class CodeTools::PegParser
|
|
|
3724
3816
|
return _tmp
|
|
3725
3817
|
end
|
|
3726
3818
|
|
|
3727
|
-
# category = category_name:n0
|
|
3819
|
+
# category = category_name:n0 category_sepd_exprs?:nlist &(arg_sep_opt (t_CATGRY_BEGIN | t_DECLARE_END)) {node(:category, n0, n0, (nlist ? node(:block, nlist.first, nlist) : node(:null, n0)))}
|
|
3728
3820
|
def _category
|
|
3729
3821
|
|
|
3730
3822
|
_save = self.pos
|
|
@@ -3735,11 +3827,6 @@ class CodeTools::PegParser
|
|
|
3735
3827
|
self.pos = _save
|
|
3736
3828
|
break
|
|
3737
3829
|
end
|
|
3738
|
-
_tmp = apply(:_arg_sep)
|
|
3739
|
-
unless _tmp
|
|
3740
|
-
self.pos = _save
|
|
3741
|
-
break
|
|
3742
|
-
end
|
|
3743
3830
|
_save1 = self.pos
|
|
3744
3831
|
_tmp = apply(:_category_sepd_exprs)
|
|
3745
3832
|
@result = nil unless _tmp
|
|
@@ -4294,7 +4381,7 @@ class CodeTools::PegParser
|
|
|
4294
4381
|
return _tmp
|
|
4295
4382
|
end
|
|
4296
4383
|
|
|
4297
|
-
# invoke_assignment = invoke_assignment_lhs:lhs c_spc_nl* t_ASSIGN:to c_spc_nl* assign_rhs:rhs { lhs.name = :"#{lhs.name}=" orig_arguments = lhs.arguments && lhs.arguments.body || [] lhs.
|
|
4384
|
+
# invoke_assignment = invoke_assignment_lhs:lhs c_spc_nl* t_ASSIGN:to c_spc_nl* assign_rhs:rhs { lhs.name = :"#{lhs.name}=" orig_arguments = lhs.arguments && lhs.arguments.body || [] arg_order = lhs.name==:"[]=" ? [*orig_arguments, rhs] : [rhs, *orig_arguments] lhs.arguments = node(:argass, rhs, arg_order) lhs }
|
|
4298
4385
|
def _invoke_assignment
|
|
4299
4386
|
|
|
4300
4387
|
_save = self.pos
|
|
@@ -4338,7 +4425,8 @@ class CodeTools::PegParser
|
|
|
4338
4425
|
@result = begin;
|
|
4339
4426
|
lhs.name = :"#{lhs.name}="
|
|
4340
4427
|
orig_arguments = lhs.arguments && lhs.arguments.body || []
|
|
4341
|
-
lhs.
|
|
4428
|
+
arg_order = lhs.name==:"[]=" ? [*orig_arguments, rhs] : [rhs, *orig_arguments]
|
|
4429
|
+
lhs.arguments = node(:argass, rhs, arg_order)
|
|
4342
4430
|
lhs
|
|
4343
4431
|
; end
|
|
4344
4432
|
_tmp = true
|
|
@@ -4415,7 +4503,7 @@ class CodeTools::PegParser
|
|
|
4415
4503
|
return _tmp
|
|
4416
4504
|
end
|
|
4417
4505
|
|
|
4418
|
-
# invoke = t_IDENTIFIER:tn (
|
|
4506
|
+
# invoke = t_IDENTIFIER:tn (c_spc* arg_list:na)?:na (c_spc_nl* invoke_body:n)?:nlist {node(:invoke, tn, nil, tn.sym, na, *nlist)}
|
|
4419
4507
|
def _invoke
|
|
4420
4508
|
|
|
4421
4509
|
_save = self.pos
|
|
@@ -4431,7 +4519,7 @@ class CodeTools::PegParser
|
|
|
4431
4519
|
_save2 = self.pos
|
|
4432
4520
|
while true # sequence
|
|
4433
4521
|
while true
|
|
4434
|
-
_tmp = apply(:
|
|
4522
|
+
_tmp = apply(:_c_spc)
|
|
4435
4523
|
break unless _tmp
|
|
4436
4524
|
end
|
|
4437
4525
|
_tmp = true
|
|
@@ -4500,7 +4588,14 @@ class CodeTools::PegParser
|
|
|
4500
4588
|
return _tmp
|
|
4501
4589
|
end
|
|
4502
4590
|
|
|
4503
|
-
#
|
|
4591
|
+
# op_invoke_id = left_op_normal
|
|
4592
|
+
def _op_invoke_id
|
|
4593
|
+
_tmp = apply(:_left_op_normal)
|
|
4594
|
+
set_failed_rule :_op_invoke_id unless _tmp
|
|
4595
|
+
return _tmp
|
|
4596
|
+
end
|
|
4597
|
+
|
|
4598
|
+
# op_invoke = op_invoke_id:tn (c_spc* arg_list:na)?:na (c_spc_nl* invoke_body:n)?:nlist {node(:invoke, tn, nil, tn.sym, na, *nlist)}
|
|
4504
4599
|
def _op_invoke
|
|
4505
4600
|
|
|
4506
4601
|
_save = self.pos
|
|
@@ -4516,7 +4611,7 @@ class CodeTools::PegParser
|
|
|
4516
4611
|
_save2 = self.pos
|
|
4517
4612
|
while true # sequence
|
|
4518
4613
|
while true
|
|
4519
|
-
_tmp = apply(:
|
|
4614
|
+
_tmp = apply(:_c_spc)
|
|
4520
4615
|
break unless _tmp
|
|
4521
4616
|
end
|
|
4522
4617
|
_tmp = true
|
|
@@ -4585,10 +4680,57 @@ class CodeTools::PegParser
|
|
|
4585
4680
|
return _tmp
|
|
4586
4681
|
end
|
|
4587
4682
|
|
|
4588
|
-
#
|
|
4589
|
-
def
|
|
4590
|
-
|
|
4591
|
-
|
|
4683
|
+
# elem_invoke = lit_array:na (c_spc_nl* invoke_body:n)?:nlist {node(:invoke, na, nil, :"[]", node(:argass, na, na.body), *nlist)}
|
|
4684
|
+
def _elem_invoke
|
|
4685
|
+
|
|
4686
|
+
_save = self.pos
|
|
4687
|
+
while true # sequence
|
|
4688
|
+
_tmp = apply(:_lit_array)
|
|
4689
|
+
na = @result
|
|
4690
|
+
unless _tmp
|
|
4691
|
+
self.pos = _save
|
|
4692
|
+
break
|
|
4693
|
+
end
|
|
4694
|
+
_save1 = self.pos
|
|
4695
|
+
|
|
4696
|
+
_save2 = self.pos
|
|
4697
|
+
while true # sequence
|
|
4698
|
+
while true
|
|
4699
|
+
_tmp = apply(:_c_spc_nl)
|
|
4700
|
+
break unless _tmp
|
|
4701
|
+
end
|
|
4702
|
+
_tmp = true
|
|
4703
|
+
unless _tmp
|
|
4704
|
+
self.pos = _save2
|
|
4705
|
+
break
|
|
4706
|
+
end
|
|
4707
|
+
_tmp = apply(:_invoke_body)
|
|
4708
|
+
n = @result
|
|
4709
|
+
unless _tmp
|
|
4710
|
+
self.pos = _save2
|
|
4711
|
+
end
|
|
4712
|
+
break
|
|
4713
|
+
end # end sequence
|
|
4714
|
+
|
|
4715
|
+
@result = nil unless _tmp
|
|
4716
|
+
unless _tmp
|
|
4717
|
+
_tmp = true
|
|
4718
|
+
self.pos = _save1
|
|
4719
|
+
end
|
|
4720
|
+
nlist = @result
|
|
4721
|
+
unless _tmp
|
|
4722
|
+
self.pos = _save
|
|
4723
|
+
break
|
|
4724
|
+
end
|
|
4725
|
+
@result = begin; node(:invoke, na, nil, :"[]", node(:argass, na, na.body), *nlist); end
|
|
4726
|
+
_tmp = true
|
|
4727
|
+
unless _tmp
|
|
4728
|
+
self.pos = _save
|
|
4729
|
+
end
|
|
4730
|
+
break
|
|
4731
|
+
end # end sequence
|
|
4732
|
+
|
|
4733
|
+
set_failed_rule :_elem_invoke unless _tmp
|
|
4592
4734
|
return _tmp
|
|
4593
4735
|
end
|
|
4594
4736
|
|
|
@@ -5156,7 +5298,7 @@ class CodeTools::PegParser
|
|
|
5156
5298
|
return _tmp
|
|
5157
5299
|
end
|
|
5158
5300
|
|
|
5159
|
-
# arg_list = (t_ARGS_BEGIN:tb arg_sep_opt t_ARGS_END {
|
|
5301
|
+
# arg_list = (t_ARGS_BEGIN:tb arg_sep_opt t_ARGS_END {node(:argass, tb, [])} | t_ARGS_BEGIN:tb arg_sep_opt in_arg_list:nlist arg_sep_opt t_ARGS_END {node(:argass, tb, nlist)})
|
|
5160
5302
|
def _arg_list
|
|
5161
5303
|
|
|
5162
5304
|
_save = self.pos
|
|
@@ -5180,7 +5322,7 @@ class CodeTools::PegParser
|
|
|
5180
5322
|
self.pos = _save1
|
|
5181
5323
|
break
|
|
5182
5324
|
end
|
|
5183
|
-
@result = begin;
|
|
5325
|
+
@result = begin; node(:argass, tb, []); end
|
|
5184
5326
|
_tmp = true
|
|
5185
5327
|
unless _tmp
|
|
5186
5328
|
self.pos = _save1
|
|
@@ -5220,7 +5362,7 @@ class CodeTools::PegParser
|
|
|
5220
5362
|
self.pos = _save2
|
|
5221
5363
|
break
|
|
5222
5364
|
end
|
|
5223
|
-
@result = begin;
|
|
5365
|
+
@result = begin; node(:argass, tb, nlist); end
|
|
5224
5366
|
_tmp = true
|
|
5225
5367
|
unless _tmp
|
|
5226
5368
|
self.pos = _save2
|
|
@@ -5237,7 +5379,7 @@ class CodeTools::PegParser
|
|
|
5237
5379
|
return _tmp
|
|
5238
5380
|
end
|
|
5239
5381
|
|
|
5240
|
-
# lit_array = (t_ARRAY_BEGIN:tb arg_sep_opt t_ARRAY_END {
|
|
5382
|
+
# lit_array = (t_ARRAY_BEGIN:tb arg_sep_opt t_ARRAY_END {node(:arrass, tb, [])} | t_ARRAY_BEGIN:tb arg_sep_opt in_arg_list:nlist arg_sep_opt t_ARRAY_END {node(:arrass, tb, nlist)})
|
|
5241
5383
|
def _lit_array
|
|
5242
5384
|
|
|
5243
5385
|
_save = self.pos
|
|
@@ -5261,7 +5403,7 @@ class CodeTools::PegParser
|
|
|
5261
5403
|
self.pos = _save1
|
|
5262
5404
|
break
|
|
5263
5405
|
end
|
|
5264
|
-
@result = begin;
|
|
5406
|
+
@result = begin; node(:arrass, tb, []); end
|
|
5265
5407
|
_tmp = true
|
|
5266
5408
|
unless _tmp
|
|
5267
5409
|
self.pos = _save1
|
|
@@ -5301,7 +5443,7 @@ class CodeTools::PegParser
|
|
|
5301
5443
|
self.pos = _save2
|
|
5302
5444
|
break
|
|
5303
5445
|
end
|
|
5304
|
-
@result = begin;
|
|
5446
|
+
@result = begin; node(:arrass, tb, nlist); end
|
|
5305
5447
|
_tmp = true
|
|
5306
5448
|
unless _tmp
|
|
5307
5449
|
self.pos = _save2
|
|
@@ -5721,8 +5863,8 @@ class CodeTools::PegParser
|
|
|
5721
5863
|
return _tmp
|
|
5722
5864
|
end
|
|
5723
5865
|
|
|
5724
|
-
#
|
|
5725
|
-
def
|
|
5866
|
+
# left_op_normal = (t_OP_EXP | t_OP_MULT | t_OP_DIV | t_OP_MOD | t_OP_PLUS | t_OP_MINUS | t_OP_COMPARE)
|
|
5867
|
+
def _left_op_normal
|
|
5726
5868
|
|
|
5727
5869
|
_save = self.pos
|
|
5728
5870
|
while true # choice
|
|
@@ -5747,12 +5889,51 @@ class CodeTools::PegParser
|
|
|
5747
5889
|
_tmp = apply(:_t_OP_COMPARE)
|
|
5748
5890
|
break if _tmp
|
|
5749
5891
|
self.pos = _save
|
|
5892
|
+
break
|
|
5893
|
+
end # end choice
|
|
5894
|
+
|
|
5895
|
+
set_failed_rule :_left_op_normal unless _tmp
|
|
5896
|
+
return _tmp
|
|
5897
|
+
end
|
|
5898
|
+
|
|
5899
|
+
# left_op_branch = (t_OP_AND | t_OP_OR | t_OP_AND_Q | t_OP_OR_Q | t_OP_VOID_Q)
|
|
5900
|
+
def _left_op_branch
|
|
5901
|
+
|
|
5902
|
+
_save = self.pos
|
|
5903
|
+
while true # choice
|
|
5750
5904
|
_tmp = apply(:_t_OP_AND)
|
|
5751
5905
|
break if _tmp
|
|
5752
5906
|
self.pos = _save
|
|
5753
5907
|
_tmp = apply(:_t_OP_OR)
|
|
5754
5908
|
break if _tmp
|
|
5755
5909
|
self.pos = _save
|
|
5910
|
+
_tmp = apply(:_t_OP_AND_Q)
|
|
5911
|
+
break if _tmp
|
|
5912
|
+
self.pos = _save
|
|
5913
|
+
_tmp = apply(:_t_OP_OR_Q)
|
|
5914
|
+
break if _tmp
|
|
5915
|
+
self.pos = _save
|
|
5916
|
+
_tmp = apply(:_t_OP_VOID_Q)
|
|
5917
|
+
break if _tmp
|
|
5918
|
+
self.pos = _save
|
|
5919
|
+
break
|
|
5920
|
+
end # end choice
|
|
5921
|
+
|
|
5922
|
+
set_failed_rule :_left_op_branch unless _tmp
|
|
5923
|
+
return _tmp
|
|
5924
|
+
end
|
|
5925
|
+
|
|
5926
|
+
# left_op = (left_op_normal | left_op_branch)
|
|
5927
|
+
def _left_op
|
|
5928
|
+
|
|
5929
|
+
_save = self.pos
|
|
5930
|
+
while true # choice
|
|
5931
|
+
_tmp = apply(:_left_op_normal)
|
|
5932
|
+
break if _tmp
|
|
5933
|
+
self.pos = _save
|
|
5934
|
+
_tmp = apply(:_left_op_branch)
|
|
5935
|
+
break if _tmp
|
|
5936
|
+
self.pos = _save
|
|
5756
5937
|
break
|
|
5757
5938
|
end # end choice
|
|
5758
5939
|
|
|
@@ -5760,7 +5941,7 @@ class CodeTools::PegParser
|
|
|
5760
5941
|
return _tmp
|
|
5761
5942
|
end
|
|
5762
5943
|
|
|
5763
|
-
# left_chained_atoms = expr_atom:n0 (c_spc_nl* left_op:to c_spc_nl* expr_atom:n1 { [to, n1] })+:list { list.unshift n0 list.flatten! collapse(list, :t_OP_EXP) collapse(list, :t_OP_MULT, :t_OP_DIV, :t_OP_MOD) collapse(list, :t_OP_PLUS, :t_OP_MINUS) collapse(list, :t_OP_COMPARE) collapse(list, :t_OP_AND, :t_OP_OR) do |n0,op,n1|
|
|
5944
|
+
# left_chained_atoms = expr_atom:n0 (c_spc_nl* left_op:to c_spc_nl* expr_atom:n1 { [to, n1] })+:list { list.unshift n0 list.flatten! collapse(list, :t_OP_EXP) collapse(list, :t_OP_MULT, :t_OP_DIV, :t_OP_MOD) collapse(list, :t_OP_PLUS, :t_OP_MINUS) collapse(list, :t_OP_COMPARE) collapse(list, :t_OP_AND, :t_OP_OR, :t_OP_AND_Q, :t_OP_OR_Q, :t_OP_VOID_Q) do |n0,op,n1| node(:branch_op, op, op.sym, n0, n1) end # There should only be one resulting node left raise "Failed to fully collapse left_chained_atoms: #{list}" \ unless list.count == 1 list.first }
|
|
5764
5945
|
def _left_chained_atoms
|
|
5765
5946
|
|
|
5766
5947
|
_save = self.pos
|
|
@@ -5879,9 +6060,9 @@ class CodeTools::PegParser
|
|
|
5879
6060
|
collapse(list, :t_OP_MULT, :t_OP_DIV, :t_OP_MOD)
|
|
5880
6061
|
collapse(list, :t_OP_PLUS, :t_OP_MINUS)
|
|
5881
6062
|
collapse(list, :t_OP_COMPARE)
|
|
5882
|
-
collapse(list, :t_OP_AND, :t_OP_OR
|
|
5883
|
-
|
|
5884
|
-
node(
|
|
6063
|
+
collapse(list, :t_OP_AND, :t_OP_OR,
|
|
6064
|
+
:t_OP_AND_Q, :t_OP_OR_Q, :t_OP_VOID_Q) do |n0,op,n1|
|
|
6065
|
+
node(:branch_op, op, op.sym, n0, n1)
|
|
5885
6066
|
end
|
|
5886
6067
|
|
|
5887
6068
|
# There should only be one resulting node left
|
|
@@ -5919,21 +6100,13 @@ class CodeTools::PegParser
|
|
|
5919
6100
|
return _tmp
|
|
5920
6101
|
end
|
|
5921
6102
|
|
|
5922
|
-
#
|
|
5923
|
-
def
|
|
6103
|
+
# left_chained_invocation = (c_spc_nl* left_invoke_op:to c_spc_nl* (invoke | op_invoke):n1 { [to, n1] } | c_spc* elem_invoke:n1 { [token(:t_DOT, ""), n1] })
|
|
6104
|
+
def _left_chained_invocation
|
|
5924
6105
|
|
|
5925
6106
|
_save = self.pos
|
|
5926
|
-
while true #
|
|
5927
|
-
_tmp = apply(:_expr_atom_not_chained)
|
|
5928
|
-
n0 = @result
|
|
5929
|
-
unless _tmp
|
|
5930
|
-
self.pos = _save
|
|
5931
|
-
break
|
|
5932
|
-
end
|
|
5933
|
-
_save1 = self.pos
|
|
5934
|
-
_ary = []
|
|
6107
|
+
while true # choice
|
|
5935
6108
|
|
|
5936
|
-
|
|
6109
|
+
_save1 = self.pos
|
|
5937
6110
|
while true # sequence
|
|
5938
6111
|
while true
|
|
5939
6112
|
_tmp = apply(:_c_spc_nl)
|
|
@@ -5941,13 +6114,13 @@ class CodeTools::PegParser
|
|
|
5941
6114
|
end
|
|
5942
6115
|
_tmp = true
|
|
5943
6116
|
unless _tmp
|
|
5944
|
-
self.pos =
|
|
6117
|
+
self.pos = _save1
|
|
5945
6118
|
break
|
|
5946
6119
|
end
|
|
5947
6120
|
_tmp = apply(:_left_invoke_op)
|
|
5948
6121
|
to = @result
|
|
5949
6122
|
unless _tmp
|
|
5950
|
-
self.pos =
|
|
6123
|
+
self.pos = _save1
|
|
5951
6124
|
break
|
|
5952
6125
|
end
|
|
5953
6126
|
while true
|
|
@@ -5956,89 +6129,89 @@ class CodeTools::PegParser
|
|
|
5956
6129
|
end
|
|
5957
6130
|
_tmp = true
|
|
5958
6131
|
unless _tmp
|
|
5959
|
-
self.pos =
|
|
6132
|
+
self.pos = _save1
|
|
5960
6133
|
break
|
|
5961
6134
|
end
|
|
5962
6135
|
|
|
5963
|
-
|
|
6136
|
+
_save4 = self.pos
|
|
5964
6137
|
while true # choice
|
|
5965
6138
|
_tmp = apply(:_invoke)
|
|
5966
6139
|
break if _tmp
|
|
5967
|
-
self.pos =
|
|
6140
|
+
self.pos = _save4
|
|
5968
6141
|
_tmp = apply(:_op_invoke)
|
|
5969
6142
|
break if _tmp
|
|
5970
|
-
self.pos =
|
|
6143
|
+
self.pos = _save4
|
|
5971
6144
|
break
|
|
5972
6145
|
end # end choice
|
|
5973
6146
|
|
|
5974
6147
|
n1 = @result
|
|
5975
6148
|
unless _tmp
|
|
5976
|
-
self.pos =
|
|
6149
|
+
self.pos = _save1
|
|
5977
6150
|
break
|
|
5978
6151
|
end
|
|
5979
6152
|
@result = begin; [to, n1] ; end
|
|
5980
6153
|
_tmp = true
|
|
5981
6154
|
unless _tmp
|
|
5982
|
-
self.pos =
|
|
6155
|
+
self.pos = _save1
|
|
5983
6156
|
end
|
|
5984
6157
|
break
|
|
5985
6158
|
end # end sequence
|
|
5986
6159
|
|
|
5987
|
-
if _tmp
|
|
5988
|
-
|
|
6160
|
+
break if _tmp
|
|
6161
|
+
self.pos = _save
|
|
6162
|
+
|
|
6163
|
+
_save5 = self.pos
|
|
6164
|
+
while true # sequence
|
|
5989
6165
|
while true
|
|
6166
|
+
_tmp = apply(:_c_spc)
|
|
6167
|
+
break unless _tmp
|
|
6168
|
+
end
|
|
6169
|
+
_tmp = true
|
|
6170
|
+
unless _tmp
|
|
6171
|
+
self.pos = _save5
|
|
6172
|
+
break
|
|
6173
|
+
end
|
|
6174
|
+
_tmp = apply(:_elem_invoke)
|
|
6175
|
+
n1 = @result
|
|
6176
|
+
unless _tmp
|
|
6177
|
+
self.pos = _save5
|
|
6178
|
+
break
|
|
6179
|
+
end
|
|
6180
|
+
@result = begin; [token(:t_DOT, ""), n1] ; end
|
|
6181
|
+
_tmp = true
|
|
6182
|
+
unless _tmp
|
|
6183
|
+
self.pos = _save5
|
|
6184
|
+
end
|
|
6185
|
+
break
|
|
6186
|
+
end # end sequence
|
|
5990
6187
|
|
|
5991
|
-
|
|
5992
|
-
|
|
5993
|
-
|
|
5994
|
-
|
|
5995
|
-
break unless _tmp
|
|
5996
|
-
end
|
|
5997
|
-
_tmp = true
|
|
5998
|
-
unless _tmp
|
|
5999
|
-
self.pos = _save6
|
|
6000
|
-
break
|
|
6001
|
-
end
|
|
6002
|
-
_tmp = apply(:_left_invoke_op)
|
|
6003
|
-
to = @result
|
|
6004
|
-
unless _tmp
|
|
6005
|
-
self.pos = _save6
|
|
6006
|
-
break
|
|
6007
|
-
end
|
|
6008
|
-
while true
|
|
6009
|
-
_tmp = apply(:_c_spc_nl)
|
|
6010
|
-
break unless _tmp
|
|
6011
|
-
end
|
|
6012
|
-
_tmp = true
|
|
6013
|
-
unless _tmp
|
|
6014
|
-
self.pos = _save6
|
|
6015
|
-
break
|
|
6016
|
-
end
|
|
6188
|
+
break if _tmp
|
|
6189
|
+
self.pos = _save
|
|
6190
|
+
break
|
|
6191
|
+
end # end choice
|
|
6017
6192
|
|
|
6018
|
-
|
|
6019
|
-
|
|
6020
|
-
|
|
6021
|
-
break if _tmp
|
|
6022
|
-
self.pos = _save9
|
|
6023
|
-
_tmp = apply(:_op_invoke)
|
|
6024
|
-
break if _tmp
|
|
6025
|
-
self.pos = _save9
|
|
6026
|
-
break
|
|
6027
|
-
end # end choice
|
|
6193
|
+
set_failed_rule :_left_chained_invocation unless _tmp
|
|
6194
|
+
return _tmp
|
|
6195
|
+
end
|
|
6028
6196
|
|
|
6029
|
-
|
|
6030
|
-
|
|
6031
|
-
self.pos = _save6
|
|
6032
|
-
break
|
|
6033
|
-
end
|
|
6034
|
-
@result = begin; [to, n1] ; end
|
|
6035
|
-
_tmp = true
|
|
6036
|
-
unless _tmp
|
|
6037
|
-
self.pos = _save6
|
|
6038
|
-
end
|
|
6039
|
-
break
|
|
6040
|
-
end # end sequence
|
|
6197
|
+
# left_chained_invocations = expr_atom_not_chained:n0 left_chained_invocation+:list { list.unshift n0 list.flatten! collapse(list, :t_DOT, :t_QUEST) do |n0,op,n1| op.type==:t_DOT ? (n1.receiver=n0; n1) : node(:quest, op, n0, n1) end # There should only be one resulting node left raise "Failed to fully collapse left_chained_invocations: #{list}" \ unless list.count == 1 list.first }
|
|
6198
|
+
def _left_chained_invocations
|
|
6041
6199
|
|
|
6200
|
+
_save = self.pos
|
|
6201
|
+
while true # sequence
|
|
6202
|
+
_tmp = apply(:_expr_atom_not_chained)
|
|
6203
|
+
n0 = @result
|
|
6204
|
+
unless _tmp
|
|
6205
|
+
self.pos = _save
|
|
6206
|
+
break
|
|
6207
|
+
end
|
|
6208
|
+
_save1 = self.pos
|
|
6209
|
+
_ary = []
|
|
6210
|
+
_tmp = apply(:_left_chained_invocation)
|
|
6211
|
+
if _tmp
|
|
6212
|
+
_ary << @result
|
|
6213
|
+
while true
|
|
6214
|
+
_tmp = apply(:_left_chained_invocation)
|
|
6042
6215
|
_ary << @result if _tmp
|
|
6043
6216
|
break unless _tmp
|
|
6044
6217
|
end
|
|
@@ -6077,7 +6250,7 @@ class CodeTools::PegParser
|
|
|
6077
6250
|
return _tmp
|
|
6078
6251
|
end
|
|
6079
6252
|
|
|
6080
|
-
# unary_operation = t_OP_NOT:to expr_atom:n0 {node(:
|
|
6253
|
+
# unary_operation = t_OP_NOT:to expr_atom:n0 {node(:invoke, to, n0, :"!", nil)}
|
|
6081
6254
|
def _unary_operation
|
|
6082
6255
|
|
|
6083
6256
|
_save = self.pos
|
|
@@ -6094,7 +6267,7 @@ class CodeTools::PegParser
|
|
|
6094
6267
|
self.pos = _save
|
|
6095
6268
|
break
|
|
6096
6269
|
end
|
|
6097
|
-
@result = begin; node(:
|
|
6270
|
+
@result = begin; node(:invoke, to, n0, :"!", nil); end
|
|
6098
6271
|
_tmp = true
|
|
6099
6272
|
unless _tmp
|
|
6100
6273
|
self.pos = _save
|
|
@@ -6733,7 +6906,7 @@ class CodeTools::PegParser
|
|
|
6733
6906
|
return _tmp
|
|
6734
6907
|
end
|
|
6735
6908
|
|
|
6736
|
-
# decorator = meme_name:ni arg_list?:na {node(:deco, ni, ni, na)}
|
|
6909
|
+
# decorator = meme_name:ni arg_list?:na {node(:deco, ni, ni, (na ? node(:arrass, na, na.body) : nil))}
|
|
6737
6910
|
def _decorator
|
|
6738
6911
|
|
|
6739
6912
|
_save = self.pos
|
|
@@ -6756,7 +6929,7 @@ class CodeTools::PegParser
|
|
|
6756
6929
|
self.pos = _save
|
|
6757
6930
|
break
|
|
6758
6931
|
end
|
|
6759
|
-
@result = begin; node(:deco, ni, ni, na); end
|
|
6932
|
+
@result = begin; node(:deco, ni, ni, (na ? node(:arrass, na, na.body) : nil)); end
|
|
6760
6933
|
_tmp = true
|
|
6761
6934
|
unless _tmp
|
|
6762
6935
|
self.pos = _save
|
|
@@ -6768,7 +6941,7 @@ class CodeTools::PegParser
|
|
|
6768
6941
|
return _tmp
|
|
6769
6942
|
end
|
|
6770
6943
|
|
|
6771
|
-
# decorators_and_meme_name = decorator:n0 (c_spc* decorator:n)*:nrest {node(:
|
|
6944
|
+
# decorators_and_meme_name = decorator:n0 (c_spc* decorator:n)*:nrest {node(:arrass, n0, [n0, *nrest].reverse)}
|
|
6772
6945
|
def _decorators_and_meme_name
|
|
6773
6946
|
|
|
6774
6947
|
_save = self.pos
|
|
@@ -6811,7 +6984,7 @@ class CodeTools::PegParser
|
|
|
6811
6984
|
self.pos = _save
|
|
6812
6985
|
break
|
|
6813
6986
|
end
|
|
6814
|
-
@result = begin; node(:
|
|
6987
|
+
@result = begin; node(:arrass, n0, [n0, *nrest].reverse); end
|
|
6815
6988
|
_tmp = true
|
|
6816
6989
|
unless _tmp
|
|
6817
6990
|
self.pos = _save
|
|
@@ -6983,8 +7156,8 @@ class CodeTools::PegParser
|
|
|
6983
7156
|
Rules[:_t_TRUE] = rule_info("t_TRUE", "< \"true\" > {token(:t_TRUE, text)}")
|
|
6984
7157
|
Rules[:_t_FALSE] = rule_info("t_FALSE", "< \"false\" > {token(:t_FALSE, text)}")
|
|
6985
7158
|
Rules[:_t_SELF] = rule_info("t_SELF", "< \"self\" > {token(:t_SELF, text)}")
|
|
6986
|
-
Rules[:_t_FLOAT] = rule_info("t_FLOAT", "< c_num+ \".\" c_num+ > {token(:t_FLOAT, text)}")
|
|
6987
|
-
Rules[:_t_INTEGER] = rule_info("t_INTEGER", "< c_num+ > {token(:t_INTEGER, text)}")
|
|
7159
|
+
Rules[:_t_FLOAT] = rule_info("t_FLOAT", "< \"-\"? c_num+ \".\" c_num+ > {token(:t_FLOAT, text)}")
|
|
7160
|
+
Rules[:_t_INTEGER] = rule_info("t_INTEGER", "< \"-\"? c_num+ > {token(:t_INTEGER, text)}")
|
|
6988
7161
|
Rules[:_t_JUMP] = rule_info("t_JUMP", "< \"->\" > {token(:t_JUMP, text)}")
|
|
6989
7162
|
Rules[:_t_DOT] = rule_info("t_DOT", "< \".\" > {token(:t_DOT, text)}")
|
|
6990
7163
|
Rules[:_t_QUEST] = rule_info("t_QUEST", "< \".\" c_spc_nl* \"?\" > {token(:t_QUEST, text)}")
|
|
@@ -7000,6 +7173,9 @@ class CodeTools::PegParser
|
|
|
7000
7173
|
Rules[:_t_OP_EXP] = rule_info("t_OP_EXP", "< \"**\" > {token(:t_OP_EXP, text)}")
|
|
7001
7174
|
Rules[:_t_OP_AND] = rule_info("t_OP_AND", "< \"&&\" > {token(:t_OP_AND, text)}")
|
|
7002
7175
|
Rules[:_t_OP_OR] = rule_info("t_OP_OR", "< \"||\" > {token(:t_OP_OR, text)}")
|
|
7176
|
+
Rules[:_t_OP_AND_Q] = rule_info("t_OP_AND_Q", "< \"&?\" > {token(:t_OP_AND_Q, text)}")
|
|
7177
|
+
Rules[:_t_OP_OR_Q] = rule_info("t_OP_OR_Q", "< \"|?\" > {token(:t_OP_OR_Q, text)}")
|
|
7178
|
+
Rules[:_t_OP_VOID_Q] = rule_info("t_OP_VOID_Q", "< \"??\" > {token(:t_OP_VOID_Q, text)}")
|
|
7003
7179
|
Rules[:_t_OP_COMPARE] = rule_info("t_OP_COMPARE", "< (\"<=>\" | \"=~\" | \"==\" | \"<=\" | \">=\" | \"<\" | \">\") > {token(:t_OP_COMPARE, text)}")
|
|
7004
7180
|
Rules[:_string_norm] = rule_info("string_norm", "/[^\\\\\\\"]/")
|
|
7005
7181
|
Rules[:_t_STRING_BODY] = rule_info("t_STRING_BODY", "< string_norm* (\"\\\\\" c_any string_norm*)* > {token(:t_STRING_BODY, text)}")
|
|
@@ -7025,14 +7201,14 @@ class CodeTools::PegParser
|
|
|
7025
7201
|
Rules[:_dyn_symstr] = rule_info("dyn_symstr", "lit_symstr:n0 dyn_string_parts:nrest {node(:dsym, n0, n0.value.to_s, nrest)}")
|
|
7026
7202
|
Rules[:_constant] = rule_info("constant", "(constant:n0 t_SCOPE:ts t_CONSTANT:tc {node(:colon2, ts, n0, tc.sym)} | t_SCOPE:ts t_CONSTANT:tc {node(:colon3, ts, tc.sym)} | t_CONSTANT:tc {node(:const, tc, tc.sym)})")
|
|
7027
7203
|
Rules[:_const_sep] = rule_info("const_sep", "(c_spc_nl* t_CONST_SEP c_spc_nl*)+")
|
|
7028
|
-
Rules[:_constant_list] = rule_info("constant_list", "constant:n0 (const_sep constant:n)*:nrest {node(:
|
|
7204
|
+
Rules[:_constant_list] = rule_info("constant_list", "constant:n0 (const_sep constant:n)*:nrest {node(:arrass, n0, [n0, *nrest])}")
|
|
7029
7205
|
Rules[:_id_as_symbol] = rule_info("id_as_symbol", "t_IDENTIFIER:t0 {node(:lit, t0, t0.sym)}")
|
|
7030
7206
|
Rules[:_declobj_sepd_exprs] = rule_info("declobj_sepd_exprs", "declobj_expr:n0 (arg_sep declobj_expr:n)*:nrest arg_sep_opt { [n0, *nrest] }")
|
|
7031
7207
|
Rules[:_declobj_expr_body] = rule_info("declobj_expr_body", "(arg_sep_opt declobj_sepd_exprs:nlist t_DECLARE_END:te {node(:block, nlist.first, nlist)} | arg_sep_opt t_DECLARE_END:te {node(:null, te)})")
|
|
7032
7208
|
Rules[:_declobj] = rule_info("declobj", "constant_list:n0 c_spc_nl* t_DECLARE_BEGIN:t declobj_expr_body:n1 {node(:declobj, t, n0, n1)}")
|
|
7033
7209
|
Rules[:_category_expr] = rule_info("category_expr", "declobj_expr_not_category")
|
|
7034
|
-
Rules[:_category_sepd_exprs] = rule_info("category_sepd_exprs", "category_expr:n0 (arg_sep category_expr:n)*:nrest { [n0, *nrest] }")
|
|
7035
|
-
Rules[:_category] = rule_info("category", "category_name:n0
|
|
7210
|
+
Rules[:_category_sepd_exprs] = rule_info("category_sepd_exprs", "arg_sep category_expr:n0 (arg_sep category_expr:n)*:nrest { [n0, *nrest] }")
|
|
7211
|
+
Rules[:_category] = rule_info("category", "category_name:n0 category_sepd_exprs?:nlist &(arg_sep_opt (t_CATGRY_BEGIN | t_DECLARE_END)) {node(:category, n0, n0, (nlist ? node(:block, nlist.first, nlist) : node(:null, n0)))}")
|
|
7036
7212
|
Rules[:_copen] = rule_info("copen", "constant:n0 c_spc_nl* t_REOPEN:tb c_spc_nl* t_DECLARE_BEGIN declobj_expr_body:n1 {node(:copen, tb, n0, n1)}")
|
|
7037
7213
|
Rules[:_cdefn] = rule_info("cdefn", "constant:n0 c_spc_nl* t_DEFINE:t c_spc_nl* declobj:n1 {node(:cdefn, t, n0, n1)}")
|
|
7038
7214
|
Rules[:_t_DECLSTR_BEGIN] = rule_info("t_DECLSTR_BEGIN", "< /[^\\s{:,<][^\\s]+/ > { \# Table of replacement characters to use when calculating \# the ending delimiter from the starting delimiter. \# Directional characters are replaced with their opposite. @declstr_replace_tbl ||= %w{ < > ( ) { } [ ] } \# Calculate the ending delimiter to look for and store it @declstr_destrlim = text \\ .split(/(?<=[^a-zA-Z])|(?=[^a-zA-Z])/) .map { |str| idx = @declstr_replace_tbl.find_index(str) idx.nil? ? str : (idx.odd? ? @declstr_replace_tbl[idx-1] : @declstr_replace_tbl[idx+1]) } .reverse .join '' token(:t_DECLSTR_BEGIN, text) }")
|
|
@@ -7046,11 +7222,12 @@ class CodeTools::PegParser
|
|
|
7046
7222
|
Rules[:_assign_rhs] = rule_info("assign_rhs", "arg_expr")
|
|
7047
7223
|
Rules[:_local_assignment] = rule_info("local_assignment", "t_IDENTIFIER:ti c_spc_nl* t_ASSIGN:to c_spc_nl* assign_rhs:rhs {node(:lasgn, to, ti.sym, rhs)}")
|
|
7048
7224
|
Rules[:_invoke_assignment_lhs] = rule_info("invoke_assignment_lhs", "(left_chained_invocations | invoke)")
|
|
7049
|
-
Rules[:_invoke_assignment] = rule_info("invoke_assignment", "invoke_assignment_lhs:lhs c_spc_nl* t_ASSIGN:to c_spc_nl* assign_rhs:rhs { lhs.name = :\"\#{lhs.name}=\" orig_arguments = lhs.arguments && lhs.arguments.body || [] lhs.
|
|
7225
|
+
Rules[:_invoke_assignment] = rule_info("invoke_assignment", "invoke_assignment_lhs:lhs c_spc_nl* t_ASSIGN:to c_spc_nl* assign_rhs:rhs { lhs.name = :\"\#{lhs.name}=\" orig_arguments = lhs.arguments && lhs.arguments.body || [] arg_order = lhs.name==:\"[]=\" ? [*orig_arguments, rhs] : [rhs, *orig_arguments] lhs.arguments = node(:argass, rhs, arg_order) lhs }")
|
|
7050
7226
|
Rules[:_invoke_body] = rule_info("invoke_body", "(c_spc_nl* param_list:n)?:np c_spc_nl* meme_enclosed_expr_body:nb { [np, nb] }")
|
|
7051
|
-
Rules[:_invoke] = rule_info("invoke", "t_IDENTIFIER:tn (
|
|
7052
|
-
Rules[:
|
|
7053
|
-
Rules[:
|
|
7227
|
+
Rules[:_invoke] = rule_info("invoke", "t_IDENTIFIER:tn (c_spc* arg_list:na)?:na (c_spc_nl* invoke_body:n)?:nlist {node(:invoke, tn, nil, tn.sym, na, *nlist)}")
|
|
7228
|
+
Rules[:_op_invoke_id] = rule_info("op_invoke_id", "left_op_normal")
|
|
7229
|
+
Rules[:_op_invoke] = rule_info("op_invoke", "op_invoke_id:tn (c_spc* arg_list:na)?:na (c_spc_nl* invoke_body:n)?:nlist {node(:invoke, tn, nil, tn.sym, na, *nlist)}")
|
|
7230
|
+
Rules[:_elem_invoke] = rule_info("elem_invoke", "lit_array:na (c_spc_nl* invoke_body:n)?:nlist {node(:invoke, na, nil, :\"[]\", node(:argass, na, na.body), *nlist)}")
|
|
7054
7231
|
Rules[:_arg_sep] = rule_info("arg_sep", "(c_spc* t_ARG_SEP c_spc*)+")
|
|
7055
7232
|
Rules[:_arg_sep_opt] = rule_info("arg_sep_opt", "(c_spc | t_ARG_SEP)*")
|
|
7056
7233
|
Rules[:_in_arg_normal] = rule_info("in_arg_normal", "(in_arg_splat | arg_expr:n0 !in_arg_kwarg_mark { n0 })")
|
|
@@ -7061,17 +7238,20 @@ class CodeTools::PegParser
|
|
|
7061
7238
|
Rules[:_in_arg_splat] = rule_info("in_arg_splat", "t_OP_MULT:to expr_atom:n0 {node(:splat, to, n0)}")
|
|
7062
7239
|
Rules[:_in_arg_block] = rule_info("in_arg_block", "t_OP_TOPROC:to expr_atom:n0 {node(:block_pass, to, nil, n0)}")
|
|
7063
7240
|
Rules[:_in_arg_list] = rule_info("in_arg_list", "(in_arg_normals:n0 arg_sep in_arg_kwargs:n1 arg_sep in_arg_block:n2 { [*n0,n1,n2] } | in_arg_normals:n0 arg_sep in_arg_kwargs:n1 { [*n0,n1] } | in_arg_normals:n0 arg_sep in_arg_block:n1 { [*n0,n1] } | in_arg_kwargs:n0 arg_sep in_arg_block:n1 { [n0, n1] } | in_arg_normals:n0 { [*n0] } | in_arg_kwargs:n0 { [n0] } | in_arg_block:n0 { [n0] })")
|
|
7064
|
-
Rules[:_arg_list] = rule_info("arg_list", "(t_ARGS_BEGIN:tb arg_sep_opt t_ARGS_END {
|
|
7065
|
-
Rules[:_lit_array] = rule_info("lit_array", "(t_ARRAY_BEGIN:tb arg_sep_opt t_ARRAY_END {
|
|
7241
|
+
Rules[:_arg_list] = rule_info("arg_list", "(t_ARGS_BEGIN:tb arg_sep_opt t_ARGS_END {node(:argass, tb, [])} | t_ARGS_BEGIN:tb arg_sep_opt in_arg_list:nlist arg_sep_opt t_ARGS_END {node(:argass, tb, nlist)})")
|
|
7242
|
+
Rules[:_lit_array] = rule_info("lit_array", "(t_ARRAY_BEGIN:tb arg_sep_opt t_ARRAY_END {node(:arrass, tb, [])} | t_ARRAY_BEGIN:tb arg_sep_opt in_arg_list:nlist arg_sep_opt t_ARRAY_END {node(:arrass, tb, nlist)})")
|
|
7066
7243
|
Rules[:_param] = rule_info("param", "(t_IDENTIFIER:ti c_spc_nl* t_ASSIGN:to c_spc_nl* arg_expr:nv { [:optional, node(:lasgn, ti, ti.sym, nv)] } | t_IDENTIFIER:ti c_spc_nl* t_MEME_MARK:to c_spc_nl* arg_expr?:nv { [:kwargs, node(:lasgn, ti, ti.sym, (nv || node(:lit, to, :*)))] } | t_OP_EXP c_spc_nl* t_IDENTIFIER:ti { [:kwrest, ti.sym] } | t_OP_MULT c_spc_nl* t_IDENTIFIER:ti { [:rest, ti.sym] } | t_OP_TOPROC c_spc_nl* t_IDENTIFIER:ti { [:block, ti.sym] } | t_IDENTIFIER:ti { [:required, ti.sym] })")
|
|
7067
7244
|
Rules[:_param_sepd] = rule_info("param_sepd", "arg_sep param:n0 { n0 }")
|
|
7068
7245
|
Rules[:_param_sepds] = rule_info("param_sepds", "param:n0 (arg_sep param:n)*:nrest arg_sep_opt { [n0, *nrest] }")
|
|
7069
7246
|
Rules[:_param_list] = rule_info("param_list", "(t_PARAMS_BEGIN:tb t_PARAMS_END { node(:args, tb, nil, nil, nil, nil, nil, nil, nil) } | t_PARAMS_BEGIN:tb param_sepds:plist t_PARAMS_END { required, optional, rest, kwargs, kwrest, block = 6.times.map { [] } required << plist.shift[1] while plist[0] && plist[0][0] == :required optional << plist.shift[1] while plist[0] && plist[0][0] == :optional rest << plist.shift[1] while plist[0] && plist[0][0] == :rest kwargs << plist.shift[1] while plist[0] && plist[0][0] == :kwargs kwrest << plist.shift[1] while plist[0] && plist[0][0] == :kwrest block << plist.shift[1] while plist[0] && plist[0][0] == :block required = required optional = optional.empty? ? nil : node(:block, tb, optional) rest = rest.first post = nil kwargs = kwargs.empty? ? nil : node(:block, tb, kwargs) kwrest = kwrest.first block = block.first node(:args, tb, required, optional, rest, post, kwargs, kwrest, block) })")
|
|
7070
|
-
Rules[:
|
|
7071
|
-
Rules[:
|
|
7247
|
+
Rules[:_left_op_normal] = rule_info("left_op_normal", "(t_OP_EXP | t_OP_MULT | t_OP_DIV | t_OP_MOD | t_OP_PLUS | t_OP_MINUS | t_OP_COMPARE)")
|
|
7248
|
+
Rules[:_left_op_branch] = rule_info("left_op_branch", "(t_OP_AND | t_OP_OR | t_OP_AND_Q | t_OP_OR_Q | t_OP_VOID_Q)")
|
|
7249
|
+
Rules[:_left_op] = rule_info("left_op", "(left_op_normal | left_op_branch)")
|
|
7250
|
+
Rules[:_left_chained_atoms] = rule_info("left_chained_atoms", "expr_atom:n0 (c_spc_nl* left_op:to c_spc_nl* expr_atom:n1 { [to, n1] })+:list { list.unshift n0 list.flatten! collapse(list, :t_OP_EXP) collapse(list, :t_OP_MULT, :t_OP_DIV, :t_OP_MOD) collapse(list, :t_OP_PLUS, :t_OP_MINUS) collapse(list, :t_OP_COMPARE) collapse(list, :t_OP_AND, :t_OP_OR, :t_OP_AND_Q, :t_OP_OR_Q, :t_OP_VOID_Q) do |n0,op,n1| node(:branch_op, op, op.sym, n0, n1) end \# There should only be one resulting node left raise \"Failed to fully collapse left_chained_atoms: \#{list}\" \\ unless list.count == 1 list.first }")
|
|
7072
7251
|
Rules[:_left_invoke_op] = rule_info("left_invoke_op", "(t_QUEST | t_DOT)")
|
|
7073
|
-
Rules[:
|
|
7074
|
-
Rules[:
|
|
7252
|
+
Rules[:_left_chained_invocation] = rule_info("left_chained_invocation", "(c_spc_nl* left_invoke_op:to c_spc_nl* (invoke | op_invoke):n1 { [to, n1] } | c_spc* elem_invoke:n1 { [token(:t_DOT, \"\"), n1] })")
|
|
7253
|
+
Rules[:_left_chained_invocations] = rule_info("left_chained_invocations", "expr_atom_not_chained:n0 left_chained_invocation+:list { list.unshift n0 list.flatten! collapse(list, :t_DOT, :t_QUEST) do |n0,op,n1| op.type==:t_DOT ? (n1.receiver=n0; n1) : node(:quest, op, n0, n1) end \# There should only be one resulting node left raise \"Failed to fully collapse left_chained_invocations: \#{list}\" \\ unless list.count == 1 list.first }")
|
|
7254
|
+
Rules[:_unary_operation] = rule_info("unary_operation", "t_OP_NOT:to expr_atom:n0 {node(:invoke, to, n0, :\"!\", nil)}")
|
|
7075
7255
|
Rules[:_t_inln_sep] = rule_info("t_inln_sep", "!t_ARG_SEP t_EXPR_SEP")
|
|
7076
7256
|
Rules[:_inln_sep] = rule_info("inln_sep", "(c_spc* t_inln_sep c_spc*)+")
|
|
7077
7257
|
Rules[:_inln_sep_opt] = rule_info("inln_sep_opt", "(c_spc | t_inln_sep)*")
|
|
@@ -7087,8 +7267,8 @@ class CodeTools::PegParser
|
|
|
7087
7267
|
Rules[:_meme_either_body] = rule_info("meme_either_body", "(meme_enclosed_expr_body | meme_inline_expr_body)")
|
|
7088
7268
|
Rules[:_cmeme] = rule_info("cmeme", "constant:n0 c_spc* t_MEME_MARK:tm c_spc_nl* meme_inline_expr_body:n1 {node(:cdecl, tm, n0, n1)}")
|
|
7089
7269
|
Rules[:_meme_name] = rule_info("meme_name", "(id_as_symbol | lit_string_as_symbol)")
|
|
7090
|
-
Rules[:_decorator] = rule_info("decorator", "meme_name:ni arg_list?:na {node(:deco, ni, ni, na)}")
|
|
7091
|
-
Rules[:_decorators_and_meme_name] = rule_info("decorators_and_meme_name", "decorator:n0 (c_spc* decorator:n)*:nrest {node(:
|
|
7270
|
+
Rules[:_decorator] = rule_info("decorator", "meme_name:ni arg_list?:na {node(:deco, ni, ni, (na ? node(:arrass, na, na.body) : nil))}")
|
|
7271
|
+
Rules[:_decorators_and_meme_name] = rule_info("decorators_and_meme_name", "decorator:n0 (c_spc* decorator:n)*:nrest {node(:arrass, n0, [n0, *nrest].reverse)}")
|
|
7092
7272
|
Rules[:_meme] = rule_info("meme", "(decorators_and_meme_name:nd c_spc* t_MEME_MARK:tm (c_spc_nl* param_list:n)?:np c_spc_nl* meme_either_body:nb {node(:meme, tm, nd.body.shift.name, nd, np, nb)} | decorators_and_meme_name:nd {node(:meme, tm, nd.body.shift.name, nd, nil, nil)})")
|
|
7093
7273
|
# :startdoc:
|
|
7094
7274
|
end
|