brakeman 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +15 -4
  3. data/bin/brakeman +6 -1
  4. data/bundle/load.rb +2 -2
  5. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/Manifest.txt +5 -0
  6. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/README.rdoc +12 -0
  7. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/Rakefile +127 -70
  8. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/compare/normalize.rb +146 -0
  9. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/rp_extensions.rb +77 -0
  10. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/rp_stringscanner.rb +64 -0
  11. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby18_parser.rb +1637 -1646
  12. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby18_parser.y +11 -11
  13. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby19_parser.rb +1602 -1603
  14. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby19_parser.y +12 -12
  15. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby20_parser.rb +2507 -2524
  16. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby20_parser.y +12 -26
  17. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby21_parser.rb +1872 -1868
  18. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby21_parser.y +12 -21
  19. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby22_parser.rb +1758 -1754
  20. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby22_parser.y +12 -21
  21. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby23_parser.rb +1844 -1847
  22. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby23_parser.y +12 -21
  23. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby24_parser.rb +6790 -0
  24. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby24_parser.y +2364 -0
  25. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby_lexer.rb +12 -16
  26. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby_lexer.rex.rb +6 -12
  27. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby_parser.rb +86 -7
  28. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby_parser.yy +51 -50
  29. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/lib/ruby_parser_extras.rb +30 -237
  30. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/test/test_ruby_lexer.rb +54 -41
  31. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/test/test_ruby_parser.rb +775 -700
  32. data/bundle/ruby/2.3.0/gems/ruby_parser-3.8.4/test/test_ruby_parser_extras.rb +4 -6
  33. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/History.txt +7 -0
  34. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/Manifest.txt +0 -0
  35. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/README.txt +0 -0
  36. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/Rakefile +0 -0
  37. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/lib/composite_sexp_processor.rb +0 -0
  38. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/lib/pt_testcase.rb +3 -1
  39. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/lib/sexp.rb +7 -0
  40. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/lib/sexp_processor.rb +7 -5
  41. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/lib/unique.rb +0 -0
  42. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/test/test_composite_sexp_processor.rb +0 -0
  43. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/test/test_environment.rb +0 -0
  44. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/test/test_sexp.rb +21 -2
  45. data/bundle/ruby/2.3.0/gems/{sexp_processor-4.7.0 → sexp_processor-4.8.0}/test/test_sexp_processor.rb +13 -0
  46. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/CHANGELOG.md +4 -0
  47. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/COPYING +0 -0
  48. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/Gemfile +1 -1
  49. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/HACKING +0 -0
  50. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/README.md +0 -0
  51. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/Rakefile +0 -0
  52. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/bin/tilt +0 -0
  53. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/docs/TEMPLATES.md +0 -0
  54. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/docs/common.css +0 -0
  55. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt.rb +1 -1
  56. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/asciidoc.rb +0 -0
  57. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/babel.rb +0 -0
  58. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/bluecloth.rb +0 -0
  59. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/builder.rb +0 -0
  60. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/coffee.rb +0 -0
  61. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/commonmarker.rb +0 -0
  62. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/creole.rb +0 -0
  63. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/csv.rb +0 -0
  64. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/dummy.rb +0 -0
  65. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/erb.rb +0 -0
  66. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/erubi.rb +0 -0
  67. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/erubis.rb +0 -0
  68. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/etanni.rb +0 -0
  69. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/haml.rb +0 -0
  70. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/kramdown.rb +0 -0
  71. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/less.rb +0 -0
  72. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/liquid.rb +0 -0
  73. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/livescript.rb +0 -0
  74. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/mapping.rb +0 -0
  75. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/markaby.rb +0 -0
  76. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/maruku.rb +0 -0
  77. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/nokogiri.rb +0 -0
  78. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/pandoc.rb +0 -0
  79. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/plain.rb +0 -0
  80. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/prawn.rb +0 -0
  81. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/radius.rb +0 -0
  82. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/rdiscount.rb +0 -0
  83. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/rdoc.rb +0 -0
  84. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/redcarpet.rb +0 -0
  85. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/redcloth.rb +0 -0
  86. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/rst-pandoc.rb +0 -0
  87. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/sass.rb +0 -0
  88. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/sigil.rb +0 -0
  89. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/string.rb +0 -0
  90. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/template.rb +10 -1
  91. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/typescript.rb +0 -0
  92. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/wikicloth.rb +0 -0
  93. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/lib/tilt/yajl.rb +0 -0
  94. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/man/index.txt +0 -0
  95. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/man/tilt.1.ronn +0 -0
  96. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/markaby/locals.mab +0 -0
  97. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/markaby/markaby.mab +0 -0
  98. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/markaby/markaby_other_static.mab +0 -0
  99. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/markaby/render_twice.mab +0 -0
  100. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/markaby/scope.mab +0 -0
  101. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/markaby/yielding.mab +0 -0
  102. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/mytemplate.rb +0 -0
  103. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/test_helper.rb +0 -0
  104. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_asciidoctor_test.rb +0 -0
  105. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_babeltemplate.rb +0 -0
  106. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_blueclothtemplate_test.rb +0 -0
  107. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_buildertemplate_test.rb +0 -0
  108. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_cache_test.rb +0 -0
  109. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_coffeescripttemplate_test.rb +0 -0
  110. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_commonmarkertemplate_test.rb +0 -0
  111. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_compilesite_test.rb +0 -0
  112. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_creoletemplate_test.rb +0 -0
  113. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_csv_test.rb +0 -0
  114. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_erbtemplate_test.rb +0 -0
  115. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_erubistemplate_test.rb +0 -0
  116. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_erubitemplate_test.rb +0 -0
  117. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_etannitemplate_test.rb +0 -0
  118. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_hamltemplate_test.rb +0 -0
  119. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_kramdown_test.rb +0 -0
  120. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_lesstemplate_test.less +0 -0
  121. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_lesstemplate_test.rb +0 -0
  122. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_liquidtemplate_test.rb +0 -0
  123. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_livescripttemplate_test.rb +0 -0
  124. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_mapping_test.rb +0 -0
  125. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_markaby_test.rb +0 -0
  126. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_markdown_test.rb +0 -0
  127. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_marukutemplate_test.rb +0 -0
  128. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_metadata_test.rb +0 -0
  129. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_nokogiritemplate_test.rb +0 -0
  130. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_pandoctemplate_test.rb +0 -0
  131. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_prawntemplate.prawn +0 -0
  132. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_prawntemplate_test.rb +0 -0
  133. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_radiustemplate_test.rb +0 -0
  134. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_rdiscounttemplate_test.rb +0 -0
  135. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_rdoctemplate_test.rb +0 -0
  136. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_redcarpettemplate_test.rb +0 -0
  137. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_redclothtemplate_test.rb +0 -0
  138. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_rstpandoctemplate_test.rb +0 -0
  139. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_sasstemplate_test.rb +0 -0
  140. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_sigil_test.rb +0 -0
  141. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_stringtemplate_test.rb +0 -0
  142. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_template_test.rb +0 -0
  143. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_test.rb +0 -0
  144. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_typescript_test.rb +0 -0
  145. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_wikiclothtemplate_test.rb +0 -0
  146. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/test/tilt_yajltemplate_test.rb +0 -0
  147. data/bundle/ruby/2.3.0/gems/{tilt-2.0.6 → tilt-2.0.7}/tilt.gemspec +2 -2
  148. data/lib/brakeman.rb +4 -0
  149. data/lib/brakeman/checks/check_sql.rb +2 -2
  150. data/lib/brakeman/checks/check_xml_dos.rb +0 -6
  151. data/lib/brakeman/options.rb +4 -0
  152. data/lib/brakeman/parsers/rails3_erubis.rb +7 -0
  153. data/lib/brakeman/processors/alias_processor.rb +101 -0
  154. data/lib/brakeman/processors/controller_processor.rb +3 -1
  155. data/lib/brakeman/version.rb +1 -1
  156. metadata +125 -118
@@ -0,0 +1,2364 @@
1
+ # -*- racc -*-
2
+
3
+ class Ruby24Parser
4
+
5
+ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
6
+ kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
7
+ kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
8
+ kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
9
+ kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
10
+ k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
11
+ tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
12
+ tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
13
+ tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
14
+ tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
15
+ tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
16
+ tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE
17
+ tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY
18
+ tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
19
+ tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
20
+ tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
21
+ tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND tUBANG
22
+ tRATIONAL tIMAGINARY
23
+ tLABEL_END
24
+ tLONELY
25
+
26
+ prechigh
27
+ right tBANG tTILDE tUPLUS
28
+ right tPOW
29
+ right tUMINUS_NUM tUMINUS
30
+ left tSTAR2 tDIVIDE tPERCENT
31
+ left tPLUS tMINUS
32
+ left tLSHFT tRSHFT
33
+ left tAMPER2
34
+ left tPIPE tCARET
35
+ left tGT tGEQ tLT tLEQ
36
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
37
+ left tANDOP
38
+ left tOROP
39
+ nonassoc tDOT2 tDOT3
40
+ right tEH tCOLON
41
+ left kRESCUE_MOD
42
+ right tEQL tOP_ASGN
43
+ nonassoc kDEFINED
44
+ right kNOT
45
+ left kOR kAND
46
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
47
+ nonassoc tLBRACE_ARG
48
+ nonassoc tLOWEST
49
+ preclow
50
+
51
+ rule
52
+
53
+ program: {
54
+ self.lexer.lex_state = :expr_beg
55
+ }
56
+ top_compstmt
57
+ {
58
+ result = new_compstmt val
59
+ }
60
+
61
+ top_compstmt: top_stmts opt_terms
62
+ {
63
+ result = val[0]
64
+ }
65
+
66
+ top_stmts: none
67
+ | top_stmt
68
+ | top_stmts terms top_stmt
69
+ {
70
+ result = self.block_append val[0], val[2]
71
+ }
72
+ | error top_stmt
73
+
74
+ top_stmt: stmt
75
+ {
76
+ result = val[0]
77
+
78
+ # TODO: remove once I have more confidence this is fixed
79
+ # result.each_of_type :call_args do |s|
80
+ # debug20 666, s, result
81
+ # end
82
+ }
83
+ | klBEGIN
84
+ {
85
+ if (self.in_def || self.in_single > 0) then
86
+ debug20 1
87
+ yyerror "BEGIN in method"
88
+ end
89
+ self.env.extend
90
+ }
91
+ tLCURLY top_compstmt tRCURLY
92
+ {
93
+ result = new_iter s(:preexe), nil, val[3]
94
+ }
95
+
96
+ bodystmt: compstmt opt_rescue opt_else opt_ensure
97
+ {
98
+ result = new_body val
99
+ }
100
+
101
+ compstmt: stmts opt_terms
102
+ {
103
+ result = new_compstmt val
104
+ }
105
+
106
+ stmts: none
107
+ | stmt
108
+ | stmts terms stmt
109
+ {
110
+ result = self.block_append val[0], val[2]
111
+ }
112
+ | error stmt
113
+ {
114
+ result = val[1]
115
+ debug20 2, val, result
116
+ }
117
+
118
+ stmt: kALIAS fitem
119
+ {
120
+ lexer.lex_state = :expr_fname
121
+ result = self.lexer.lineno
122
+ }
123
+ fitem
124
+ {
125
+ result = s(:alias, val[1], val[3]).line(val[2])
126
+ }
127
+ | kALIAS tGVAR tGVAR
128
+ {
129
+ result = s(:valias, val[1].to_sym, val[2].to_sym)
130
+ }
131
+ | kALIAS tGVAR tBACK_REF
132
+ {
133
+ result = s(:valias, val[1].to_sym, :"$#{val[2]}")
134
+ }
135
+ | kALIAS tGVAR tNTH_REF
136
+ {
137
+ yyerror "can't make alias for the number variables"
138
+ }
139
+ | kUNDEF undef_list
140
+ {
141
+ result = val[1]
142
+ }
143
+ | stmt kIF_MOD expr_value
144
+ {
145
+ result = new_if val[2], val[0], nil
146
+ }
147
+ | stmt kUNLESS_MOD expr_value
148
+ {
149
+ result = new_if val[2], nil, val[0]
150
+ }
151
+ | stmt kWHILE_MOD expr_value
152
+ {
153
+ result = new_while val[0], val[2], true
154
+ }
155
+ | stmt kUNTIL_MOD expr_value
156
+ {
157
+ result = new_until val[0], val[2], true
158
+ }
159
+ | stmt kRESCUE_MOD stmt
160
+ {
161
+ result = s(:rescue, val[0], new_resbody(s(:array), val[2]))
162
+ }
163
+ | klEND tLCURLY compstmt tRCURLY
164
+ {
165
+ if (self.in_def || self.in_single > 0) then
166
+ debug20 3
167
+ yyerror "END in method; use at_exit"
168
+ end
169
+ result = new_iter s(:postexe), 0, val[2]
170
+ }
171
+ | command_asgn
172
+ | mlhs tEQL command_call
173
+ {
174
+ result = new_masgn val[0], val[2], :wrap
175
+ }
176
+ | var_lhs tOP_ASGN command_call
177
+ {
178
+ result = new_op_asgn val
179
+ }
180
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call
181
+ {
182
+ result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
183
+ }
184
+ | primary_value call_op tIDENTIFIER tOP_ASGN command_call
185
+ {
186
+ result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
187
+ if val[1] == '&.'
188
+ result[0] = :safe_op_asgn
189
+ end
190
+ result.line = val[0].line
191
+ }
192
+ | primary_value call_op tCONSTANT tOP_ASGN command_call
193
+ {
194
+ result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
195
+ if val[1] == '&.'
196
+ result[0] = :safe_op_asgn
197
+ end
198
+ result.line = val[0].line
199
+ }
200
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
201
+ {
202
+ result = s(:op_asgn, val[0], val[4], val[2], val[3])
203
+ debug20 4, val, result
204
+ }
205
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
206
+ {
207
+ result = s(:op_asgn, val[0], val[4], val[2], val[3])
208
+ debug20 5, val, result
209
+ }
210
+ | backref tOP_ASGN command_call
211
+ {
212
+ self.backref_assign_error val[0]
213
+ }
214
+ | lhs tEQL mrhs
215
+ {
216
+ result = new_assign val[0], s(:svalue, val[2])
217
+ }
218
+ | mlhs tEQL mrhs_arg
219
+ {
220
+ result = new_masgn val[0], val[2]
221
+ }
222
+ | expr
223
+
224
+ command_asgn: lhs tEQL command_call
225
+ {
226
+ result = new_assign val[0], val[2]
227
+ }
228
+ | lhs tEQL command_asgn
229
+ {
230
+ result = new_assign val[0], val[2]
231
+ }
232
+
233
+ expr: command_call
234
+ | expr kAND expr
235
+ {
236
+ result = logical_op :and, val[0], val[2]
237
+ }
238
+ | expr kOR expr
239
+ {
240
+ result = logical_op :or, val[0], val[2]
241
+ }
242
+ | kNOT opt_nl expr
243
+ {
244
+ result = s(:call, val[2], :"!")
245
+ }
246
+ | tBANG command_call
247
+ {
248
+ result = s(:call, val[1], :"!")
249
+ }
250
+ | arg
251
+
252
+ expr_value: expr
253
+ {
254
+ result = value_expr(val[0])
255
+ }
256
+
257
+ command_call: command
258
+ | block_command
259
+
260
+ block_command: block_call
261
+ | block_call dot_or_colon operation2 command_args
262
+ {
263
+ result = new_call val[0], val[2].to_sym, val[3]
264
+ }
265
+
266
+ cmd_brace_block: tLBRACE_ARG
267
+ {
268
+ self.env.extend(:dynamic)
269
+ result = self.lexer.lineno
270
+ }
271
+ opt_block_param
272
+ {
273
+ result = nil # self.env.dynamic.keys
274
+ }
275
+ compstmt tRCURLY
276
+ {
277
+ result = new_iter nil, val[2], val[4]
278
+ result.line = val[1]
279
+
280
+ self.env.unextend
281
+ }
282
+
283
+ fcall: operation
284
+ {
285
+ result = new_call nil, val[0].to_sym
286
+ }
287
+
288
+ command: fcall command_args =tLOWEST
289
+ {
290
+ result = val[0].concat val[1][1..-1] # REFACTOR pattern
291
+ }
292
+ | fcall command_args cmd_brace_block
293
+ {
294
+ result = val[0].concat val[1][1..-1]
295
+ if val[2] then
296
+ block_dup_check result, val[2]
297
+
298
+ result, operation = val[2], result
299
+ result.insert 1, operation
300
+ end
301
+ }
302
+ | primary_value call_op operation2 command_args =tLOWEST
303
+ {
304
+ result = new_call val[0], val[2].to_sym, val[3], val[1]
305
+ }
306
+ | primary_value call_op operation2 command_args cmd_brace_block
307
+ {
308
+ recv, _, msg, args, block = val
309
+ call = new_call recv, msg.to_sym, args, val[1]
310
+
311
+ block_dup_check call, block
312
+
313
+ block.insert 1, call
314
+ result = block
315
+ }
316
+ | primary_value tCOLON2 operation2 command_args =tLOWEST
317
+ {
318
+ result = new_call val[0], val[2].to_sym, val[3]
319
+ }
320
+ | primary_value tCOLON2 operation2 command_args cmd_brace_block
321
+ {
322
+ recv, _, msg, args, block = val
323
+ call = new_call recv, msg.to_sym, args
324
+
325
+ block_dup_check call, block
326
+
327
+ block.insert 1, call
328
+ result = block
329
+ }
330
+ | kSUPER command_args
331
+ {
332
+ result = new_super val[1]
333
+ }
334
+ | kYIELD command_args
335
+ {
336
+ result = new_yield val[1]
337
+ }
338
+ | kRETURN call_args
339
+ {
340
+ line = val[0].last
341
+ result = s(:return, ret_args(val[1])).line(line)
342
+ }
343
+ | kBREAK call_args
344
+ {
345
+ line = val[0].last
346
+ result = s(:break, ret_args(val[1])).line(line)
347
+ }
348
+ | kNEXT call_args
349
+ {
350
+ line = val[0].last
351
+ result = s(:next, ret_args(val[1])).line(line)
352
+ }
353
+
354
+ mlhs: mlhs_basic
355
+ | tLPAREN mlhs_inner rparen
356
+ {
357
+ result = val[1]
358
+ }
359
+
360
+ mlhs_inner: mlhs_basic
361
+ | tLPAREN mlhs_inner rparen
362
+ {
363
+ result = s(:masgn, s(:array, val[1]))
364
+ }
365
+
366
+ mlhs_basic: mlhs_head
367
+ {
368
+ result = s(:masgn, val[0])
369
+ }
370
+ | mlhs_head mlhs_item
371
+ {
372
+ result = s(:masgn, val[0] << val[1].compact)
373
+ }
374
+ | mlhs_head tSTAR mlhs_node
375
+ {
376
+ result = s(:masgn, val[0] << s(:splat, val[2]))
377
+ }
378
+ | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
379
+ {
380
+ ary1, _, splat, _, ary2 = val
381
+
382
+ result = list_append ary1, s(:splat, splat)
383
+ result.concat ary2[1..-1]
384
+ result = s(:masgn, result)
385
+ }
386
+ | mlhs_head tSTAR
387
+ {
388
+ result = s(:masgn, val[0] << s(:splat))
389
+ }
390
+ | mlhs_head tSTAR tCOMMA mlhs_post
391
+ {
392
+ ary = list_append val[0], s(:splat)
393
+ ary.concat val[3][1..-1]
394
+ result = s(:masgn, ary)
395
+ }
396
+ | tSTAR mlhs_node
397
+ {
398
+ result = s(:masgn, s(:array, s(:splat, val[1])))
399
+ }
400
+ | tSTAR mlhs_node tCOMMA mlhs_post
401
+ {
402
+ ary = s(:array, s(:splat, val[1]))
403
+ ary.concat val[3][1..-1]
404
+ result = s(:masgn, ary)
405
+ }
406
+ | tSTAR
407
+ {
408
+ result = s(:masgn, s(:array, s(:splat)))
409
+ }
410
+ | tSTAR tCOMMA mlhs_post
411
+ {
412
+ result = s(:masgn, s(:array, s(:splat), *val[2][1..-1]))
413
+ }
414
+
415
+ mlhs_item: mlhs_node
416
+ | tLPAREN mlhs_inner rparen
417
+ {
418
+ result = val[1]
419
+ }
420
+
421
+ mlhs_head: mlhs_item tCOMMA
422
+ {
423
+ result = s(:array, val[0])
424
+ }
425
+ | mlhs_head mlhs_item tCOMMA
426
+ {
427
+ result = val[0] << val[1].compact
428
+ }
429
+
430
+ mlhs_post: mlhs_item
431
+ {
432
+ result = s(:array, val[0])
433
+ }
434
+ | mlhs_post tCOMMA mlhs_item
435
+ {
436
+ result = list_append val[0], val[2]
437
+ }
438
+
439
+ mlhs_node: user_variable
440
+ {
441
+ result = self.assignable val[0]
442
+ }
443
+ | keyword_variable
444
+ {
445
+ result = self.assignable val[0]
446
+ }
447
+ | primary_value tLBRACK2 opt_call_args rbracket
448
+ {
449
+ result = self.aryset val[0], val[2]
450
+ }
451
+ | primary_value call_op tIDENTIFIER
452
+ {
453
+ result = new_attrasgn val[0], val[2], val[1]
454
+ }
455
+ | primary_value tCOLON2 tIDENTIFIER
456
+ {
457
+ result = s(:attrasgn, val[0], :"#{val[2]}=")
458
+ }
459
+ | primary_value call_op tCONSTANT
460
+ {
461
+ result = new_attrasgn val[0], val[2], val[1]
462
+ }
463
+ | primary_value tCOLON2 tCONSTANT
464
+ {
465
+ if (self.in_def || self.in_single > 0) then
466
+ debug20 7
467
+ yyerror "dynamic constant assignment"
468
+ end
469
+
470
+ result = s(:const, s(:colon2, val[0], val[2].to_sym), nil)
471
+ }
472
+ | tCOLON3 tCONSTANT
473
+ {
474
+ if (self.in_def || self.in_single > 0) then
475
+ debug20 8
476
+ yyerror "dynamic constant assignment"
477
+ end
478
+
479
+ result = s(:const, nil, s(:colon3, val[1].to_sym))
480
+ }
481
+ | backref
482
+ {
483
+ self.backref_assign_error val[0]
484
+ }
485
+
486
+ lhs: user_variable
487
+ {
488
+ result = self.assignable val[0]
489
+ }
490
+ | keyword_variable
491
+ {
492
+ result = self.assignable val[0]
493
+ debug20 9, val, result
494
+ }
495
+ | primary_value tLBRACK2 opt_call_args rbracket
496
+ {
497
+ result = self.aryset val[0], val[2]
498
+ }
499
+ | primary_value call_op tIDENTIFIER # REFACTOR
500
+ {
501
+ result = new_attrasgn val[0], val[2], val[1]
502
+ }
503
+ | primary_value tCOLON2 tIDENTIFIER
504
+ {
505
+ result = s(:attrasgn, val[0], :"#{val[2]}=")
506
+ }
507
+ | primary_value call_op tCONSTANT # REFACTOR?
508
+ {
509
+ result = new_attrasgn val[0], val[2], val[1]
510
+ }
511
+ | primary_value tCOLON2 tCONSTANT
512
+ {
513
+ if (self.in_def || self.in_single > 0) then
514
+ debug20 10
515
+ yyerror "dynamic constant assignment"
516
+ end
517
+
518
+ result = s(:const, s(:colon2, val[0], val[2].to_sym))
519
+ }
520
+ | tCOLON3 tCONSTANT
521
+ {
522
+ if (self.in_def || self.in_single > 0) then
523
+ debug20 11
524
+ yyerror "dynamic constant assignment"
525
+ end
526
+
527
+ result = s(:const, s(:colon3, val[1].to_sym))
528
+ }
529
+ | backref
530
+ {
531
+ self.backref_assign_error val[0]
532
+ }
533
+
534
+ cname: tIDENTIFIER
535
+ {
536
+ yyerror "class/module name must be CONSTANT"
537
+ }
538
+ | tCONSTANT
539
+
540
+ cpath: tCOLON3 cname
541
+ {
542
+ result = s(:colon3, val[1].to_sym)
543
+ }
544
+ | cname
545
+ {
546
+ result = val[0].to_sym
547
+ }
548
+ | primary_value tCOLON2 cname
549
+ {
550
+ result = s(:colon2, val[0], val[2].to_sym)
551
+ }
552
+
553
+ fname: tIDENTIFIER | tCONSTANT | tFID
554
+ | op
555
+ {
556
+ lexer.lex_state = :expr_end
557
+ result = val[0]
558
+ }
559
+
560
+ | reswords
561
+ {
562
+ lexer.lex_state = :expr_end
563
+ result = val[0]
564
+ }
565
+
566
+ fsym: fname | symbol
567
+
568
+ fitem: fsym
569
+ {
570
+ result = s(:lit, val[0].to_sym)
571
+ }
572
+ | dsym
573
+
574
+ undef_list: fitem
575
+ {
576
+ result = new_undef val[0]
577
+ }
578
+ |
579
+ undef_list tCOMMA
580
+ {
581
+ lexer.lex_state = :expr_fname
582
+ }
583
+ fitem
584
+ {
585
+ result = new_undef val[0], val[3]
586
+ }
587
+
588
+ op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
589
+ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
590
+ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
591
+ | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
592
+ | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
593
+
594
+ reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
595
+ | kALIAS | kAND | kBEGIN | kBREAK | kCASE
596
+ | kCLASS | kDEF | kDEFINED | kDO | kELSE
597
+ | kELSIF | kEND | kENSURE | kFALSE | kFOR
598
+ | kIN | kMODULE | kNEXT | kNIL | kNOT
599
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN
600
+ | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
601
+ | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
602
+ | kUNTIL
603
+
604
+ arg: lhs tEQL arg
605
+ {
606
+ result = new_assign val[0], val[2]
607
+ }
608
+ | lhs tEQL arg kRESCUE_MOD arg
609
+ {
610
+ result = new_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
611
+ }
612
+ | var_lhs tOP_ASGN arg
613
+ {
614
+ result = new_op_asgn val
615
+ }
616
+ | var_lhs tOP_ASGN arg kRESCUE_MOD arg
617
+ {
618
+ result = new_op_asgn val
619
+ result = s(:rescue, result, new_resbody(s(:array), val[4]))
620
+ }
621
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg
622
+ {
623
+ val[2][0] = :arglist if val[2]
624
+ result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
625
+ }
626
+ | primary_value call_op tIDENTIFIER tOP_ASGN arg
627
+ {
628
+ result = new_op_asgn2 val
629
+ }
630
+ | primary_value call_op tCONSTANT tOP_ASGN arg
631
+ {
632
+ result = new_op_asgn2 val
633
+ }
634
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
635
+ {
636
+ result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
637
+ }
638
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
639
+ {
640
+ yyerror "constant re-assignment"
641
+ }
642
+ | tCOLON3 tCONSTANT tOP_ASGN arg
643
+ {
644
+ yyerror "constant re-assignment"
645
+ }
646
+ | backref tOP_ASGN arg
647
+ {
648
+ self.backref_assign_error val[0]
649
+ }
650
+ | arg tDOT2 arg
651
+ {
652
+ v1, v2 = val[0], val[2]
653
+ if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
654
+ result = s(:lit, (v1.last)..(v2.last))
655
+ else
656
+ result = s(:dot2, v1, v2)
657
+ end
658
+ }
659
+ | arg tDOT3 arg
660
+ {
661
+ v1, v2 = val[0], val[2]
662
+ if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
663
+ result = s(:lit, (v1.last)...(v2.last))
664
+ else
665
+ result = s(:dot3, v1, v2)
666
+ end
667
+ }
668
+ | arg tPLUS arg
669
+ {
670
+ result = new_call val[0], :+, argl(val[2])
671
+ }
672
+ | arg tMINUS arg
673
+ {
674
+ result = new_call val[0], :-, argl(val[2])
675
+ }
676
+ | arg tSTAR2 arg # TODO: rename
677
+ {
678
+ result = new_call val[0], :*, argl(val[2])
679
+ }
680
+ | arg tDIVIDE arg
681
+ {
682
+ result = new_call val[0], :"/", argl(val[2])
683
+ }
684
+ | arg tPERCENT arg
685
+ {
686
+ result = new_call val[0], :"%", argl(val[2])
687
+ }
688
+ | arg tPOW arg
689
+ {
690
+ result = new_call val[0], :**, argl(val[2])
691
+ }
692
+ | tUMINUS_NUM simple_numeric tPOW arg
693
+ {
694
+ result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
695
+ }
696
+ | tUPLUS arg
697
+ {
698
+ result = new_call val[1], :"+@"
699
+ }
700
+ | tUMINUS arg
701
+ {
702
+ result = new_call val[1], :"-@"
703
+ }
704
+ | arg tPIPE arg
705
+ {
706
+ result = new_call val[0], :"|", argl(val[2])
707
+ }
708
+ | arg tCARET arg
709
+ {
710
+ result = new_call val[0], :"^", argl(val[2])
711
+ }
712
+ | arg tAMPER2 arg
713
+ {
714
+ result = new_call val[0], :"&", argl(val[2])
715
+ }
716
+ | arg tCMP arg
717
+ {
718
+ result = new_call val[0], :"<=>", argl(val[2])
719
+ }
720
+ | arg tGT arg
721
+ {
722
+ result = new_call val[0], :">", argl(val[2])
723
+ }
724
+ | arg tGEQ arg
725
+ {
726
+ result = new_call val[0], :">=", argl(val[2])
727
+ }
728
+ | arg tLT arg
729
+ {
730
+ result = new_call val[0], :"<", argl(val[2])
731
+ }
732
+ | arg tLEQ arg
733
+ {
734
+ result = new_call val[0], :"<=", argl(val[2])
735
+ }
736
+ | arg tEQ arg
737
+ {
738
+ result = new_call val[0], :"==", argl(val[2])
739
+ }
740
+ | arg tEQQ arg
741
+ {
742
+ result = new_call val[0], :"===", argl(val[2])
743
+ }
744
+ | arg tNEQ arg
745
+ {
746
+ result = new_call val[0], :"!=", argl(val[2])
747
+ }
748
+ | arg tMATCH arg
749
+ {
750
+ result = new_match val[0], val[2]
751
+ }
752
+ | arg tNMATCH arg
753
+ {
754
+ result = s(:not, new_match(val[0], val[2]))
755
+ }
756
+ | tBANG arg
757
+ {
758
+ result = new_call val[1], :"!"
759
+ }
760
+ | tTILDE arg
761
+ {
762
+ result = new_call value_expr(val[1]), :"~"
763
+ }
764
+ | arg tLSHFT arg
765
+ {
766
+ val[0] = value_expr val[0]
767
+ val[2] = value_expr val[2]
768
+ result = new_call val[0], :"\<\<", argl(val[2])
769
+ }
770
+ | arg tRSHFT arg
771
+ {
772
+ val[0] = value_expr val[0]
773
+ val[2] = value_expr val[2]
774
+ result = new_call val[0], :">>", argl(val[2])
775
+ }
776
+ | arg tANDOP arg
777
+ {
778
+ result = logical_op :and, val[0], val[2]
779
+ }
780
+ | arg tOROP arg
781
+ {
782
+ result = logical_op :or, val[0], val[2]
783
+ }
784
+ | kDEFINED opt_nl arg
785
+ {
786
+ result = s(:defined, val[2])
787
+ }
788
+ | arg tEH arg opt_nl tCOLON arg
789
+ {
790
+ result = s(:if, val[0], val[2], val[5])
791
+ }
792
+ | primary
793
+
794
+ arg_value: arg
795
+ {
796
+ result = value_expr(val[0])
797
+ }
798
+
799
+ aref_args: none
800
+ | args trailer
801
+ {
802
+ result = args [val[0]]
803
+ }
804
+ | args tCOMMA assocs trailer
805
+ {
806
+ result = args [val[0], array_to_hash(val[2])]
807
+ }
808
+ | assocs trailer
809
+ {
810
+ result = args [array_to_hash(val[0])]
811
+ }
812
+
813
+ paren_args: tLPAREN2 opt_call_args rparen
814
+ {
815
+ result = val[1]
816
+ }
817
+
818
+ opt_paren_args: none
819
+ | paren_args
820
+
821
+ opt_call_args: none
822
+ {
823
+ result = val[0]
824
+ }
825
+ | call_args
826
+ {
827
+ result = val[0]
828
+ }
829
+ | args tCOMMA
830
+ {
831
+ result = args val
832
+ }
833
+ | args tCOMMA assocs tCOMMA
834
+ {
835
+ result = args [val[0], array_to_hash(val[2])]
836
+ }
837
+ | assocs tCOMMA
838
+ {
839
+ result = args [array_to_hash(val[0])]
840
+ }
841
+
842
+ call_args: command
843
+ {
844
+ warning "parenthesize argument(s) for future version"
845
+ result = call_args val
846
+ }
847
+ | args opt_block_arg
848
+ {
849
+ result = call_args val
850
+ result = self.arg_blk_pass val[0], val[1]
851
+ }
852
+ | assocs opt_block_arg
853
+ {
854
+ result = call_args [array_to_hash(val[0])]
855
+ result = self.arg_blk_pass result, val[1]
856
+ }
857
+ | args tCOMMA assocs opt_block_arg
858
+ {
859
+ result = call_args [val[0], array_to_hash(val[2])]
860
+ result = self.arg_blk_pass result, val[3]
861
+ }
862
+ | block_arg
863
+ {
864
+ result = call_args val
865
+ }
866
+
867
+ command_args: {
868
+ result = lexer.cmdarg.stack.dup # TODO: smell?
869
+ lexer.cmdarg.push true
870
+ }
871
+ call_args
872
+ {
873
+ lexer.cmdarg.stack.replace val[0]
874
+ result = val[1]
875
+ }
876
+
877
+ block_arg: tAMPER arg_value
878
+ {
879
+ result = s(:block_pass, val[1])
880
+ }
881
+
882
+ opt_block_arg: tCOMMA block_arg
883
+ {
884
+ result = val[1]
885
+ }
886
+ | none
887
+
888
+ args: arg_value
889
+ {
890
+ result = s(:array, val[0])
891
+ }
892
+ | tSTAR arg_value
893
+ {
894
+ result = s(:array, s(:splat, val[1]))
895
+ }
896
+ | args tCOMMA arg_value
897
+ {
898
+ result = self.list_append val[0], val[2]
899
+ }
900
+ | args tCOMMA tSTAR arg_value
901
+ {
902
+ result = self.list_append val[0], s(:splat, val[3])
903
+ }
904
+
905
+ mrhs_arg: mrhs
906
+ {
907
+ result = new_masgn_arg val[0]
908
+ }
909
+ | arg_value
910
+ {
911
+ result = new_masgn_arg val[0], :wrap
912
+ }
913
+
914
+ mrhs: args tCOMMA arg_value
915
+ {
916
+ result = val[0] << val[2]
917
+ }
918
+ | args tCOMMA tSTAR arg_value
919
+ {
920
+ result = self.arg_concat val[0], val[3]
921
+ }
922
+ | tSTAR arg_value
923
+ {
924
+ result = s(:splat, val[1])
925
+ }
926
+
927
+ primary: literal
928
+ | strings
929
+ | xstring
930
+ | regexp
931
+ | words
932
+ | qwords
933
+ | symbols
934
+ | qsymbols
935
+ | var_ref
936
+ | backref
937
+ | tFID
938
+ {
939
+ result = new_call nil, val[0].to_sym
940
+ }
941
+ | kBEGIN
942
+ {
943
+ result = self.lexer.lineno
944
+ }
945
+ bodystmt kEND
946
+ {
947
+ unless val[2] then
948
+ result = s(:nil)
949
+ else
950
+ result = s(:begin, val[2])
951
+ end
952
+
953
+ result.line = val[1]
954
+ }
955
+ | tLPAREN_ARG rparen
956
+ {
957
+ debug20 13, val, result
958
+ }
959
+ | tLPAREN_ARG expr
960
+ {
961
+ lexer.lex_state = :expr_endarg
962
+ }
963
+ rparen
964
+ {
965
+ warning "(...) interpreted as grouped expression"
966
+ result = val[1]
967
+ }
968
+ | tLPAREN compstmt tRPAREN
969
+ {
970
+ result = val[1] || s(:nil)
971
+ result.paren = true
972
+ }
973
+ | primary_value tCOLON2 tCONSTANT
974
+ {
975
+ result = s(:colon2, val[0], val[2].to_sym)
976
+ }
977
+ | tCOLON3 tCONSTANT
978
+ {
979
+ result = s(:colon3, val[1].to_sym)
980
+ }
981
+ | tLBRACK aref_args tRBRACK
982
+ {
983
+ result = val[1] || s(:array)
984
+ result[0] = :array # aref_args is :args
985
+ }
986
+ | tLBRACE assoc_list tRCURLY
987
+ {
988
+ result = s(:hash, *val[1].values) # TODO: array_to_hash?
989
+ }
990
+ | kRETURN
991
+ {
992
+ result = s(:return)
993
+ }
994
+ | kYIELD tLPAREN2 call_args rparen
995
+ {
996
+ result = new_yield val[2]
997
+ }
998
+ | kYIELD tLPAREN2 rparen
999
+ {
1000
+ result = new_yield
1001
+ }
1002
+ | kYIELD
1003
+ {
1004
+ result = new_yield
1005
+ }
1006
+ | kDEFINED opt_nl tLPAREN2 expr rparen
1007
+ {
1008
+ result = s(:defined, val[3])
1009
+ }
1010
+ | kNOT tLPAREN2 expr rparen
1011
+ {
1012
+ result = s(:call, val[2], :"!")
1013
+ }
1014
+ | kNOT tLPAREN2 rparen
1015
+ {
1016
+ debug20 14, val, result
1017
+ }
1018
+ | fcall brace_block
1019
+ {
1020
+ oper, iter = val[0], val[1]
1021
+ call = oper # FIX
1022
+ iter.insert 1, call
1023
+ result = iter
1024
+ call.line = iter.line
1025
+ }
1026
+ | method_call
1027
+ | method_call brace_block
1028
+ {
1029
+ call, iter = val[0], val[1]
1030
+ block_dup_check call, iter
1031
+ iter.insert 1, call # FIX
1032
+ result = iter
1033
+ }
1034
+ | tLAMBDA lambda
1035
+ {
1036
+ result = val[1] # TODO: fix lineno
1037
+ }
1038
+ | kIF expr_value then compstmt if_tail kEND
1039
+ {
1040
+ result = new_if val[1], val[3], val[4]
1041
+ }
1042
+ | kUNLESS expr_value then compstmt opt_else kEND
1043
+ {
1044
+ result = new_if val[1], val[4], val[3]
1045
+ }
1046
+ | kWHILE
1047
+ {
1048
+ lexer.cond.push true
1049
+ }
1050
+ expr_value do
1051
+ {
1052
+ lexer.cond.pop
1053
+ }
1054
+ compstmt kEND
1055
+ {
1056
+ result = new_while val[5], val[2], true
1057
+ }
1058
+ | kUNTIL
1059
+ {
1060
+ lexer.cond.push true
1061
+ }
1062
+ expr_value do
1063
+ {
1064
+ lexer.cond.pop
1065
+ }
1066
+ compstmt kEND
1067
+ {
1068
+ result = new_until val[5], val[2], true
1069
+ }
1070
+ | kCASE expr_value opt_terms case_body kEND
1071
+ {
1072
+ (_, line), expr, _, body, _ = val
1073
+ result = new_case expr, body, line
1074
+ }
1075
+ | kCASE opt_terms case_body kEND
1076
+ {
1077
+ (_, line), _, body, _ = val
1078
+ result = new_case nil, body, line
1079
+ }
1080
+ | kFOR for_var kIN
1081
+ {
1082
+ lexer.cond.push true
1083
+ }
1084
+ expr_value do
1085
+ {
1086
+ lexer.cond.pop
1087
+ }
1088
+ compstmt kEND
1089
+ {
1090
+ result = new_for val[4], val[1], val[7]
1091
+ }
1092
+ | kCLASS
1093
+ {
1094
+ result = self.lexer.lineno
1095
+ }
1096
+ cpath superclass
1097
+ {
1098
+ self.comments.push self.lexer.comments
1099
+ if (self.in_def || self.in_single > 0) then
1100
+ yyerror "class definition in method body"
1101
+ end
1102
+ self.env.extend
1103
+ }
1104
+ bodystmt kEND
1105
+ {
1106
+ result = new_class val
1107
+ self.env.unextend
1108
+ self.lexer.comments # we don't care about comments in the body
1109
+ }
1110
+ | kCLASS tLSHFT
1111
+ {
1112
+ result = self.lexer.lineno
1113
+ }
1114
+ expr
1115
+ {
1116
+ result = self.in_def
1117
+ self.in_def = false
1118
+ }
1119
+ term
1120
+ {
1121
+ result = self.in_single
1122
+ self.in_single = 0
1123
+ self.env.extend
1124
+ }
1125
+ bodystmt kEND
1126
+ {
1127
+ result = new_sclass val
1128
+ self.env.unextend
1129
+ self.lexer.comments # we don't care about comments in the body
1130
+ }
1131
+ | kMODULE
1132
+ {
1133
+ result = self.lexer.lineno
1134
+ }
1135
+ cpath
1136
+ {
1137
+ self.comments.push self.lexer.comments
1138
+ yyerror "module definition in method body" if
1139
+ self.in_def or self.in_single > 0
1140
+
1141
+ self.env.extend
1142
+ }
1143
+ bodystmt kEND
1144
+ {
1145
+ result = new_module val
1146
+ self.env.unextend
1147
+ self.lexer.comments # we don't care about comments in the body
1148
+ }
1149
+ | kDEF fname
1150
+ {
1151
+ result = [self.in_def, self.lexer.cmdarg.stack.dup]
1152
+
1153
+ self.comments.push self.lexer.comments
1154
+ self.in_def = true
1155
+ self.env.extend
1156
+ # TODO: local->cmdargs = cmdarg_stack;
1157
+ # TODO: port local_push_gen and local_pop_gen
1158
+ lexer.cmdarg.stack.replace [false]
1159
+ }
1160
+ f_arglist bodystmt kEND
1161
+ {
1162
+ in_def, cmdarg = val[2]
1163
+
1164
+ result = new_defn val
1165
+
1166
+ lexer.cmdarg.stack.replace cmdarg
1167
+ self.env.unextend
1168
+ self.in_def = in_def
1169
+ self.lexer.comments # we don't care about comments in the body
1170
+ }
1171
+ | kDEF singleton dot_or_colon
1172
+ {
1173
+ self.comments.push self.lexer.comments
1174
+ lexer.lex_state = :expr_fname
1175
+ }
1176
+ fname
1177
+ {
1178
+ self.in_single += 1
1179
+ self.env.extend
1180
+ lexer.lex_state = :expr_endfn # force for args
1181
+ result = lexer.lineno
1182
+ }
1183
+ f_arglist bodystmt kEND
1184
+ {
1185
+ result = new_defs val
1186
+ result[3].line val[5]
1187
+
1188
+ self.env.unextend
1189
+ self.in_single -= 1
1190
+ self.lexer.comments # we don't care about comments in the body
1191
+ }
1192
+ | kBREAK
1193
+ {
1194
+ result = s(:break)
1195
+ }
1196
+ | kNEXT
1197
+ {
1198
+ result = s(:next)
1199
+ }
1200
+ | kREDO
1201
+ {
1202
+ result = s(:redo)
1203
+ }
1204
+ | kRETRY
1205
+ {
1206
+ result = s(:retry)
1207
+ }
1208
+
1209
+ primary_value: primary
1210
+ {
1211
+ result = value_expr(val[0])
1212
+ }
1213
+
1214
+ # These are really stupid
1215
+ k_begin: kBEGIN
1216
+ k_if: kIF
1217
+ k_unless: kUNLESS
1218
+ k_while: kWHILE
1219
+ k_until: kUNTIL
1220
+ k_case: kCASE
1221
+ k_for: kFOR
1222
+ k_class: kCLASS
1223
+ k_module: kMODULE
1224
+ k_def: kDEF
1225
+ k_end: kEND
1226
+
1227
+ then: term
1228
+ | kTHEN
1229
+ | term kTHEN
1230
+
1231
+ do: term
1232
+ | kDO_COND
1233
+
1234
+ if_tail: opt_else
1235
+ | kELSIF expr_value then compstmt if_tail
1236
+ {
1237
+ result = s(:if, val[1], val[3], val[4])
1238
+ }
1239
+
1240
+ opt_else: none
1241
+ | kELSE compstmt
1242
+ {
1243
+ result = val[1]
1244
+ }
1245
+
1246
+ for_var: lhs
1247
+ | mlhs
1248
+ {
1249
+ val[0].delete_at 1 if val[0][1].nil? # HACK
1250
+ }
1251
+
1252
+ f_marg: f_norm_arg
1253
+ | tLPAREN f_margs rparen
1254
+ {
1255
+ result = val[1]
1256
+ }
1257
+
1258
+ f_marg_list: f_marg
1259
+ {
1260
+ result = s(:array, val[0])
1261
+ }
1262
+ | f_marg_list tCOMMA f_marg
1263
+ {
1264
+ result = list_append val[0], val[2]
1265
+ }
1266
+
1267
+ f_margs: f_marg_list
1268
+ {
1269
+ args, = val
1270
+
1271
+ result = block_var args
1272
+ }
1273
+ | f_marg_list tCOMMA tSTAR f_norm_arg
1274
+ {
1275
+ args, _, _, splat = val
1276
+
1277
+ result = block_var args, "*#{splat}".to_sym
1278
+ }
1279
+ | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1280
+ {
1281
+ args, _, _, splat, _, args2 = val
1282
+
1283
+ result = block_var args, "*#{splat}".to_sym, args2
1284
+ }
1285
+ | f_marg_list tCOMMA tSTAR
1286
+ {
1287
+ args, _, _ = val
1288
+
1289
+ result = block_var args, :*
1290
+ }
1291
+ | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1292
+ {
1293
+ args, _, _, _, args2 = val
1294
+
1295
+ result = block_var args, :*, args2
1296
+ }
1297
+ | tSTAR f_norm_arg
1298
+ {
1299
+ _, splat = val
1300
+
1301
+ result = block_var :"*#{splat}"
1302
+ }
1303
+ | tSTAR f_norm_arg tCOMMA f_marg_list
1304
+ {
1305
+ _, splat, _, args = val
1306
+
1307
+ result = block_var :"*#{splat}", args
1308
+ }
1309
+ | tSTAR
1310
+ {
1311
+ result = block_var :*
1312
+ }
1313
+ | tSTAR tCOMMA f_marg_list
1314
+ {
1315
+ _, _, args = val
1316
+
1317
+ result = block_var :*, args
1318
+ }
1319
+
1320
+ block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1321
+ {
1322
+ result = call_args val
1323
+ }
1324
+ | f_block_kwarg opt_f_block_arg
1325
+ {
1326
+ result = call_args val
1327
+ }
1328
+ | f_kwrest opt_f_block_arg
1329
+ {
1330
+ result = call_args val
1331
+ }
1332
+ | f_block_arg
1333
+ {
1334
+ result = call_args val
1335
+ }
1336
+
1337
+ opt_block_args_tail: tCOMMA block_args_tail
1338
+ {
1339
+ result = args val
1340
+ }
1341
+ | none
1342
+
1343
+ block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1344
+ {
1345
+ result = args val
1346
+ }
1347
+ | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1348
+ {
1349
+ result = args val
1350
+ }
1351
+ | f_arg tCOMMA f_block_optarg opt_block_args_tail
1352
+ {
1353
+ result = args val
1354
+ }
1355
+ | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1356
+ {
1357
+ result = args val
1358
+ }
1359
+ | f_arg tCOMMA f_rest_arg opt_block_args_tail
1360
+ {
1361
+ result = args val
1362
+ }
1363
+ | f_arg tCOMMA
1364
+ {
1365
+ result = args val
1366
+ }
1367
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1368
+ {
1369
+ result = args val
1370
+ }
1371
+ | f_arg opt_block_args_tail
1372
+ {
1373
+ result = args val
1374
+ }
1375
+ | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1376
+ {
1377
+ result = args val
1378
+ }
1379
+ | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1380
+ {
1381
+ result = args val
1382
+ }
1383
+ | f_block_optarg opt_block_args_tail
1384
+ {
1385
+ result = args val
1386
+ }
1387
+ | f_block_optarg tCOMMA f_arg opt_block_args_tail
1388
+ {
1389
+ result = args val
1390
+ }
1391
+ | f_rest_arg opt_block_args_tail
1392
+ {
1393
+ result = args val
1394
+ }
1395
+ | f_rest_arg tCOMMA f_arg opt_block_args_tail
1396
+ {
1397
+ result = args val
1398
+ }
1399
+ | block_args_tail
1400
+ {
1401
+ result = args val
1402
+ }
1403
+
1404
+ opt_block_param: none { result = 0 }
1405
+ | block_param_def
1406
+
1407
+ block_param_def: tPIPE opt_bv_decl tPIPE
1408
+ {
1409
+ result = args val
1410
+ }
1411
+ | tOROP
1412
+ {
1413
+ self.lexer.command_start = true
1414
+ result = s(:args)
1415
+ }
1416
+ | tPIPE block_param opt_bv_decl tPIPE
1417
+ {
1418
+ result = args val
1419
+ }
1420
+
1421
+ opt_bv_decl: opt_nl
1422
+ | opt_nl tSEMI bv_decls opt_nl
1423
+ {
1424
+ result = args val
1425
+ }
1426
+
1427
+ bv_decls: bvar
1428
+ {
1429
+ result = args val
1430
+ }
1431
+ | bv_decls tCOMMA bvar
1432
+ {
1433
+ result = args val
1434
+ }
1435
+
1436
+ bvar: tIDENTIFIER
1437
+ {
1438
+ result = s(:shadow, val[0].to_sym)
1439
+ }
1440
+ | f_bad_arg
1441
+
1442
+ lambda: {
1443
+ self.env.extend :dynamic
1444
+ result = self.lexer.lineno
1445
+
1446
+ result = lexer.lpar_beg
1447
+ lexer.paren_nest += 1
1448
+ lexer.lpar_beg = lexer.paren_nest
1449
+ }
1450
+ f_larglist lambda_body
1451
+ {
1452
+ lpar, args, body = val
1453
+ lexer.lpar_beg = lpar
1454
+
1455
+ call = new_call nil, :lambda
1456
+ result = new_iter call, args, body
1457
+ self.env.unextend
1458
+ }
1459
+
1460
+ f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1461
+ {
1462
+ result = args val
1463
+ }
1464
+ | f_args
1465
+ {
1466
+ result = val[0]
1467
+ result = 0 if result == s(:args)
1468
+ }
1469
+
1470
+ lambda_body: tLAMBEG compstmt tRCURLY
1471
+ {
1472
+ result = val[1]
1473
+ }
1474
+ | kDO_LAMBDA compstmt kEND
1475
+ {
1476
+ result = val[1]
1477
+ }
1478
+
1479
+ do_block: kDO_BLOCK
1480
+ {
1481
+ self.env.extend :dynamic
1482
+ result = self.lexer.lineno
1483
+ }
1484
+ opt_block_param
1485
+ {
1486
+ result = nil # self.env.dynamic.keys
1487
+ }
1488
+ compstmt kEND
1489
+ {
1490
+ args = val[2]
1491
+ body = val[4]
1492
+ result = new_iter nil, args, body
1493
+ result.line = val[1]
1494
+
1495
+ self.env.unextend
1496
+ }
1497
+
1498
+ block_call: command do_block
1499
+ {
1500
+ # TODO:
1501
+ ## if (nd_type($1) == NODE_YIELD) {
1502
+ ## compile_error(PARSER_ARG "block given to yield");
1503
+
1504
+ syntax_error "Both block arg and actual block given." if
1505
+ val[0].block_pass?
1506
+
1507
+ val = invert_block_call val if inverted? val
1508
+
1509
+ result = val[1]
1510
+ result.insert 1, val[0]
1511
+ }
1512
+ | block_call dot_or_colon operation2 opt_paren_args
1513
+ {
1514
+ result = new_call val[0], val[2].to_sym, val[3]
1515
+ }
1516
+ | block_call dot_or_colon operation2 opt_paren_args brace_block
1517
+ {
1518
+ iter1, _, name, args, iter2 = val
1519
+
1520
+ call = new_call iter1, name.to_sym, args
1521
+ iter2.insert 1, call
1522
+
1523
+ result = iter2
1524
+ }
1525
+ | block_call dot_or_colon operation2 command_args do_block
1526
+ {
1527
+ iter1, _, name, args, iter2 = val
1528
+
1529
+ call = new_call iter1, name.to_sym, args
1530
+ iter2.insert 1, call
1531
+
1532
+ result = iter2
1533
+ }
1534
+
1535
+ method_call: fcall
1536
+ {
1537
+ result = self.lexer.lineno
1538
+ }
1539
+ paren_args
1540
+ {
1541
+ args = self.call_args val[2..-1]
1542
+ result = val[0].concat args[1..-1]
1543
+ }
1544
+ | primary_value call_op operation2 opt_paren_args
1545
+ {
1546
+ result = new_call val[0], val[2].to_sym, val[3], val[1]
1547
+ }
1548
+ | primary_value tCOLON2 operation2 paren_args
1549
+ {
1550
+ result = new_call val[0], val[2].to_sym, val[3]
1551
+ }
1552
+ | primary_value tCOLON2 operation3
1553
+ {
1554
+ result = new_call val[0], val[2].to_sym
1555
+ }
1556
+ | primary_value call_op paren_args
1557
+ {
1558
+ result = new_call val[0], :call, val[2], val[1]
1559
+ }
1560
+ | primary_value tCOLON2 paren_args
1561
+ {
1562
+ result = new_call val[0], :call, val[2]
1563
+ }
1564
+ | kSUPER paren_args
1565
+ {
1566
+ result = new_super val[1]
1567
+ }
1568
+ | kSUPER
1569
+ {
1570
+ result = s(:zsuper)
1571
+ }
1572
+ | primary_value tLBRACK2 opt_call_args rbracket
1573
+ {
1574
+ result = new_aref val
1575
+ }
1576
+
1577
+ brace_block: tLCURLY
1578
+ {
1579
+ self.env.extend :dynamic
1580
+ result = self.lexer.lineno
1581
+ }
1582
+ opt_block_param
1583
+ {
1584
+ result = nil # self.env.dynamic.keys
1585
+ }
1586
+ compstmt tRCURLY
1587
+ {
1588
+ _, line, args, _, body, _ = val
1589
+
1590
+ result = new_iter nil, args, body
1591
+ result.line = line
1592
+
1593
+ self.env.unextend
1594
+ }
1595
+ | kDO
1596
+ {
1597
+ self.env.extend :dynamic
1598
+ result = self.lexer.lineno
1599
+ }
1600
+ opt_block_param
1601
+ {
1602
+ result = nil # self.env.dynamic.keys
1603
+ }
1604
+ compstmt kEND
1605
+ {
1606
+ _, line, args, _, body, _ = val
1607
+
1608
+ result = new_iter nil, args, body
1609
+ result.line = line
1610
+
1611
+ self.env.unextend
1612
+ }
1613
+
1614
+ case_body: kWHEN
1615
+ {
1616
+ result = self.lexer.lineno
1617
+ }
1618
+ args then compstmt cases
1619
+ {
1620
+ result = new_when(val[2], val[4])
1621
+ result.line = val[1]
1622
+ result << val[5] if val[5]
1623
+ }
1624
+
1625
+ cases: opt_else | case_body
1626
+
1627
+ opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1628
+ {
1629
+ _, klasses, var, _, body, rest = val
1630
+
1631
+ klasses ||= s(:array)
1632
+ klasses << new_assign(var, s(:gvar, :"$!")) if var
1633
+
1634
+ result = new_resbody(klasses, body)
1635
+ result << rest if rest # UGH, rewritten above
1636
+ }
1637
+ |
1638
+ {
1639
+ result = nil
1640
+ }
1641
+
1642
+ exc_list: arg_value
1643
+ {
1644
+ result = s(:array, val[0])
1645
+ }
1646
+ | mrhs
1647
+ | none
1648
+
1649
+ exc_var: tASSOC lhs
1650
+ {
1651
+ result = val[1]
1652
+ }
1653
+ | none
1654
+
1655
+ opt_ensure: kENSURE compstmt
1656
+ {
1657
+ _, body = val
1658
+
1659
+ result = body || s(:nil)
1660
+ }
1661
+ | none
1662
+
1663
+ literal: numeric
1664
+ {
1665
+ result = s(:lit, val[0])
1666
+ }
1667
+ | symbol
1668
+ {
1669
+ result = s(:lit, val[0])
1670
+ }
1671
+ | dsym
1672
+
1673
+ strings: string
1674
+ {
1675
+ val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr
1676
+ result = val[0]
1677
+ }
1678
+
1679
+ string: tCHAR
1680
+ {
1681
+ debug20 23, val, result
1682
+ }
1683
+ | string1
1684
+ | string string1
1685
+ {
1686
+ result = self.literal_concat val[0], val[1]
1687
+ }
1688
+
1689
+ string1: tSTRING_BEG string_contents tSTRING_END
1690
+ {
1691
+ result = val[1]
1692
+ }
1693
+ | tSTRING
1694
+ {
1695
+ result = new_string val
1696
+ }
1697
+
1698
+ xstring: tXSTRING_BEG xstring_contents tSTRING_END
1699
+ {
1700
+ result = new_xstring val[1]
1701
+ }
1702
+
1703
+ regexp: tREGEXP_BEG regexp_contents tREGEXP_END
1704
+ {
1705
+ result = new_regexp val
1706
+ }
1707
+
1708
+ words: tWORDS_BEG tSPACE tSTRING_END
1709
+ {
1710
+ result = s(:array)
1711
+ }
1712
+ | tWORDS_BEG word_list tSTRING_END
1713
+ {
1714
+ result = val[1]
1715
+ }
1716
+
1717
+ word_list: none
1718
+ {
1719
+ result = new_word_list
1720
+ }
1721
+ | word_list word tSPACE
1722
+ {
1723
+ result = val[0].dup << new_word_list_entry(val)
1724
+ }
1725
+
1726
+ word: string_content
1727
+ | word string_content
1728
+ {
1729
+ result = self.literal_concat val[0], val[1]
1730
+ }
1731
+
1732
+ symbols: tSYMBOLS_BEG tSPACE tSTRING_END
1733
+ {
1734
+ result = s(:array)
1735
+ }
1736
+ | tSYMBOLS_BEG symbol_list tSTRING_END
1737
+ {
1738
+ result = val[1]
1739
+ }
1740
+
1741
+ symbol_list: none
1742
+ {
1743
+ result = new_symbol_list
1744
+ }
1745
+ | symbol_list word tSPACE
1746
+ {
1747
+ result = val[0].dup << new_symbol_list_entry(val)
1748
+ }
1749
+
1750
+ qwords: tQWORDS_BEG tSPACE tSTRING_END
1751
+ {
1752
+ result = s(:array)
1753
+ }
1754
+ | tQWORDS_BEG qword_list tSTRING_END
1755
+ {
1756
+ result = val[1]
1757
+ }
1758
+
1759
+ qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
1760
+ {
1761
+ result = s(:array)
1762
+ }
1763
+ | tQSYMBOLS_BEG qsym_list tSTRING_END
1764
+ {
1765
+ result = val[1]
1766
+ }
1767
+
1768
+ qword_list: none
1769
+ {
1770
+ result = new_qword_list
1771
+ }
1772
+ | qword_list tSTRING_CONTENT tSPACE
1773
+ {
1774
+ result = val[0].dup << new_qword_list_entry(val)
1775
+ }
1776
+
1777
+ qsym_list: none
1778
+ {
1779
+ result = new_qsym_list
1780
+ }
1781
+ | qsym_list tSTRING_CONTENT tSPACE
1782
+ {
1783
+ result = val[0].dup << new_qsym_list_entry(val)
1784
+ }
1785
+
1786
+ string_contents: none
1787
+ {
1788
+ result = s(:str, "")
1789
+ }
1790
+ | string_contents string_content
1791
+ {
1792
+ result = literal_concat(val[0], val[1])
1793
+ }
1794
+
1795
+ xstring_contents: none
1796
+ {
1797
+ result = nil
1798
+ }
1799
+ | xstring_contents string_content
1800
+ {
1801
+ result = literal_concat(val[0], val[1])
1802
+ }
1803
+
1804
+ regexp_contents: none
1805
+ {
1806
+ result = nil
1807
+ }
1808
+ | regexp_contents string_content
1809
+ {
1810
+ result = literal_concat(val[0], val[1])
1811
+ }
1812
+
1813
+ string_content: tSTRING_CONTENT
1814
+ {
1815
+ result = new_string val
1816
+ }
1817
+ | tSTRING_DVAR
1818
+ {
1819
+ result = lexer.lex_strterm
1820
+
1821
+ lexer.lex_strterm = nil
1822
+ lexer.lex_state = :expr_beg # TODO: expr_value ?
1823
+ }
1824
+ string_dvar
1825
+ {
1826
+ lexer.lex_strterm = val[1]
1827
+ result = s(:evstr, val[2])
1828
+ }
1829
+ | tSTRING_DBEG
1830
+ {
1831
+ result = [lexer.lex_strterm,
1832
+ lexer.brace_nest,
1833
+ lexer.string_nest, # TODO: remove
1834
+ lexer.cond.store,
1835
+ lexer.cmdarg.store,
1836
+ lexer.lex_state,
1837
+ ]
1838
+
1839
+ lexer.lex_strterm = nil
1840
+ lexer.brace_nest = 0
1841
+ lexer.string_nest = 0
1842
+
1843
+ lexer.lex_state = :expr_value
1844
+ }
1845
+ compstmt tRCURLY
1846
+ {
1847
+ # TODO: tRCURLY -> tSTRING_END
1848
+ _, memo, stmt, _ = val
1849
+
1850
+ lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
1851
+
1852
+ lexer.lex_strterm = lex_strterm
1853
+ lexer.brace_nest = brace_nest
1854
+ lexer.string_nest = string_nest
1855
+
1856
+ lexer.cond.restore oldcond
1857
+ lexer.cmdarg.restore oldcmdarg
1858
+
1859
+ lexer.lex_state = oldlex_state
1860
+
1861
+ case stmt
1862
+ when Sexp then
1863
+ case stmt[0]
1864
+ when :str, :dstr, :evstr then
1865
+ result = stmt
1866
+ else
1867
+ result = s(:evstr, stmt)
1868
+ end
1869
+ when nil then
1870
+ result = s(:evstr)
1871
+ else
1872
+ debug20 25
1873
+ raise "unknown string body: #{stmt.inspect}"
1874
+ end
1875
+ }
1876
+
1877
+ string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) }
1878
+ | tIVAR { result = s(:ivar, val[0].to_sym) }
1879
+ | tCVAR { result = s(:cvar, val[0].to_sym) }
1880
+ | backref
1881
+
1882
+ symbol: tSYMBEG sym
1883
+ {
1884
+ lexer.lex_state = :expr_end
1885
+ result = val[1].to_sym
1886
+ }
1887
+ | tSYMBOL
1888
+ {
1889
+ result = val[0].to_sym
1890
+ }
1891
+
1892
+ sym: fname | tIVAR | tGVAR | tCVAR
1893
+
1894
+ dsym: tSYMBEG xstring_contents tSTRING_END
1895
+ {
1896
+ lexer.lex_state = :expr_end
1897
+ result = val[1]
1898
+
1899
+ result ||= s(:str, "")
1900
+
1901
+ case result[0]
1902
+ when :dstr then
1903
+ result[0] = :dsym
1904
+ when :str then
1905
+ result = s(:lit, result.last.to_sym)
1906
+ when :evstr then
1907
+ result = s(:dsym, "", result)
1908
+ else
1909
+ debug20 26, val, result
1910
+ end
1911
+ }
1912
+
1913
+ numeric: simple_numeric
1914
+ | tUMINUS_NUM simple_numeric
1915
+ {
1916
+ result = -val[1] # TODO: pt_testcase
1917
+ }
1918
+
1919
+ simple_numeric: tINTEGER
1920
+ | tFLOAT
1921
+ | tRATIONAL
1922
+ | tIMAGINARY
1923
+
1924
+ user_variable: tIDENTIFIER
1925
+ | tIVAR
1926
+ | tGVAR
1927
+ | tCONSTANT
1928
+ | tCVAR
1929
+
1930
+ keyword_variable: kNIL { result = s(:nil) }
1931
+ | kSELF { result = s(:self) }
1932
+ | kTRUE { result = s(:true) }
1933
+ | kFALSE { result = s(:false) }
1934
+ | k__FILE__ { result = s(:str, self.file) }
1935
+ | k__LINE__ { result = s(:lit, lexer.lineno) }
1936
+ | k__ENCODING__
1937
+ {
1938
+ result =
1939
+ if defined? Encoding then
1940
+ s(:colon2, s(:const, :Encoding), :UTF_8)
1941
+ else
1942
+ s(:str, "Unsupported!")
1943
+ end
1944
+ }
1945
+
1946
+ var_ref: user_variable
1947
+ {
1948
+ var = val[0]
1949
+ result = Sexp === var ? var : self.gettable(var)
1950
+ }
1951
+ | keyword_variable
1952
+ {
1953
+ var = val[0]
1954
+ result = Sexp === var ? var : self.gettable(var)
1955
+ }
1956
+
1957
+ var_lhs: user_variable
1958
+ {
1959
+ result = self.assignable val[0]
1960
+ }
1961
+ | keyword_variable
1962
+ {
1963
+ result = self.assignable val[0]
1964
+ debug20 29, val, result
1965
+ }
1966
+
1967
+ backref: tNTH_REF { result = s(:nth_ref, val[0]) }
1968
+ | tBACK_REF { result = s(:back_ref, val[0]) }
1969
+
1970
+ superclass: term
1971
+ {
1972
+ result = nil
1973
+ }
1974
+ | tLT
1975
+ {
1976
+ lexer.lex_state = :expr_beg
1977
+ }
1978
+ expr_value term
1979
+ {
1980
+ result = val[2]
1981
+ }
1982
+ | error term
1983
+ {
1984
+ yyerrok
1985
+ result = nil
1986
+ debug20 30, val, result
1987
+ }
1988
+
1989
+ f_arglist: tLPAREN2 f_args rparen
1990
+ {
1991
+ result = val[1]
1992
+ self.lexer.lex_state = :expr_beg
1993
+ self.lexer.command_start = true
1994
+ # TODO:
1995
+ # $<num>$ = parser->parser_in_kwarg;
1996
+ # parser->parser_in_kwarg = 1;
1997
+ }
1998
+ | f_args term
1999
+ {
2000
+ # TODO: parser->parser_in_kwarg = $<num>1;
2001
+ result = val[0]
2002
+ self.lexer.lex_state = :expr_beg
2003
+ self.lexer.command_start = true
2004
+ }
2005
+
2006
+ args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
2007
+ {
2008
+ result = args val
2009
+ }
2010
+ | f_kwarg opt_f_block_arg
2011
+ {
2012
+ result = args val
2013
+ }
2014
+ | f_kwrest opt_f_block_arg
2015
+ {
2016
+ result = args val
2017
+ }
2018
+ | f_block_arg
2019
+
2020
+ opt_args_tail: tCOMMA args_tail
2021
+ {
2022
+ result = val[1]
2023
+ }
2024
+ |
2025
+ {
2026
+ result = nil
2027
+ }
2028
+
2029
+ f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
2030
+ {
2031
+ result = args val
2032
+ }
2033
+ | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2034
+ {
2035
+ result = args val
2036
+ }
2037
+ | f_arg tCOMMA f_optarg opt_args_tail
2038
+ {
2039
+ result = args val
2040
+ }
2041
+ | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
2042
+ {
2043
+ result = args val
2044
+ }
2045
+ | f_arg tCOMMA f_rest_arg opt_args_tail
2046
+ {
2047
+ result = args val
2048
+ }
2049
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2050
+ {
2051
+ result = args val
2052
+ }
2053
+ | f_arg opt_args_tail
2054
+ {
2055
+ result = args val
2056
+ }
2057
+ | f_optarg tCOMMA f_rest_arg opt_args_tail
2058
+ {
2059
+ result = args val
2060
+ }
2061
+ | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2062
+ {
2063
+ result = args val
2064
+ }
2065
+ | f_optarg opt_args_tail
2066
+ {
2067
+ result = args val
2068
+ }
2069
+ | f_optarg tCOMMA f_arg opt_args_tail
2070
+ {
2071
+ result = args val
2072
+ }
2073
+ | f_rest_arg opt_args_tail
2074
+ {
2075
+ result = args val
2076
+ }
2077
+ | f_rest_arg tCOMMA f_arg opt_args_tail
2078
+ {
2079
+ result = args val
2080
+ }
2081
+ | args_tail
2082
+ {
2083
+ result = args val
2084
+ }
2085
+ |
2086
+ {
2087
+ result = args val
2088
+ }
2089
+
2090
+ f_bad_arg: tCONSTANT
2091
+ {
2092
+ yyerror "formal argument cannot be a constant"
2093
+ }
2094
+ | tIVAR
2095
+ {
2096
+ yyerror "formal argument cannot be an instance variable"
2097
+ }
2098
+ | tGVAR
2099
+ {
2100
+ yyerror "formal argument cannot be a global variable"
2101
+ }
2102
+ | tCVAR
2103
+ {
2104
+ yyerror "formal argument cannot be a class variable"
2105
+ }
2106
+
2107
+ f_norm_arg: f_bad_arg
2108
+ | tIDENTIFIER
2109
+ {
2110
+ identifier = val[0].to_sym
2111
+ self.env[identifier] = :lvar
2112
+
2113
+ result = identifier
2114
+ }
2115
+
2116
+ f_arg_asgn: f_norm_arg
2117
+
2118
+ f_arg_item: f_arg_asgn
2119
+ | tLPAREN f_margs rparen
2120
+ {
2121
+ result = val[1]
2122
+ }
2123
+
2124
+ f_arg: f_arg_item
2125
+ {
2126
+ case val[0]
2127
+ when Symbol then
2128
+ result = s(:args)
2129
+ result << val[0]
2130
+ when Sexp then
2131
+ result = val[0]
2132
+ else
2133
+ debug20 32
2134
+ raise "Unknown f_arg type: #{val.inspect}"
2135
+ end
2136
+ }
2137
+ | f_arg tCOMMA f_arg_item
2138
+ {
2139
+ list, _, item = val
2140
+
2141
+ if list.sexp_type == :args then
2142
+ result = list
2143
+ else
2144
+ result = s(:args, list)
2145
+ end
2146
+
2147
+ result << item
2148
+ }
2149
+
2150
+ f_label: tLABEL
2151
+
2152
+ f_kw: f_label arg_value
2153
+ {
2154
+ # TODO: call_args
2155
+ label, _ = val[0] # TODO: fix lineno?
2156
+ identifier = label.to_sym
2157
+ self.env[identifier] = :lvar
2158
+
2159
+ result = s(:array, s(:kwarg, identifier, val[1]))
2160
+ }
2161
+ | f_label
2162
+ {
2163
+ label, _ = val[0] # TODO: fix lineno?
2164
+ identifier = label.to_sym
2165
+ self.env[identifier] = :lvar
2166
+
2167
+ result = s(:array, s(:kwarg, identifier))
2168
+ }
2169
+
2170
+ f_block_kw: f_label primary_value
2171
+ {
2172
+ # TODO: call_args
2173
+ label, _ = val[0] # TODO: fix lineno?
2174
+ identifier = label.to_sym
2175
+ self.env[identifier] = :lvar
2176
+
2177
+ result = s(:array, s(:kwarg, identifier, val[1]))
2178
+ }
2179
+ | f_label
2180
+ {
2181
+ label, _ = val[0] # TODO: fix lineno?
2182
+ identifier = label.to_sym
2183
+ self.env[identifier] = :lvar
2184
+
2185
+ result = s(:array, s(:kwarg, identifier))
2186
+ }
2187
+
2188
+ f_block_kwarg: f_block_kw
2189
+ | f_block_kwarg tCOMMA f_block_kw
2190
+ {
2191
+ list, _, item = val
2192
+ result = list << item.last
2193
+ }
2194
+
2195
+ f_kwarg: f_kw
2196
+ | f_kwarg tCOMMA f_kw
2197
+ {
2198
+ result = args val
2199
+ }
2200
+
2201
+ kwrest_mark: tPOW
2202
+ | tDSTAR
2203
+
2204
+ f_kwrest: kwrest_mark tIDENTIFIER
2205
+ {
2206
+ result = :"**#{val[1]}"
2207
+ }
2208
+ | kwrest_mark
2209
+ {
2210
+ result = :"**"
2211
+ }
2212
+
2213
+ f_opt: f_arg_asgn tEQL arg_value
2214
+ {
2215
+ result = self.assignable val[0], val[2]
2216
+ # TODO: detect duplicate names
2217
+ }
2218
+
2219
+ f_block_opt: f_arg_asgn tEQL primary_value
2220
+ {
2221
+ result = self.assignable val[0], val[2]
2222
+ }
2223
+
2224
+ f_block_optarg: f_block_opt
2225
+ {
2226
+ result = s(:block, val[0])
2227
+ }
2228
+ | f_block_optarg tCOMMA f_block_opt
2229
+ {
2230
+ result = val[0]
2231
+ result << val[2]
2232
+ }
2233
+
2234
+ f_optarg: f_opt
2235
+ {
2236
+ result = s(:block, val[0])
2237
+ }
2238
+ | f_optarg tCOMMA f_opt
2239
+ {
2240
+ result = self.block_append val[0], val[2]
2241
+ }
2242
+
2243
+ restarg_mark: tSTAR2 | tSTAR
2244
+
2245
+ f_rest_arg: restarg_mark tIDENTIFIER
2246
+ {
2247
+ # TODO: differs from parse.y - needs tests
2248
+ name = val[1].to_sym
2249
+ self.assignable name
2250
+ result = :"*#{name}"
2251
+ }
2252
+ | restarg_mark
2253
+ {
2254
+ name = :"*"
2255
+ self.env[name] = :lvar
2256
+ result = name
2257
+ }
2258
+
2259
+ blkarg_mark: tAMPER2 | tAMPER
2260
+
2261
+ f_block_arg: blkarg_mark tIDENTIFIER
2262
+ {
2263
+ identifier = val[1].to_sym
2264
+
2265
+ self.env[identifier] = :lvar
2266
+ result = "&#{identifier}".to_sym
2267
+ }
2268
+
2269
+ opt_f_block_arg: tCOMMA f_block_arg
2270
+ {
2271
+ result = val[1]
2272
+ }
2273
+ |
2274
+ {
2275
+ result = nil
2276
+ }
2277
+
2278
+ singleton: var_ref
2279
+ | tLPAREN2
2280
+ {
2281
+ lexer.lex_state = :expr_beg
2282
+ }
2283
+ expr rparen
2284
+ {
2285
+ result = val[2]
2286
+ yyerror "Can't define single method for literals." if
2287
+ result[0] == :lit
2288
+ }
2289
+
2290
+ assoc_list: none # [!nil]
2291
+ {
2292
+ result = s(:array)
2293
+ }
2294
+ | assocs trailer # [!nil]
2295
+ {
2296
+ result = val[0]
2297
+ }
2298
+
2299
+ assocs: assoc
2300
+ | assocs tCOMMA assoc
2301
+ {
2302
+ list = val[0].dup
2303
+ more = val[2][1..-1]
2304
+ list.push(*more) unless more.empty?
2305
+ result = list
2306
+ result[0] = :hash
2307
+ # TODO: shouldn't this be a hash?
2308
+ }
2309
+
2310
+ assoc: arg_value tASSOC arg_value
2311
+ {
2312
+ result = s(:array, val[0], val[2])
2313
+ }
2314
+ | tLABEL arg_value
2315
+ {
2316
+ result = s(:array, s(:lit, val[0][0].to_sym), val[1])
2317
+ }
2318
+ | tSTRING_BEG string_contents tLABEL_END arg_value
2319
+ {
2320
+ _, sym, _, value = val
2321
+ sym[0] = :dsym
2322
+ result = s(:array, sym, value)
2323
+ }
2324
+ | tSYMBOL arg_value
2325
+ {
2326
+ raise "not yet: #{val.inspect}"
2327
+ # result = s(:array, s(:lit, val[1].to_sym), val[1])
2328
+ }
2329
+ | tDSTAR arg_value
2330
+ {
2331
+ result = s(:array, s(:kwsplat, val[1]))
2332
+ }
2333
+
2334
+ operation: tIDENTIFIER | tCONSTANT | tFID
2335
+ operation2: tIDENTIFIER | tCONSTANT | tFID | op
2336
+ operation3: tIDENTIFIER | tFID | op
2337
+ dot_or_colon: tDOT | tCOLON2
2338
+ call_op: tDOT
2339
+ | tLONELY
2340
+ opt_terms: | terms
2341
+ opt_nl: | tNL
2342
+ rparen: opt_nl tRPAREN
2343
+ rbracket: opt_nl tRBRACK
2344
+ trailer: | tNL | tCOMMA
2345
+
2346
+ term: tSEMI { yyerrok }
2347
+ | tNL
2348
+
2349
+ terms: term
2350
+ | terms tSEMI { yyerrok }
2351
+
2352
+ none: { result = nil; }
2353
+ end
2354
+
2355
+ ---- inner
2356
+
2357
+ require "ruby_lexer"
2358
+ require "ruby_parser_extras"
2359
+
2360
+ # :stopdoc:
2361
+
2362
+ # Local Variables: **
2363
+ # racc-token-length-max:14 **
2364
+ # End: **