PageRenderTime 64ms CodeModel.GetById 29ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/ruby19_parser.y

http://github.com/seattlerb/ruby_parser
Happy | 2109 lines | 1928 code | 181 blank | 0 comment | 0 complexity | 64755356cca7bf45ee95c3dd24797246 MD5 | raw file
  1. # -*- racc -*-
  2. class Ruby19Parser
  3. token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
  4. kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
  5. kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
  6. kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
  7. kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
  8. k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
  9. tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
  10. tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
  11. tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
  12. tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
  13. tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
  14. tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE
  15. tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY
  16. tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
  17. tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
  18. tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAST_TOKEN
  19. tLAMBDA tLAMBEG
  20. prechigh
  21. right tBANG tTILDE tUPLUS
  22. right tPOW
  23. right tUMINUS_NUM tUMINUS
  24. left tSTAR2 tDIVIDE tPERCENT
  25. left tPLUS tMINUS
  26. left tLSHFT tRSHFT
  27. left tAMPER2
  28. left tPIPE tCARET
  29. left tGT tGEQ tLT tLEQ
  30. nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
  31. left tANDOP
  32. left tOROP
  33. nonassoc tDOT2 tDOT3
  34. right tEH tCOLON
  35. left kRESCUE_MOD
  36. right tEQL tOP_ASGN
  37. nonassoc kDEFINED
  38. right kNOT
  39. left kOR kAND
  40. nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
  41. nonassoc tLBRACE_ARG
  42. nonassoc tLOWEST
  43. preclow
  44. rule
  45. program: {
  46. self.lexer.lex_state = :expr_beg
  47. }
  48. top_compstmt
  49. {
  50. result = new_compstmt val
  51. }
  52. top_compstmt: top_stmts opt_terms
  53. {
  54. result = val[0]
  55. }
  56. top_stmts: none
  57. | top_stmt
  58. | top_stmts terms top_stmt
  59. {
  60. result = self.block_append val[0], val[2]
  61. }
  62. | error top_stmt
  63. top_stmt: stmt
  64. | klBEGIN
  65. {
  66. if (self.in_def || self.in_single > 0) then
  67. yyerror "BEGIN in method"
  68. end
  69. self.env.extend
  70. }
  71. tLCURLY top_compstmt tRCURLY
  72. {
  73. result = new_iter s(:preexe), nil, val[3]
  74. }
  75. bodystmt: compstmt opt_rescue opt_else opt_ensure
  76. {
  77. result = new_body val
  78. }
  79. compstmt: stmts opt_terms
  80. {
  81. result = new_compstmt val
  82. }
  83. stmts: none
  84. | stmt
  85. | stmts terms stmt
  86. {
  87. result = self.block_append val[0], val[2]
  88. }
  89. | error stmt
  90. {
  91. result = val[1]
  92. }
  93. stmt: kALIAS fitem
  94. {
  95. lexer.lex_state = :expr_fname
  96. result = self.lexer.lineno
  97. }
  98. fitem
  99. {
  100. result = s(:alias, val[1], val[3]).line(val[2])
  101. }
  102. | kALIAS tGVAR tGVAR
  103. {
  104. result = s(:valias, val[1].to_sym, val[2].to_sym)
  105. }
  106. | kALIAS tGVAR tBACK_REF
  107. {
  108. result = s(:valias, val[1].to_sym, :"$#{val[2]}")
  109. }
  110. | kALIAS tGVAR tNTH_REF
  111. {
  112. yyerror "can't make alias for the number variables"
  113. }
  114. | kUNDEF undef_list
  115. {
  116. result = val[1]
  117. }
  118. | stmt kIF_MOD expr_value
  119. {
  120. result = new_if val[2], val[0], nil
  121. }
  122. | stmt kUNLESS_MOD expr_value
  123. {
  124. result = new_if val[2], nil, val[0]
  125. }
  126. | stmt kWHILE_MOD expr_value
  127. {
  128. result = new_while val[0], val[2], true
  129. }
  130. | stmt kUNTIL_MOD expr_value
  131. {
  132. result = new_until val[0], val[2], true
  133. }
  134. | stmt kRESCUE_MOD stmt
  135. {
  136. result = s(:rescue, val[0], new_resbody(s(:array), val[2]))
  137. }
  138. | klEND tLCURLY compstmt tRCURLY
  139. {
  140. if (self.in_def || self.in_single > 0) then
  141. yyerror "END in method; use at_exit"
  142. end
  143. result = new_iter s(:postexe), nil, val[2]
  144. }
  145. | command_asgn
  146. | mlhs tEQL command_call
  147. {
  148. result = new_masgn val[0], val[2], :wrap
  149. }
  150. | var_lhs tOP_ASGN command_call
  151. {
  152. result = new_op_asgn val
  153. }
  154. | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call
  155. {
  156. result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
  157. }
  158. | primary_value tDOT tIDENTIFIER tOP_ASGN command_call
  159. {
  160. result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
  161. }
  162. | primary_value tDOT tCONSTANT tOP_ASGN command_call
  163. {
  164. result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
  165. }
  166. | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
  167. {
  168. result = s(:op_asgn, val[0], val[4], val[2], val[3])
  169. }
  170. | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
  171. {
  172. result = s(:op_asgn, val[0], val[4], val[2], val[3])
  173. }
  174. | backref tOP_ASGN command_call
  175. {
  176. self.backref_assign_error val[0]
  177. }
  178. | lhs tEQL mrhs
  179. {
  180. result = self.node_assign val[0], s(:svalue, val[2])
  181. }
  182. | mlhs tEQL arg_value
  183. {
  184. result = new_masgn val[0], val[2], :wrap
  185. }
  186. | mlhs tEQL mrhs
  187. {
  188. result = new_masgn val[0], val[2]
  189. }
  190. | expr
  191. command_asgn: lhs tEQL command_call
  192. {
  193. result = self.node_assign val[0], val[2]
  194. }
  195. | lhs tEQL command_asgn
  196. {
  197. result = self.node_assign val[0], val[2]
  198. }
  199. expr: command_call
  200. | expr kAND expr
  201. {
  202. result = logop(:and, val[0], val[2])
  203. }
  204. | expr kOR expr
  205. {
  206. result = logop(:or, val[0], val[2])
  207. }
  208. | kNOT opt_nl expr
  209. {
  210. result = s(:call, val[2], :"!")
  211. }
  212. | tBANG command_call
  213. {
  214. result = s(:call, val[1], :"!")
  215. }
  216. | arg
  217. expr_value: expr
  218. {
  219. result = value_expr(val[0])
  220. }
  221. command_call: command
  222. | block_command
  223. block_command: block_call
  224. | block_call tDOT operation2 command_args # TODO: dot_or_colon
  225. {
  226. result = new_call val[0], val[2].to_sym, val[3]
  227. }
  228. | block_call tCOLON2 operation2 command_args
  229. {
  230. result = new_call val[0], val[2].to_sym, val[3]
  231. }
  232. cmd_brace_block: tLBRACE_ARG
  233. {
  234. self.env.extend(:dynamic)
  235. result = self.lexer.lineno
  236. }
  237. opt_block_param
  238. {
  239. result = nil # self.env.dynamic.keys
  240. }
  241. compstmt tRCURLY
  242. {
  243. result = new_iter nil, val[2], val[4]
  244. result.line = val[1]
  245. self.env.unextend
  246. }
  247. command: operation command_args =tLOWEST
  248. {
  249. result = new_call nil, val[0].to_sym, val[1]
  250. }
  251. | operation command_args cmd_brace_block
  252. {
  253. result = new_call nil, val[0].to_sym, val[1]
  254. if val[2] then
  255. block_dup_check result, val[2]
  256. result, operation = val[2], result
  257. result.insert 1, operation
  258. end
  259. }
  260. | primary_value tDOT operation2 command_args =tLOWEST
  261. {
  262. result = new_call val[0], val[2].to_sym, val[3]
  263. }
  264. | primary_value tDOT operation2 command_args cmd_brace_block
  265. {
  266. recv, _, msg, args, block = val
  267. call = new_call recv, msg.to_sym, args
  268. block_dup_check call, block
  269. block.insert 1, call
  270. result = block
  271. }
  272. | primary_value tCOLON2 operation2 command_args =tLOWEST
  273. {
  274. result = new_call val[0], val[2].to_sym, val[3]
  275. }
  276. | primary_value tCOLON2 operation2 command_args cmd_brace_block
  277. {
  278. recv, _, msg, args, block = val
  279. call = new_call recv, msg.to_sym, args
  280. block_dup_check call, block
  281. block.insert 1, call
  282. result = block
  283. }
  284. | kSUPER command_args
  285. {
  286. result = new_super val[1]
  287. }
  288. | kYIELD command_args
  289. {
  290. result = new_yield val[1]
  291. }
  292. | kRETURN call_args
  293. {
  294. line = val[0].last
  295. result = s(:return, ret_args(val[1])).line(line)
  296. }
  297. | kBREAK call_args
  298. {
  299. line = val[0].last
  300. result = s(:break, ret_args(val[1])).line(line)
  301. }
  302. | kNEXT call_args
  303. {
  304. line = val[0].last
  305. result = s(:next, ret_args(val[1])).line(line)
  306. }
  307. mlhs: mlhs_basic
  308. | tLPAREN mlhs_inner rparen
  309. {
  310. result = val[1]
  311. }
  312. mlhs_inner: mlhs_basic
  313. | tLPAREN mlhs_inner rparen
  314. {
  315. result = s(:masgn, s(:array, val[1]))
  316. }
  317. mlhs_basic: mlhs_head
  318. {
  319. result = s(:masgn, val[0])
  320. }
  321. | mlhs_head mlhs_item
  322. {
  323. result = s(:masgn, val[0] << val[1].compact)
  324. }
  325. | mlhs_head tSTAR mlhs_node
  326. {
  327. result = s(:masgn, val[0] << s(:splat, val[2]))
  328. }
  329. | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
  330. {
  331. ary = list_append val[0], s(:splat, val[2])
  332. ary.concat val[4][1..-1]
  333. result = s(:masgn, ary)
  334. }
  335. | mlhs_head tSTAR
  336. {
  337. result = s(:masgn, val[0] << s(:splat))
  338. }
  339. | mlhs_head tSTAR tCOMMA mlhs_post
  340. {
  341. ary = list_append val[0], s(:splat)
  342. ary.concat val[3][1..-1]
  343. result = s(:masgn, ary)
  344. }
  345. | tSTAR mlhs_node
  346. {
  347. result = s(:masgn, s(:array, s(:splat, val[1])))
  348. }
  349. | tSTAR mlhs_node tCOMMA mlhs_post
  350. {
  351. ary = s(:array, s(:splat, val[1]))
  352. ary.concat val[3][1..-1]
  353. result = s(:masgn, ary)
  354. }
  355. | tSTAR
  356. {
  357. result = s(:masgn, s(:array, s(:splat)))
  358. }
  359. | tSTAR tCOMMA mlhs_post
  360. {
  361. ary = s(:array, s(:splat))
  362. ary.concat val[2][1..-1]
  363. result = s(:masgn, ary)
  364. }
  365. mlhs_item: mlhs_node
  366. | tLPAREN mlhs_inner rparen
  367. {
  368. result = val[1]
  369. }
  370. mlhs_head: mlhs_item tCOMMA
  371. {
  372. result = s(:array, val[0])
  373. }
  374. | mlhs_head mlhs_item tCOMMA
  375. {
  376. result = val[0] << val[1].compact
  377. }
  378. mlhs_post: mlhs_item
  379. {
  380. result = s(:array, val[0])
  381. }
  382. | mlhs_post tCOMMA mlhs_item
  383. {
  384. result = list_append val[0], val[2]
  385. }
  386. mlhs_node: user_variable
  387. {
  388. result = self.assignable val[0]
  389. }
  390. | keyword_variable
  391. {
  392. result = self.assignable val[0]
  393. }
  394. | primary_value tLBRACK2 opt_call_args rbracket
  395. {
  396. result = self.aryset val[0], val[2]
  397. }
  398. | primary_value tDOT tIDENTIFIER
  399. {
  400. result = s(:attrasgn, val[0], :"#{val[2]}=")
  401. }
  402. | primary_value tCOLON2 tIDENTIFIER
  403. {
  404. result = s(:attrasgn, val[0], :"#{val[2]}=")
  405. }
  406. | primary_value tDOT tCONSTANT
  407. {
  408. result = s(:attrasgn, val[0], :"#{val[2]}=")
  409. }
  410. | primary_value tCOLON2 tCONSTANT
  411. {
  412. if (self.in_def || self.in_single > 0) then
  413. yyerror "dynamic constant assignment"
  414. end
  415. result = s(:const, s(:colon2, val[0], val[2].to_sym), nil)
  416. }
  417. | tCOLON3 tCONSTANT
  418. {
  419. if (self.in_def || self.in_single > 0) then
  420. yyerror "dynamic constant assignment"
  421. end
  422. result = s(:const, nil, s(:colon3, val[1].to_sym))
  423. }
  424. | backref
  425. {
  426. self.backref_assign_error val[0]
  427. }
  428. lhs: user_variable
  429. {
  430. result = self.assignable val[0]
  431. }
  432. | keyword_variable
  433. {
  434. result = self.assignable val[0]
  435. }
  436. | primary_value tLBRACK2 opt_call_args rbracket
  437. {
  438. result = self.aryset val[0], val[2]
  439. }
  440. | primary_value tDOT tIDENTIFIER
  441. {
  442. result = s(:attrasgn, val[0], :"#{val[2]}=")
  443. }
  444. | primary_value tCOLON2 tIDENTIFIER
  445. {
  446. result = s(:attrasgn, val[0], :"#{val[2]}=")
  447. }
  448. | primary_value tDOT tCONSTANT
  449. {
  450. result = s(:attrasgn, val[0], :"#{val[2]}=")
  451. }
  452. | primary_value tCOLON2 tCONSTANT
  453. {
  454. if (self.in_def || self.in_single > 0) then
  455. yyerror "dynamic constant assignment"
  456. end
  457. result = s(:const, s(:colon2, val[0], val[2].to_sym))
  458. }
  459. | tCOLON3 tCONSTANT
  460. {
  461. if (self.in_def || self.in_single > 0) then
  462. yyerror "dynamic constant assignment"
  463. end
  464. result = s(:const, s(:colon3, val[1].to_sym))
  465. }
  466. | backref
  467. {
  468. self.backref_assign_error val[0]
  469. }
  470. cname: tIDENTIFIER
  471. {
  472. yyerror "class/module name must be CONSTANT"
  473. }
  474. | tCONSTANT
  475. cpath: tCOLON3 cname
  476. {
  477. result = s(:colon3, val[1].to_sym)
  478. }
  479. | cname
  480. {
  481. result = val[0].to_sym
  482. }
  483. | primary_value tCOLON2 cname
  484. {
  485. result = s(:colon2, val[0], val[2].to_sym)
  486. }
  487. fname: tIDENTIFIER | tCONSTANT | tFID
  488. | op
  489. {
  490. lexer.lex_state = :expr_end
  491. result = val[0]
  492. }
  493. | reswords
  494. {
  495. lexer.lex_state = :expr_end
  496. result = val[0]
  497. }
  498. fsym: fname | symbol
  499. fitem: fsym { result = s(:lit, val[0].to_sym) }
  500. | dsym
  501. undef_list: fitem
  502. {
  503. result = new_undef val[0]
  504. }
  505. |
  506. undef_list tCOMMA
  507. {
  508. lexer.lex_state = :expr_fname
  509. }
  510. fitem
  511. {
  512. result = new_undef val[0], val[3]
  513. }
  514. op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
  515. | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
  516. | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
  517. | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
  518. | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
  519. reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
  520. | kALIAS | kAND | kBEGIN | kBREAK | kCASE
  521. | kCLASS | kDEF | kDEFINED | kDO | kELSE
  522. | kELSIF | kEND | kENSURE | kFALSE | kFOR
  523. | kIN | kMODULE | kNEXT | kNIL | kNOT
  524. | kOR | kREDO | kRESCUE | kRETRY | kRETURN
  525. | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
  526. | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
  527. | kUNTIL
  528. arg: lhs tEQL arg
  529. {
  530. result = self.node_assign val[0], val[2]
  531. }
  532. | lhs tEQL arg kRESCUE_MOD arg
  533. {
  534. result = self.node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
  535. }
  536. | var_lhs tOP_ASGN arg
  537. {
  538. result = new_op_asgn val
  539. }
  540. | var_lhs tOP_ASGN arg kRESCUE_MOD arg
  541. {
  542. result = new_op_asgn val
  543. result = s(:rescue, result, new_resbody(s(:array), val[4]))
  544. }
  545. | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg
  546. {
  547. val[2][0] = :arglist if val[2]
  548. result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
  549. }
  550. | primary_value tDOT tIDENTIFIER tOP_ASGN arg
  551. {
  552. result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
  553. }
  554. | primary_value tDOT tCONSTANT tOP_ASGN arg
  555. {
  556. result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
  557. }
  558. | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
  559. {
  560. result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
  561. }
  562. | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
  563. {
  564. yyerror "constant re-assignment"
  565. }
  566. | tCOLON3 tCONSTANT tOP_ASGN arg
  567. {
  568. yyerror "constant re-assignment"
  569. }
  570. | backref tOP_ASGN arg
  571. {
  572. self.backref_assign_error val[0]
  573. }
  574. | arg tDOT2 arg
  575. {
  576. v1, v2 = val[0], val[2]
  577. if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then
  578. result = s(:lit, (v1.last)..(v2.last))
  579. else
  580. result = s(:dot2, v1, v2)
  581. end
  582. }
  583. | arg tDOT3 arg
  584. {
  585. v1, v2 = val[0], val[2]
  586. if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then
  587. result = s(:lit, (v1.last)...(v2.last))
  588. else
  589. result = s(:dot3, v1, v2)
  590. end
  591. }
  592. | arg tPLUS arg
  593. {
  594. result = new_call val[0], :+, argl(val[2])
  595. }
  596. | arg tMINUS arg
  597. {
  598. result = new_call val[0], :-, argl(val[2])
  599. }
  600. | arg tSTAR2 arg
  601. {
  602. result = new_call val[0], :*, argl(val[2])
  603. }
  604. | arg tDIVIDE arg
  605. {
  606. result = new_call val[0], :"/", argl(val[2])
  607. }
  608. | arg tPERCENT arg
  609. {
  610. result = new_call val[0], :"%", argl(val[2])
  611. }
  612. | arg tPOW arg
  613. {
  614. result = new_call val[0], :**, argl(val[2])
  615. }
  616. | tUMINUS_NUM tINTEGER tPOW arg
  617. {
  618. result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
  619. }
  620. | tUMINUS_NUM tFLOAT tPOW arg
  621. {
  622. result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
  623. }
  624. | tUPLUS arg
  625. {
  626. result = new_call val[1], :"+@"
  627. }
  628. | tUMINUS arg
  629. {
  630. result = new_call val[1], :"-@"
  631. }
  632. | arg tPIPE arg
  633. {
  634. result = new_call val[0], :"|", argl(val[2])
  635. }
  636. | arg tCARET arg
  637. {
  638. result = new_call val[0], :"^", argl(val[2])
  639. }
  640. | arg tAMPER2 arg
  641. {
  642. result = new_call val[0], :"&", argl(val[2])
  643. }
  644. | arg tCMP arg
  645. {
  646. result = new_call val[0], :"<=>", argl(val[2])
  647. }
  648. | arg tGT arg
  649. {
  650. result = new_call val[0], :">", argl(val[2])
  651. }
  652. | arg tGEQ arg
  653. {
  654. result = new_call val[0], :">=", argl(val[2])
  655. }
  656. | arg tLT arg
  657. {
  658. result = new_call val[0], :"<", argl(val[2])
  659. }
  660. | arg tLEQ arg
  661. {
  662. result = new_call val[0], :"<=", argl(val[2])
  663. }
  664. | arg tEQ arg
  665. {
  666. result = new_call val[0], :"==", argl(val[2])
  667. }
  668. | arg tEQQ arg
  669. {
  670. result = new_call val[0], :"===", argl(val[2])
  671. }
  672. | arg tNEQ arg
  673. {
  674. result = new_call val[0], :"!=", argl(val[2])
  675. }
  676. | arg tMATCH arg
  677. {
  678. result = self.get_match_node val[0], val[2]
  679. }
  680. | arg tNMATCH arg
  681. {
  682. result = s(:not, self.get_match_node(val[0], val[2]))
  683. }
  684. | tBANG arg
  685. {
  686. result = new_call val[1], :"!"
  687. }
  688. | tTILDE arg
  689. {
  690. val[2] = value_expr val[2]
  691. result = new_call val[1], :"~"
  692. }
  693. | arg tLSHFT arg
  694. {
  695. val[0] = value_expr val[0]
  696. val[2] = value_expr val[2]
  697. result = new_call val[0], :"\<\<", argl(val[2])
  698. }
  699. | arg tRSHFT arg
  700. {
  701. val[0] = value_expr val[0]
  702. val[2] = value_expr val[2]
  703. result = new_call val[0], :">>", argl(val[2])
  704. }
  705. | arg tANDOP arg
  706. {
  707. result = logop(:and, val[0], val[2])
  708. }
  709. | arg tOROP arg
  710. {
  711. result = logop(:or, val[0], val[2])
  712. }
  713. | kDEFINED opt_nl arg
  714. {
  715. result = s(:defined, val[2])
  716. }
  717. | arg tEH arg opt_nl tCOLON arg
  718. {
  719. result = s(:if, val[0], val[2], val[5])
  720. }
  721. | primary
  722. arg_value: arg
  723. {
  724. result = value_expr(val[0])
  725. }
  726. aref_args: none
  727. | args trailer
  728. {
  729. result = val[0]
  730. }
  731. | args tCOMMA assocs trailer
  732. {
  733. result = val[0] << s(:hash, *val[2].values)
  734. }
  735. | assocs trailer
  736. {
  737. result = s(:array, s(:hash, *val[0].values))
  738. }
  739. paren_args: tLPAREN2 opt_call_args rparen
  740. {
  741. result = val[1]
  742. }
  743. opt_paren_args: none
  744. | paren_args
  745. opt_call_args: none
  746. {
  747. result = val[0]
  748. }
  749. | call_args
  750. {
  751. result = val[0]
  752. }
  753. | args tCOMMA
  754. {
  755. result = val[0]
  756. }
  757. | args tCOMMA assocs tCOMMA
  758. {
  759. result = val[0] << s(:hash, *val[2][1..-1]) # TODO: self.args
  760. }
  761. | assocs tCOMMA
  762. {
  763. result = s(:hash, *val[0].values)
  764. }
  765. call_args: command
  766. {
  767. warning "parenthesize argument(s) for future version"
  768. result = s(:array, val[0])
  769. }
  770. | args opt_block_arg
  771. {
  772. result = self.arg_blk_pass val[0], val[1]
  773. }
  774. | assocs opt_block_arg
  775. {
  776. result = s(:array, s(:hash, *val[0].values))
  777. result = self.arg_blk_pass result, val[1]
  778. }
  779. | args tCOMMA assocs opt_block_arg
  780. {
  781. result = val[0] << s(:hash, *val[2].values)
  782. result = self.arg_blk_pass result, val[3]
  783. }
  784. | block_arg
  785. command_args: {
  786. result = lexer.cmdarg.stack.dup # TODO: smell?
  787. lexer.cmdarg.push true
  788. }
  789. call_args
  790. {
  791. lexer.cmdarg.stack.replace val[0]
  792. result = val[1]
  793. }
  794. block_arg: tAMPER arg_value
  795. {
  796. result = s(:block_pass, val[1])
  797. }
  798. opt_block_arg: tCOMMA block_arg
  799. {
  800. result = val[1]
  801. }
  802. | none
  803. args: arg_value
  804. {
  805. result = s(:array, val[0])
  806. }
  807. | tSTAR arg_value
  808. {
  809. result = s(:array, s(:splat, val[1]))
  810. }
  811. | args tCOMMA arg_value
  812. {
  813. result = self.list_append val[0], val[2]
  814. }
  815. | args tCOMMA tSTAR arg_value
  816. {
  817. result = self.list_append val[0], s(:splat, val[3])
  818. }
  819. mrhs: args tCOMMA arg_value
  820. {
  821. result = val[0] << val[2]
  822. }
  823. | args tCOMMA tSTAR arg_value
  824. {
  825. result = self.arg_concat val[0], val[3]
  826. }
  827. | tSTAR arg_value
  828. {
  829. result = s(:splat, val[1])
  830. }
  831. primary: literal
  832. | strings
  833. | xstring
  834. | regexp
  835. | words
  836. | qwords
  837. | var_ref
  838. | backref
  839. | tFID
  840. {
  841. result = new_call nil, val[0].to_sym
  842. }
  843. | kBEGIN
  844. {
  845. result = self.lexer.lineno
  846. }
  847. bodystmt kEND
  848. {
  849. unless val[2] then
  850. result = s(:nil)
  851. else
  852. result = s(:begin, val[2])
  853. end
  854. result.line = val[1]
  855. }
  856. | tLPAREN_ARG expr
  857. {
  858. lexer.lex_state = :expr_endarg
  859. }
  860. rparen
  861. {
  862. warning "(...) interpreted as grouped expression"
  863. result = val[1]
  864. }
  865. | tLPAREN compstmt tRPAREN
  866. {
  867. result = val[1] || s(:nil)
  868. result.paren = true
  869. }
  870. | primary_value tCOLON2 tCONSTANT
  871. {
  872. result = s(:colon2, val[0], val[2].to_sym)
  873. }
  874. | tCOLON3 tCONSTANT
  875. {
  876. result = s(:colon3, val[1].to_sym)
  877. }
  878. | tLBRACK aref_args tRBRACK
  879. {
  880. result = val[1] || s(:array)
  881. }
  882. | tLBRACE assoc_list tRCURLY
  883. {
  884. result = s(:hash, *val[1].values)
  885. }
  886. | kRETURN
  887. {
  888. result = s(:return)
  889. }
  890. | kYIELD tLPAREN2 call_args rparen
  891. {
  892. result = new_yield val[2]
  893. }
  894. | kYIELD tLPAREN2 rparen
  895. {
  896. result = new_yield
  897. }
  898. | kYIELD
  899. {
  900. result = new_yield
  901. }
  902. | kDEFINED opt_nl tLPAREN2 expr rparen
  903. {
  904. result = s(:defined, val[3])
  905. }
  906. | kNOT tLPAREN2 expr rparen
  907. {
  908. result = s(:call, val[2], :"!")
  909. }
  910. | kNOT tLPAREN2 rparen
  911. {
  912. raise "no3\non#{val.inspect}"
  913. }
  914. | operation brace_block
  915. {
  916. oper, iter = val[0], val[1]
  917. call = new_call nil, oper.to_sym
  918. iter.insert 1, call
  919. result = iter
  920. call.line = iter.line
  921. }
  922. | method_call
  923. | method_call brace_block
  924. {
  925. call, iter = val[0], val[1]
  926. block_dup_check call, iter
  927. iter.insert 1, call # FIX
  928. result = iter
  929. }
  930. | tLAMBDA lambda
  931. {
  932. result = val[1] # TODO: fix lineno
  933. }
  934. | kIF expr_value then compstmt if_tail kEND
  935. {
  936. result = new_if val[1], val[3], val[4]
  937. }
  938. | kUNLESS expr_value then compstmt opt_else kEND
  939. {
  940. result = new_if val[1], val[4], val[3]
  941. }
  942. | kWHILE
  943. {
  944. lexer.cond.push true
  945. }
  946. expr_value do
  947. {
  948. lexer.cond.pop
  949. }
  950. compstmt kEND
  951. {
  952. result = new_while val[5], val[2], true
  953. }
  954. | kUNTIL
  955. {
  956. lexer.cond.push true
  957. }
  958. expr_value do
  959. {
  960. lexer.cond.pop
  961. }
  962. compstmt kEND
  963. {
  964. result = new_until val[5], val[2], true
  965. }
  966. | kCASE expr_value opt_terms case_body kEND
  967. {
  968. (_, line), expr, _, body, _ = val
  969. result = new_case expr, body, line
  970. }
  971. | kCASE opt_terms case_body kEND
  972. {
  973. (_, line), _, body, _ = val
  974. result = new_case nil, body, line
  975. }
  976. | kFOR for_var kIN
  977. {
  978. lexer.cond.push true
  979. }
  980. expr_value do
  981. {
  982. lexer.cond.pop
  983. }
  984. compstmt kEND
  985. {
  986. result = new_for val[4], val[1], val[7]
  987. }
  988. | kCLASS
  989. {
  990. result = self.lexer.lineno
  991. }
  992. cpath superclass
  993. {
  994. self.comments.push self.lexer.comments
  995. if (self.in_def || self.in_single > 0) then
  996. yyerror "class definition in method body"
  997. end
  998. self.env.extend
  999. }
  1000. bodystmt kEND
  1001. {
  1002. result = new_class val
  1003. self.env.unextend
  1004. self.lexer.comments # we don't care about comments in the body
  1005. }
  1006. | kCLASS tLSHFT
  1007. {
  1008. result = self.lexer.lineno
  1009. }
  1010. expr
  1011. {
  1012. result = self.in_def
  1013. self.in_def = false
  1014. }
  1015. term
  1016. {
  1017. result = self.in_single
  1018. self.in_single = 0
  1019. self.env.extend
  1020. }
  1021. bodystmt kEND
  1022. {
  1023. result = new_sclass val
  1024. self.env.unextend
  1025. self.lexer.comments # we don't care about comments in the body
  1026. }
  1027. | kMODULE
  1028. {
  1029. result = self.lexer.lineno
  1030. }
  1031. cpath
  1032. {
  1033. self.comments.push self.lexer.comments
  1034. yyerror "module definition in method body" if
  1035. self.in_def or self.in_single > 0
  1036. self.env.extend
  1037. }
  1038. bodystmt kEND
  1039. {
  1040. result = new_module val
  1041. self.env.unextend
  1042. self.lexer.comments # we don't care about comments in the body
  1043. }
  1044. | kDEF fname
  1045. {
  1046. result = self.in_def
  1047. self.comments.push self.lexer.comments
  1048. self.in_def = true
  1049. self.env.extend
  1050. }
  1051. f_arglist bodystmt kEND
  1052. {
  1053. in_def = val[2]
  1054. result = new_defn val
  1055. self.env.unextend
  1056. self.in_def = in_def
  1057. self.lexer.comments # we don't care about comments in the body
  1058. }
  1059. | kDEF singleton dot_or_colon
  1060. {
  1061. self.comments.push self.lexer.comments
  1062. lexer.lex_state = :expr_fname
  1063. }
  1064. fname
  1065. {
  1066. self.in_single += 1
  1067. self.env.extend
  1068. lexer.lex_state = :expr_end # force for args
  1069. result = lexer.lineno
  1070. }
  1071. f_arglist bodystmt kEND
  1072. {
  1073. result = new_defs val
  1074. result[3].line val[5]
  1075. self.env.unextend
  1076. self.in_single -= 1
  1077. self.lexer.comments # we don't care about comments in the body
  1078. }
  1079. | kBREAK
  1080. {
  1081. result = s(:break)
  1082. }
  1083. | kNEXT
  1084. {
  1085. result = s(:next)
  1086. }
  1087. | kREDO
  1088. {
  1089. result = s(:redo)
  1090. }
  1091. | kRETRY
  1092. {
  1093. result = s(:retry)
  1094. }
  1095. primary_value: primary
  1096. {
  1097. result = value_expr(val[0])
  1098. }
  1099. # These are really stupid
  1100. k_begin: kBEGIN
  1101. k_if: kIF
  1102. k_unless: kUNLESS
  1103. k_while: kWHILE
  1104. k_until: kUNTIL
  1105. k_case: kCASE
  1106. k_for: kFOR
  1107. k_class: kCLASS
  1108. k_module: kMODULE
  1109. k_def: kDEF
  1110. k_end: kEND
  1111. then: term
  1112. | kTHEN
  1113. | term kTHEN
  1114. do: term
  1115. | kDO_COND
  1116. if_tail: opt_else
  1117. | kELSIF expr_value then compstmt if_tail
  1118. {
  1119. result = s(:if, val[1], val[3], val[4])
  1120. }
  1121. opt_else: none
  1122. | kELSE compstmt
  1123. {
  1124. result = val[1]
  1125. }
  1126. for_var: lhs
  1127. | mlhs
  1128. {
  1129. val[0].delete_at 1 if val[0][1].nil? # HACK
  1130. }
  1131. f_marg: f_norm_arg
  1132. | tLPAREN f_margs rparen
  1133. {
  1134. result = val[1]
  1135. }
  1136. f_marg_list: f_marg
  1137. {
  1138. result = s(:array, val[0])
  1139. }
  1140. | f_marg_list tCOMMA f_marg
  1141. {
  1142. result = list_append val[0], val[2]
  1143. }
  1144. f_margs: f_marg_list
  1145. {
  1146. args, = val
  1147. result = block_var args
  1148. }
  1149. | f_marg_list tCOMMA tSTAR f_norm_arg
  1150. {
  1151. args, _, _, splat = val
  1152. result = block_var args, "*#{splat}".to_sym
  1153. }
  1154. | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
  1155. {
  1156. args, _, _, splat, _, args2 = val
  1157. result = block_var args, "*#{splat}".to_sym, args2
  1158. }
  1159. | f_marg_list tCOMMA tSTAR
  1160. {
  1161. args, _, _ = val
  1162. result = block_var args, :*
  1163. }
  1164. | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
  1165. {
  1166. args, _, _, _, args2 = val
  1167. result = block_var args, :*, args2
  1168. }
  1169. | tSTAR f_norm_arg
  1170. {
  1171. _, splat = val
  1172. result = block_var :"*#{splat}"
  1173. }
  1174. | tSTAR f_norm_arg tCOMMA f_marg_list
  1175. {
  1176. _, splat, _, args = val
  1177. result = block_var :"*#{splat}", args
  1178. }
  1179. | tSTAR
  1180. {
  1181. result = block_var :*
  1182. }
  1183. | tSTAR tCOMMA f_marg_list
  1184. {
  1185. _, _, args = val
  1186. result = block_var :*, args
  1187. }
  1188. block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
  1189. {
  1190. result = args val
  1191. }
  1192. | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
  1193. {
  1194. result = args val
  1195. }
  1196. | f_arg tCOMMA f_block_optarg opt_f_block_arg
  1197. {
  1198. result = args val
  1199. }
  1200. | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg
  1201. {
  1202. result = args val
  1203. }
  1204. | f_arg tCOMMA f_rest_arg opt_f_block_arg
  1205. {
  1206. result = args val
  1207. }
  1208. | f_arg tCOMMA
  1209. {
  1210. result = args val
  1211. }
  1212. | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
  1213. {
  1214. result = args val
  1215. }
  1216. | f_arg opt_f_block_arg
  1217. {
  1218. result = args val
  1219. }
  1220. | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
  1221. {
  1222. result = args val
  1223. }
  1224. | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
  1225. {
  1226. result = args val
  1227. }
  1228. | f_block_optarg opt_f_block_arg
  1229. {
  1230. result = args val
  1231. }
  1232. | f_block_optarg tCOMMA f_arg opt_f_block_arg
  1233. {
  1234. result = args val
  1235. }
  1236. | f_rest_arg opt_f_block_arg
  1237. {
  1238. result = args val
  1239. }
  1240. | f_rest_arg tCOMMA f_arg opt_f_block_arg
  1241. {
  1242. result = args val
  1243. }
  1244. | f_block_arg
  1245. {
  1246. result = args val
  1247. }
  1248. opt_block_param: none
  1249. | block_param_def
  1250. block_param_def: tPIPE opt_bv_decl tPIPE
  1251. {
  1252. result = args val
  1253. result = 0 if result == s(:args)
  1254. }
  1255. | tOROP
  1256. {
  1257. result = 0
  1258. self.lexer.command_start = true
  1259. }
  1260. | tPIPE block_param opt_bv_decl tPIPE
  1261. {
  1262. result = args val
  1263. }
  1264. opt_bv_decl: none
  1265. | tSEMI bv_decls
  1266. {
  1267. result = val[1]
  1268. }
  1269. bv_decls: bvar
  1270. {
  1271. result = args val
  1272. }
  1273. | bv_decls tCOMMA bvar
  1274. {
  1275. result = args val
  1276. }
  1277. bvar: tIDENTIFIER
  1278. {
  1279. result = s(:shadow, val[0].to_sym)
  1280. }
  1281. | f_bad_arg
  1282. lambda: {
  1283. # TODO: dyna_push ? hrm
  1284. result = lexer.lpar_beg
  1285. lexer.paren_nest += 1
  1286. lexer.lpar_beg = lexer.paren_nest
  1287. }
  1288. f_larglist lambda_body
  1289. {
  1290. lpar, args, body = val
  1291. lexer.lpar_beg = lpar
  1292. args = 0 if args == s(:args)
  1293. call = new_call nil, :lambda
  1294. result = new_iter call, args, body
  1295. }
  1296. f_larglist: tLPAREN2 f_args opt_bv_decl rparen
  1297. {
  1298. result = args val
  1299. }
  1300. | f_args
  1301. {
  1302. result = val[0]
  1303. }
  1304. lambda_body: tLAMBEG compstmt tRCURLY
  1305. {
  1306. result = val[1]
  1307. }
  1308. | kDO_LAMBDA compstmt kEND
  1309. {
  1310. result = val[1]
  1311. }
  1312. do_block: kDO_BLOCK
  1313. {
  1314. self.env.extend :dynamic
  1315. result = self.lexer.lineno
  1316. }
  1317. opt_block_param
  1318. {
  1319. result = nil # self.env.dynamic.keys
  1320. }
  1321. compstmt kEND
  1322. {
  1323. args = val[2]
  1324. body = val[4]
  1325. result = new_iter nil, args, body
  1326. result.line = val[1]
  1327. self.env.unextend
  1328. }
  1329. block_call: command do_block
  1330. {
  1331. # TODO:
  1332. # if (nd_type($1) == NODE_YIELD) {
  1333. # compile_error(PARSER_ARG "block given to yield");
  1334. syntax_error "Both block arg and actual block given." if
  1335. val[0].block_pass?
  1336. val = invert_block_call val if inverted? val
  1337. result = val[1]
  1338. result.insert 1, val[0]
  1339. }
  1340. | block_call tDOT operation2 opt_paren_args
  1341. {
  1342. result = new_call val[0], val[2].to_sym, val[3]
  1343. }
  1344. | block_call tCOLON2 operation2 opt_paren_args
  1345. {
  1346. result = new_call val[0], val[2].to_sym, val[3]
  1347. }
  1348. method_call: operation
  1349. {
  1350. result = self.lexer.lineno
  1351. }
  1352. paren_args
  1353. {
  1354. result = new_call nil, val[0].to_sym, val[2]
  1355. }
  1356. | primary_value tDOT operation2 opt_paren_args
  1357. {
  1358. result = new_call val[0], val[2].to_sym, val[3]
  1359. }
  1360. | primary_value tCOLON2 operation2 paren_args
  1361. {
  1362. result = new_call val[0], val[2].to_sym, val[3]
  1363. }
  1364. | primary_value tCOLON2 operation3
  1365. {
  1366. result = new_call val[0], val[2].to_sym
  1367. }
  1368. | primary_value tDOT paren_args
  1369. {
  1370. result = new_call val[0], :call, val[2]
  1371. }
  1372. | primary_value tCOLON2 paren_args
  1373. {
  1374. result = new_call val[0], :call, val[2]
  1375. }
  1376. | kSUPER paren_args
  1377. {
  1378. result = new_super val[1]
  1379. }
  1380. | kSUPER
  1381. {
  1382. result = s(:zsuper)
  1383. }
  1384. | primary_value tLBRACK2 opt_call_args rbracket
  1385. {
  1386. result = new_aref val
  1387. }
  1388. brace_block: tLCURLY
  1389. {
  1390. self.env.extend :dynamic
  1391. result = self.lexer.lineno
  1392. }
  1393. opt_block_param
  1394. {
  1395. result = nil # self.env.dynamic.keys
  1396. }
  1397. compstmt tRCURLY
  1398. {
  1399. _, line, args, _, body, _ = val
  1400. result = new_iter nil, args, body
  1401. result.line = line
  1402. self.env.unextend
  1403. }
  1404. | kDO
  1405. {
  1406. self.env.extend :dynamic
  1407. result = self.lexer.lineno
  1408. }
  1409. opt_block_param
  1410. {
  1411. result = nil # self.env.dynamic.keys
  1412. }
  1413. compstmt kEND
  1414. {
  1415. _, line, args, _, body, _ = val
  1416. result = new_iter nil, args, body
  1417. result.line = line
  1418. self.env.unextend
  1419. }
  1420. case_body: kWHEN
  1421. {
  1422. result = self.lexer.lineno
  1423. }
  1424. args then compstmt cases
  1425. {
  1426. result = new_when(val[2], val[4])
  1427. result.line = val[1]
  1428. result << val[5] if val[5]
  1429. }
  1430. cases: opt_else | case_body
  1431. opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
  1432. {
  1433. _, klasses, var, _, body, rest = val
  1434. klasses ||= s(:array)
  1435. klasses << node_assign(var, s(:gvar, :"$!")) if var
  1436. result = new_resbody(klasses, body)
  1437. result << rest if rest # UGH, rewritten above
  1438. }
  1439. |
  1440. {
  1441. result = nil
  1442. }
  1443. exc_list: arg_value
  1444. {
  1445. result = s(:array, val[0])
  1446. }
  1447. | mrhs
  1448. | none
  1449. exc_var: tASSOC lhs
  1450. {
  1451. result = val[1]
  1452. }
  1453. | none
  1454. opt_ensure: kENSURE compstmt
  1455. {
  1456. _, body = val
  1457. result = body || s(:nil)
  1458. }
  1459. | none
  1460. literal: numeric { result = s(:lit, val[0]) }
  1461. | symbol { result = s(:lit, val[0]) }
  1462. | dsym
  1463. strings: string
  1464. {
  1465. val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr
  1466. result = val[0]
  1467. }
  1468. string: string1
  1469. | string string1
  1470. {
  1471. result = self.literal_concat val[0], val[1]
  1472. }
  1473. string1: tSTRING_BEG string_contents tSTRING_END
  1474. {
  1475. result = val[1]
  1476. }
  1477. | tSTRING
  1478. {
  1479. result = new_string val
  1480. }
  1481. xstring: tXSTRING_BEG xstring_contents tSTRING_END
  1482. {
  1483. result = new_xstring val[1]
  1484. }
  1485. regexp: tREGEXP_BEG regexp_contents tREGEXP_END
  1486. {
  1487. result = new_regexp val
  1488. }
  1489. words: tWORDS_BEG tSPACE tSTRING_END
  1490. {
  1491. result = s(:array)
  1492. }
  1493. | tWORDS_BEG word_list tSTRING_END
  1494. {
  1495. result = val[1]
  1496. }
  1497. word_list: none
  1498. {
  1499. result = s(:array)
  1500. }
  1501. | word_list word tSPACE
  1502. {
  1503. word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1]
  1504. result = val[0] << word
  1505. }
  1506. word: string_content
  1507. | word string_content
  1508. {
  1509. result = self.literal_concat val[0], val[1]
  1510. }
  1511. qwords: tQWORDS_BEG tSPACE tSTRING_END
  1512. {
  1513. result = s(:array)
  1514. }
  1515. | tQWORDS_BEG qword_list tSTRING_END
  1516. {
  1517. result = val[1]
  1518. }
  1519. qword_list: none
  1520. {
  1521. result = s(:array)
  1522. }
  1523. | qword_list tSTRING_CONTENT tSPACE
  1524. {
  1525. result = val[0] << s(:str, val[1])
  1526. }
  1527. string_contents: none
  1528. {
  1529. result = s(:str, "")
  1530. }
  1531. | string_contents string_content
  1532. {
  1533. result = literal_concat(val[0], val[1])
  1534. }
  1535. xstring_contents: none
  1536. {
  1537. result = nil
  1538. }
  1539. | xstring_contents string_content
  1540. {
  1541. result = literal_concat(val[0], val[1])
  1542. }
  1543. regexp_contents: none
  1544. {
  1545. result = nil
  1546. }
  1547. | regexp_contents string_content
  1548. {
  1549. result = literal_concat(val[0], val[1])
  1550. }
  1551. string_content: tSTRING_CONTENT
  1552. {
  1553. result = new_string val
  1554. }
  1555. | tSTRING_DVAR
  1556. {
  1557. result = lexer.lex_strterm
  1558. lexer.lex_strterm = nil
  1559. lexer.lex_state = :expr_beg
  1560. }
  1561. string_dvar
  1562. {
  1563. lexer.lex_strterm = val[1]
  1564. result = s(:evstr, val[2])
  1565. }
  1566. | tSTRING_DBEG
  1567. {
  1568. result = [lexer.lex_strterm,
  1569. lexer.brace_nest,
  1570. lexer.string_nest, # TODO: remove
  1571. lexer.cond.store,
  1572. lexer.cmdarg.store]
  1573. lexer.lex_strterm = nil
  1574. lexer.brace_nest = 0
  1575. lexer.string_nest = 0
  1576. lexer.lex_state = :expr_beg
  1577. }
  1578. compstmt tRCURLY
  1579. {
  1580. _, memo, stmt, _ = val
  1581. lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg = memo
  1582. lexer.lex_strterm = lex_strterm
  1583. lexer.brace_nest = brace_nest
  1584. lexer.string_nest = string_nest
  1585. lexer.cond.restore oldcond
  1586. lexer.cmdarg.restore oldcmdarg
  1587. case stmt
  1588. when Sexp then
  1589. case stmt[0]
  1590. when :str, :dstr, :evstr then
  1591. result = stmt
  1592. else
  1593. result = s(:evstr, stmt)
  1594. end
  1595. when nil then
  1596. result = s(:evstr)
  1597. else
  1598. raise "unknown string body: #{stmt.inspect}"
  1599. end
  1600. }
  1601. string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) }
  1602. | tIVAR { result = s(:ivar, val[0].to_sym) }
  1603. | tCVAR { result = s(:cvar, val[0].to_sym) }
  1604. | backref
  1605. symbol: tSYMBEG sym
  1606. {
  1607. lexer.lex_state = :expr_end
  1608. result = val[1].to_sym
  1609. }
  1610. | tSYMBOL
  1611. {
  1612. result = val[0].to_sym
  1613. }
  1614. sym: fname | tIVAR | tGVAR | tCVAR
  1615. dsym: tSYMBEG xstring_contents tSTRING_END
  1616. {
  1617. lexer.lex_state = :expr_end
  1618. result = val[1]
  1619. result ||= s(:str, "")
  1620. case result[0]
  1621. when :dstr then
  1622. result[0] = :dsym
  1623. when :str then
  1624. result = s(:lit, result.last.intern)
  1625. else
  1626. result = s(:dsym, "", result)
  1627. end
  1628. }
  1629. numeric: tINTEGER
  1630. | tFLOAT
  1631. | tUMINUS_NUM tINTEGER =tLOWEST
  1632. {
  1633. result = -val[1] # TODO: pt_testcase
  1634. }
  1635. | tUMINUS_NUM tFLOAT =tLOWEST
  1636. {
  1637. result = -val[1] # TODO: pt_testcase
  1638. }
  1639. user_variable: tIDENTIFIER
  1640. | tIVAR
  1641. | tGVAR
  1642. | tCONSTANT
  1643. | tCVAR
  1644. keyword_variable: kNIL { result = s(:nil) }
  1645. | kSELF { result = s(:self) }
  1646. | kTRUE { result = s(:true) }
  1647. | kFALSE { result = s(:false) }
  1648. | k__FILE__ { result = s(:str, self.file) }
  1649. | k__LINE__ { result = s(:lit, lexer.lineno) }
  1650. | k__ENCODING__
  1651. {
  1652. result =
  1653. if defined? Encoding then
  1654. s(:colon2, s(:const, :Encoding), :UTF_8)
  1655. else
  1656. s(:str, "Unsupported!")
  1657. end
  1658. }
  1659. var_ref: user_variable
  1660. {
  1661. var = val[0]
  1662. result = Sexp === var ? var : self.gettable(var)
  1663. }
  1664. | keyword_variable
  1665. {
  1666. var = val[0]
  1667. result = Sexp === var ? var : self.gettable(var)
  1668. }
  1669. var_lhs: user_variable
  1670. {
  1671. result = self.assignable val[0]
  1672. }
  1673. | keyword_variable
  1674. {
  1675. result = self.assignable val[0]
  1676. }
  1677. backref: tNTH_REF { result = s(:nth_ref, val[0]) }
  1678. | tBACK_REF { result = s(:back_ref, val[0]) }
  1679. superclass: term
  1680. {
  1681. result = nil
  1682. }
  1683. | tLT
  1684. {
  1685. lexer.lex_state = :expr_beg
  1686. }
  1687. expr_value term
  1688. {
  1689. result = val[2]
  1690. }
  1691. | error term
  1692. {
  1693. yyerrok
  1694. result = nil
  1695. }
  1696. f_arglist: tLPAREN2 f_args rparen
  1697. {
  1698. result = val[1]
  1699. lexer.lex_state = :expr_beg
  1700. self.lexer.command_start = true
  1701. }
  1702. | f_args term
  1703. {
  1704. result = val[0]
  1705. }
  1706. f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
  1707. {
  1708. result = args val
  1709. }
  1710. | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
  1711. {
  1712. result = args val
  1713. }
  1714. | f_arg tCOMMA f_optarg opt_f_block_arg
  1715. {
  1716. result = args val
  1717. }
  1718. | f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg
  1719. {
  1720. result = args val
  1721. }
  1722. | f_arg tCOMMA f_rest_arg opt_f_block_arg
  1723. {
  1724. result = args val
  1725. }
  1726. | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
  1727. {
  1728. result = args val
  1729. }
  1730. | f_arg opt_f_block_arg
  1731. {
  1732. result = args val
  1733. }
  1734. | f_optarg tCOMMA f_rest_arg opt_f_block_arg
  1735. {
  1736. result = args val
  1737. }
  1738. | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
  1739. {
  1740. result = args val
  1741. }
  1742. | f_optarg opt_f_block_arg
  1743. {
  1744. result = args val
  1745. }
  1746. | f_optarg tCOMMA f_arg opt_f_block_arg
  1747. {
  1748. result = args val
  1749. }
  1750. | f_rest_arg opt_f_block_arg
  1751. {
  1752. result = args val
  1753. }
  1754. | f_rest_arg tCOMMA f_arg opt_f_block_arg
  1755. {
  1756. result = args val
  1757. }
  1758. | f_block_arg
  1759. {
  1760. result = args val
  1761. }
  1762. |
  1763. {
  1764. result = args val
  1765. }
  1766. f_bad_arg: tCONSTANT
  1767. {
  1768. yyerror "formal argument cannot be a constant"
  1769. }
  1770. | tIVAR
  1771. {
  1772. yyerror "formal argument cannot be an instance variable"
  1773. }
  1774. | tGVAR
  1775. {
  1776. yyerror "formal argument cannot be a global variable"
  1777. }
  1778. | tCVAR
  1779. {
  1780. yyerror "formal argument cannot be a class variable"
  1781. }
  1782. f_norm_arg: f_bad_arg
  1783. | tIDENTIFIER
  1784. {
  1785. identifier = val[0].to_sym
  1786. self.env[identifier] = :lvar
  1787. result = identifier
  1788. }
  1789. f_arg_item: f_norm_arg
  1790. | tLPAREN f_margs rparen
  1791. {
  1792. result = val[1]
  1793. }
  1794. f_arg: f_arg_item
  1795. {
  1796. case val[0]
  1797. when Symbol then
  1798. result = s(:args)
  1799. result << val[0]
  1800. when Sexp then
  1801. result = val[0]
  1802. else
  1803. raise "Unknown f_arg type: #{val.inspect}"
  1804. end
  1805. }
  1806. | f_arg tCOMMA f_arg_item
  1807. {
  1808. list, _, item = val
  1809. if list.sexp_type == :args then
  1810. result = list
  1811. else
  1812. result = s(:args, list)
  1813. end
  1814. result << item
  1815. }
  1816. f_opt: tIDENTIFIER tEQL arg_value
  1817. {
  1818. result = self.assignable val[0], val[2]
  1819. # TODO: detect duplicate names
  1820. }
  1821. f_block_opt: tIDENTIFIER tEQL primary_value
  1822. {
  1823. result = self.assignable val[0], val[2]
  1824. }
  1825. f_block_optarg: f_block_opt
  1826. {
  1827. result = s(:block, val[0])
  1828. }
  1829. | f_block_optarg tCOMMA f_block_opt
  1830. {
  1831. result = val[0]
  1832. result << val[2]
  1833. }
  1834. f_optarg: f_opt
  1835. {
  1836. result = s(:block, val[0])
  1837. }
  1838. | f_optarg tCOMMA f_opt
  1839. {
  1840. result = self.block_append val[0], val[2]
  1841. }
  1842. restarg_mark: tSTAR2 | tSTAR
  1843. f_rest_arg: restarg_mark tIDENTIFIER
  1844. {
  1845. # TODO: differs from parse.y - needs tests
  1846. name = val[1].to_sym
  1847. self.assignable name
  1848. result = :"*#{name}"
  1849. }
  1850. | restarg_mark
  1851. {
  1852. name = :"*"
  1853. self.env[name] = :lvar
  1854. result = name
  1855. }
  1856. blkarg_mark: tAMPER2 | tAMPER
  1857. f_block_arg: blkarg_mark tIDENTIFIER
  1858. {
  1859. identifier = val[1].to_sym
  1860. self.env[identifier] = :lvar
  1861. result = "&#{identifier}".to_sym
  1862. }
  1863. opt_f_block_arg: tCOMMA f_block_arg
  1864. {
  1865. result = val[1]
  1866. }
  1867. |
  1868. {
  1869. result = nil
  1870. }
  1871. singleton: var_ref
  1872. | tLPAREN2
  1873. {
  1874. lexer.lex_state = :expr_beg
  1875. }
  1876. expr rparen
  1877. {
  1878. result = val[2]
  1879. yyerror "Can't define single method for literals." if
  1880. result[0] == :lit
  1881. }
  1882. assoc_list: none # [!nil]
  1883. {
  1884. result = s(:array)
  1885. }
  1886. | assocs trailer # [!nil]
  1887. {
  1888. result = val[0]
  1889. }
  1890. assocs: assoc
  1891. | assocs tCOMMA assoc
  1892. {
  1893. list = val[0].dup
  1894. more = val[2][1..-1]
  1895. list.push(*more) unless more.empty?
  1896. result = list
  1897. }
  1898. assoc: arg_value tASSOC arg_value
  1899. {
  1900. result = s(:array, val[0], val[2])
  1901. }
  1902. | tLABEL arg_value
  1903. {
  1904. label, _ = val[0] # TODO: fix lineno?
  1905. result = s(:array, s(:lit, label.to_sym), val[1])
  1906. }
  1907. operation: tIDENTIFIER | tCONSTANT | tFID
  1908. operation2: tIDENTIFIER | tCONSTANT | tFID | op
  1909. operation3: tIDENTIFIER | tFID | op
  1910. dot_or_colon: tDOT | tCOLON2
  1911. opt_terms: | terms
  1912. opt_nl: | tNL
  1913. rparen: opt_nl tRPAREN
  1914. rbracket: opt_nl tRBRACK
  1915. trailer: | tNL | tCOMMA
  1916. term: tSEMI { yyerrok }
  1917. | tNL
  1918. terms: term
  1919. | terms tSEMI { yyerrok }
  1920. none: { result = nil }
  1921. end
  1922. ---- inner
  1923. require "ruby_lexer"
  1924. require "ruby_parser_extras"
  1925. # :stopdoc:
  1926. # Local Variables: **
  1927. # racc-token-length-max:14 **
  1928. # End: **