typedruby.ypp 101 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009
  1. %require "3.0"
  2. %skeleton "lalr1.cc"
  3. %token-table
  4. %code requires {
  5. #include <ruby_parser/builder.hh>
  6. #include <ruby_parser/node.hh>
  7. #include <ruby_parser/token.hh>
  8. #include <ruby_parser/lexer.hh>
  9. #include <ruby_parser/driver.hh>
  10. #include <ruby_parser/state_stack.hh>
  11. #include <iterator>
  12. #include <utility>
  13. #include <cstdlib>
  14. using namespace ruby_parser;
  15. using namespace std::string_literals;
  16. #ifndef YY_NULLPTR
  17. #define YY_NULLPTR nullptr
  18. #endif
  19. }
  20. %param { ruby_parser::typedruby25& driver }
  21. %parse-param { ruby_parser::SelfPtr self }
  22. %define api.namespace {ruby_parser::bison::typedruby25}
  23. %define api.prefix {typedruby25}
  24. %define api.value.type { union parser_value }
  25. %define api.token.constructor false
  26. %define parse.assert
  27. %define parse.error verbose
  28. // mirrored in inc/ruby_parser/token.hh
  29. // if any of these token values are changed here, the header must be updated
  30. // as well.
  31. %token <token>
  32. kCLASS 1001
  33. kMODULE 1002
  34. kDEF 1003
  35. kUNDEF 1004
  36. kBEGIN 1005
  37. kRESCUE 1006
  38. kENSURE 1007
  39. kEND 1008
  40. kIF 1009
  41. kUNLESS 1010
  42. kTHEN 1011
  43. kELSIF 1012
  44. kELSE 1013
  45. kCASE 1014
  46. kWHEN 1015
  47. kWHILE 1016
  48. kUNTIL 1017
  49. kFOR 1018
  50. kBREAK 1019
  51. kNEXT 1020
  52. kREDO 1021
  53. kRETRY 1022
  54. kIN 1023
  55. kDO 1024
  56. kDO_COND 1025
  57. kDO_BLOCK 1026
  58. kDO_LAMBDA 1027
  59. kRETURN 1028
  60. kYIELD 1029
  61. kSUPER 1030
  62. kSELF 1031
  63. kNIL 1032
  64. kTRUE 1033
  65. kFALSE 1034
  66. kAND 1035
  67. kOR 1036
  68. kNOT 1037
  69. kIF_MOD 1038
  70. kUNLESS_MOD 1039
  71. kWHILE_MOD 1040
  72. kUNTIL_MOD 1041
  73. kRESCUE_MOD 1042
  74. kALIAS 1043
  75. kDEFINED 1044
  76. klBEGIN 1045
  77. klEND 1046
  78. k__LINE__ 1047
  79. k__FILE__ 1048
  80. k__ENCODING__ 1049
  81. tIDENTIFIER 1050
  82. tFID 1051
  83. tGVAR 1052
  84. tIVAR 1053
  85. tCONSTANT 1054
  86. tLABEL 1055
  87. tCVAR 1056
  88. tNTH_REF 1057
  89. tBACK_REF 1058
  90. tSTRING_CONTENT 1059
  91. tINTEGER 1060
  92. tFLOAT 1061
  93. tUPLUS 1062
  94. tUMINUS 1063
  95. tUNARY_NUM 1064
  96. tPOW 1065
  97. tCMP 1066
  98. tEQ 1067
  99. tEQQ 1068
  100. tNEQ 1069
  101. tEQL 1070
  102. tGEQ 1071
  103. tLEQ 1072
  104. tANDOP 1073
  105. tOROP 1074
  106. tMATCH 1075
  107. tNMATCH 1076
  108. tDOT 1077
  109. tDOT2 1078
  110. tDOT3 1079
  111. tAREF 1080
  112. tASET 1081
  113. tLSHFT 1082
  114. tRSHFT 1083
  115. tCOLON2 1084
  116. tCOLON3 1085
  117. tOP_ASGN 1086
  118. tASSOC 1087
  119. tLPAREN 1088
  120. tLPAREN2 1089
  121. tRPAREN 1090
  122. tLPAREN_ARG 1091
  123. tLBRACK 1092
  124. tLBRACK2 1093
  125. tRBRACK 1094
  126. tLBRACE 1095
  127. tLBRACE_ARG 1096
  128. tSTAR 1097
  129. tSTAR2 1098
  130. tAMPER 1099
  131. tAMPER2 1100
  132. tTILDE 1101
  133. tPERCENT 1102
  134. tDIVIDE 1103
  135. tDSTAR 1104
  136. tPLUS 1105
  137. tMINUS 1106
  138. tLT 1107
  139. tGT 1108
  140. tPIPE 1109
  141. tBANG 1110
  142. tCARET 1111
  143. tLCURLY 1112
  144. tRCURLY 1113
  145. tBACK_REF2 1114
  146. tSYMBEG 1115
  147. tSTRING_BEG 1116
  148. tXSTRING_BEG 1117
  149. tREGEXP_BEG 1118
  150. tREGEXP_OPT 1119
  151. tWORDS_BEG 1120
  152. tQWORDS_BEG 1121
  153. tSYMBOLS_BEG 1122
  154. tQSYMBOLS_BEG 1123
  155. tSTRING_DBEG 1124
  156. tSTRING_DVAR 1125
  157. tSTRING_END 1126
  158. tSTRING_DEND 1127
  159. tSTRING 1128
  160. tSYMBOL 1129
  161. tNL 1130
  162. tEH 1131
  163. tCOLON 1132
  164. tCOMMA 1133
  165. tSPACE 1134
  166. tSEMI 1135
  167. tLAMBDA 1136
  168. tLAMBEG 1137
  169. tCHARACTER 1138
  170. tRATIONAL 1139
  171. tIMAGINARY 1140
  172. tLABEL_END 1141
  173. tANDDOT 1142
  174. tRATIONAL_IMAGINARY 1143
  175. tFLOAT_IMAGINARY 1144
  176. %type <node>
  177. arg
  178. arg_rhs
  179. arg_value
  180. assoc
  181. backref
  182. block_arg
  183. block_call
  184. block_command
  185. block_param_def
  186. bodystmt
  187. bvar
  188. command
  189. command_asgn
  190. command_call
  191. command_rhs
  192. compstmt
  193. cpath
  194. dsym
  195. expr
  196. expr_value
  197. f_arg_item
  198. f_arglist
  199. f_block_kw
  200. f_block_opt
  201. f_kw
  202. f_larglist
  203. f_marg
  204. f_opt
  205. fitem
  206. for_var
  207. fsym
  208. keyword_variable
  209. lhs
  210. literal
  211. method_call
  212. mlhs
  213. mlhs_inner
  214. mlhs_item
  215. mlhs_node
  216. mrhs_arg
  217. none
  218. numeric
  219. opt_block_param
  220. primary
  221. primary_value
  222. qsymbols
  223. qwords
  224. regexp
  225. simple_numeric
  226. singleton
  227. stmt
  228. stmt_or_begin
  229. string1
  230. string_content
  231. string_dvar
  232. strings
  233. symbol
  234. symbols
  235. top_compstmt
  236. top_stmt
  237. user_variable
  238. var_lhs
  239. var_ref
  240. words
  241. xstring
  242. rel_expr
  243. %type <list>
  244. aref_args
  245. args
  246. args_tail
  247. assoc_list
  248. assocs
  249. block_args_tail
  250. block_param
  251. bv_decls
  252. call_args
  253. command_args
  254. exc_list
  255. f_arg
  256. f_args
  257. f_block_arg
  258. f_block_kwarg
  259. f_block_optarg
  260. f_kwarg
  261. f_kwrest
  262. f_marg_list
  263. f_margs
  264. f_optarg
  265. f_rest_arg
  266. list_none
  267. mlhs_basic
  268. mlhs_head
  269. mlhs_post
  270. mrhs
  271. opt_args_tail
  272. opt_block_arg
  273. opt_block_args_tail
  274. opt_bv_decl
  275. opt_call_args
  276. opt_f_block_arg
  277. opt_rescue
  278. qsym_list
  279. qword_list
  280. regexp_contents
  281. stmts
  282. string
  283. string_contents
  284. symbol_list
  285. top_stmts
  286. undef_list
  287. word
  288. word_list
  289. xstring_contents
  290. %type <token>
  291. blkarg_mark
  292. call_op
  293. cname
  294. do
  295. dot_or_colon
  296. f_arg_asgn
  297. f_bad_arg
  298. f_label
  299. f_norm_arg
  300. fcall
  301. fname
  302. kwrest_mark
  303. op
  304. operation
  305. operation2
  306. operation3
  307. rbracket
  308. restarg_mark
  309. reswords
  310. rparen
  311. term
  312. then
  313. relop
  314. k_return
  315. %type <delimited_list>
  316. opt_paren_args
  317. paren_args
  318. %type <delimited_block>
  319. brace_block
  320. brace_body
  321. cmd_brace_block
  322. do_block
  323. do_body
  324. lambda
  325. lambda_body
  326. begin_block
  327. %type <with_token>
  328. exc_var
  329. if_tail
  330. opt_else
  331. opt_ensure
  332. superclass
  333. expr_value_do
  334. %type <case_body>
  335. case_body
  336. cases
  337. %nonassoc tLOWEST
  338. %nonassoc tLBRACE_ARG
  339. %nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
  340. %left kOR kAND
  341. %right kNOT
  342. %nonassoc kDEFINED
  343. %right tEQL tOP_ASGN
  344. %left kRESCUE_MOD
  345. %right tEH tCOLON
  346. %nonassoc tDOT2 tDOT3
  347. %left tOROP
  348. %left tANDOP
  349. %nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
  350. %left tGT tGEQ tLT tLEQ
  351. %left tPIPE tCARET
  352. %left tAMPER2
  353. %left tLSHFT tRSHFT
  354. %left tPLUS tMINUS
  355. %left tSTAR2 tDIVIDE tPERCENT
  356. %right tUNARY_NUM tUMINUS
  357. %right tPOW
  358. %right tBANG tTILDE tUPLUS
  359. %code requires {
  360. union parser_value {
  361. ruby_parser::token *token;
  362. ruby_parser::delimited_node_list *delimited_list;
  363. ruby_parser::delimited_block *delimited_block;
  364. ruby_parser::node_with_token *with_token;
  365. ruby_parser::case_body *case_body;
  366. ruby_parser::ForeignPtr node;
  367. ruby_parser::node_list *list;
  368. ruby_parser::state_stack *stack;
  369. size_t size;
  370. bool boolean;
  371. };
  372. }
  373. %code {
  374. namespace ruby_parser {
  375. namespace bison {
  376. namespace typedruby25 {
  377. #define DIAGCHECK() do { \
  378. if (driver.pending_error) { \
  379. driver.pending_error = false; \
  380. YYERROR; \
  381. } \
  382. } while(false);
  383. void parser::error(const std::string &msg) {
  384. std::string error_message = msg;
  385. int token_type = static_cast<int>(driver.last_token->type());
  386. const char* token_str_name = yytname_[yytranslate_(token_type)];
  387. if (token_str_name != nullptr) {
  388. error_message = token_str_name;
  389. }
  390. driver.diagnostics.emplace_back(
  391. dlevel::ERROR, dclass::UnexpectedToken,
  392. diagnostic::range(driver.lex.last_token_s, driver.lex.last_token_e),
  393. error_message);
  394. }
  395. int yylex(parser::semantic_type *lval, ruby_parser::typedruby25 &driver) {
  396. auto token = driver.lex.advance();
  397. driver.last_token = token;
  398. int token_type = static_cast<int>(token->type());
  399. assert(token_type >= 0);
  400. lval->token = token;
  401. return token_type;
  402. }
  403. }}} // namespace
  404. } // %code
  405. %%
  406. program: top_compstmt
  407. {
  408. driver.ast = $1;
  409. }
  410. top_compstmt: top_stmts opt_terms
  411. {
  412. $$ = driver.build.compstmt(self, $1);
  413. }
  414. top_stmts: // nothing
  415. {
  416. $$ = driver.alloc.node_list();
  417. }
  418. | top_stmt
  419. {
  420. $$ = driver.alloc.node_list($1);
  421. }
  422. | top_stmts terms top_stmt
  423. {
  424. $1->emplace_back($3);
  425. $$ = $1;
  426. }
  427. | error top_stmt
  428. {
  429. $$ = driver.alloc.node_list($2);
  430. }
  431. top_stmt: stmt
  432. | klBEGIN begin_block
  433. {
  434. auto &delimited_block = $2;
  435. $$ = driver.build.preexe(self, $1, delimited_block->body, delimited_block->end);
  436. }
  437. begin_block: tLCURLY top_compstmt tRCURLY
  438. {
  439. $$ = driver.alloc.delimited_block($1, nullptr, $2, $3);
  440. }
  441. bodystmt: compstmt opt_rescue opt_else opt_ensure
  442. {
  443. auto &rescueBodies = $2;
  444. auto &else_ = $3;
  445. auto &ensure = $4;
  446. if (rescueBodies->size() == 0 && else_ != nullptr) {
  447. driver.diagnostics.emplace_back(
  448. dlevel::ERROR,
  449. dclass::UselessElse,
  450. else_->tok
  451. );
  452. }
  453. $$ = driver.build.beginBody(
  454. self,
  455. $1,
  456. rescueBodies,
  457. else_ ? else_->tok : nullptr,
  458. else_ ? else_->nod : nullptr,
  459. ensure ? ensure->tok : nullptr,
  460. ensure ? ensure->nod : nullptr
  461. );
  462. }
  463. compstmt: stmts opt_terms
  464. {
  465. $$ = driver.build.compstmt(self, $1);
  466. }
  467. stmts: // nothing
  468. {
  469. $$ = driver.alloc.node_list();
  470. }
  471. | stmt_or_begin
  472. {
  473. $$ = driver.alloc.node_list($1);
  474. }
  475. | stmts terms stmt_or_begin
  476. {
  477. $1->emplace_back($3);
  478. $$ = $1;
  479. }
  480. | error
  481. {
  482. $$ = driver.alloc.node_list();
  483. }
  484. stmt_or_begin: stmt
  485. | klBEGIN begin_block
  486. {
  487. driver.diagnostics.emplace_back(
  488. dlevel::ERROR,
  489. dclass::BeginInMethod,
  490. $1
  491. );
  492. YYERROR;
  493. }
  494. stmt: kALIAS fitem
  495. {
  496. driver.lex.set_state_expr_fname();
  497. }
  498. fitem
  499. {
  500. $$ = driver.build.alias(self, $1, $2, $4);
  501. }
  502. | kALIAS tGVAR tGVAR
  503. {
  504. $$ = driver.build.alias(self, $1, driver.build.gvar(self, $2), driver.build.gvar(self, $3));
  505. }
  506. | kALIAS tGVAR tBACK_REF
  507. {
  508. $$ = driver.build.alias(self, $1, driver.build.gvar(self, $2), driver.build.backRef(self, $3));
  509. }
  510. | kALIAS tGVAR tNTH_REF
  511. {
  512. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::NthRefAlias, $3);
  513. YYERROR;
  514. }
  515. | kUNDEF undef_list
  516. {
  517. $$ = driver.build.undefMethod(self, $1, $2);
  518. }
  519. | stmt kIF_MOD expr_value
  520. {
  521. $$ = driver.build.conditionMod(self, $1, nullptr, $3);
  522. }
  523. | stmt kUNLESS_MOD expr_value
  524. {
  525. $$ = driver.build.conditionMod(self, nullptr, $1, $3);
  526. }
  527. | stmt kWHILE_MOD expr_value
  528. {
  529. $$ = driver.build.loop_while_mod(self, $1, $3);
  530. }
  531. | stmt kUNTIL_MOD expr_value
  532. {
  533. $$ = driver.build.loopUntil_mod(self, $1, $3);
  534. }
  535. | stmt kRESCUE_MOD stmt
  536. {
  537. ruby_parser::node_list rescue_body(
  538. driver.build.rescue_body(self, $2, nullptr, nullptr, nullptr, nullptr, $3));
  539. $$ = driver.build.beginBody(self, $1, &rescue_body, nullptr, nullptr, nullptr, nullptr);
  540. }
  541. | klEND tLCURLY compstmt tRCURLY
  542. {
  543. $$ = driver.build.postexe(self, $1, $3, $4);
  544. }
  545. | command_asgn
  546. | mlhs tEQL command_call
  547. {
  548. $$ = driver.build.multi_assign(self, $1, $3);
  549. }
  550. | lhs tEQL mrhs
  551. {
  552. $$ = driver.build.assign(self, $1, $2, driver.build.array(self, nullptr, $3, nullptr));
  553. }
  554. | mlhs tEQL mrhs_arg
  555. {
  556. $$ = driver.build.multi_assign(self, $1, $3);
  557. }
  558. | expr
  559. command_asgn: lhs tEQL command_rhs
  560. {
  561. $$ = driver.build.assign(self, $1, $2, $3);
  562. }
  563. | var_lhs tOP_ASGN command_rhs
  564. {
  565. $$ = driver.build.op_assign(self, $1, $2, $3);
  566. DIAGCHECK();
  567. }
  568. | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
  569. {
  570. $$ = driver.build.op_assign(self, driver.build.index(self, $1, $2, $3, $4), $5, $6);
  571. DIAGCHECK();
  572. }
  573. | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
  574. {
  575. $$ = driver.build.op_assign(self, driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr), $4, $5);
  576. DIAGCHECK();
  577. }
  578. | primary_value call_op tCONSTANT tOP_ASGN command_rhs
  579. {
  580. $$ = driver.build.op_assign(self, driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr), $4, $5);
  581. DIAGCHECK();
  582. }
  583. | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
  584. {
  585. auto const_node = driver.build.constOpAssignable(self, driver.build.constFetch(self, $1, $2, $3));
  586. $$ = driver.build.op_assign(self, const_node, $4, $5);
  587. DIAGCHECK();
  588. }
  589. | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
  590. {
  591. $$ = driver.build.op_assign(self, driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr), $4, $5);
  592. DIAGCHECK();
  593. }
  594. | backref tOP_ASGN command_rhs
  595. {
  596. $$ = driver.build.op_assign(self, $1, $2, $3);
  597. DIAGCHECK();
  598. }
  599. command_rhs: command_call %prec tOP_ASGN
  600. | command_call kRESCUE_MOD stmt
  601. {
  602. node_list rescue_body(
  603. driver.build.rescue_body(self, $2, nullptr, nullptr, nullptr, nullptr, $3)
  604. );
  605. $$ = driver.build.beginBody(self, $1, &rescue_body, nullptr, nullptr, nullptr, nullptr);
  606. }
  607. | command_asgn
  608. expr: command_call
  609. | expr kAND expr
  610. {
  611. $$ = driver.build.logicalAnd(self, $1, $2, $3);
  612. }
  613. | expr kOR expr
  614. {
  615. $$ = driver.build.logicalOr(self, $1, $2, $3);
  616. }
  617. | kNOT opt_nl expr
  618. {
  619. $$ = driver.build.not_op(self, $1, nullptr, $3, nullptr);
  620. }
  621. | tBANG command_call
  622. {
  623. $$ = driver.build.not_op(self, $1, nullptr, $2, nullptr);
  624. }
  625. | arg
  626. expr_value: expr
  627. expr_value_do: {
  628. driver.lex.cond.push(true);
  629. }
  630. expr_value do
  631. {
  632. driver.lex.cond.pop();
  633. $$ = driver.alloc.node_with_token($3, $2);
  634. }
  635. command_call: command
  636. | block_command
  637. block_command: block_call
  638. | block_call dot_or_colon operation2 command_args
  639. {
  640. $$ = driver.build.call_method(self, $1, $2, $3, nullptr, $4, nullptr);
  641. }
  642. cmd_brace_block: tLBRACE_ARG
  643. {
  644. driver.lex.context.push(Context::State::BLOCK);
  645. }
  646. brace_body tRCURLY
  647. {
  648. auto &block = $3;
  649. block->begin = $1;
  650. block->end = $4;
  651. $$ = block;
  652. driver.lex.context.pop();
  653. }
  654. fcall: operation
  655. command: fcall command_args %prec tLOWEST
  656. {
  657. $$ = driver.build.call_method(self, nullptr, nullptr, $1, nullptr, $2, nullptr);
  658. }
  659. | fcall command_args cmd_brace_block
  660. {
  661. auto method_call = driver.build.call_method(self, nullptr, nullptr, $1, nullptr, $2, nullptr);
  662. auto &delimited_block = $3;
  663. $$ = driver.build.block(self, method_call,
  664. delimited_block->begin,
  665. delimited_block->args,
  666. delimited_block->body,
  667. delimited_block->end);
  668. DIAGCHECK();
  669. }
  670. | primary_value call_op operation2 command_args %prec tLOWEST
  671. {
  672. $$ = driver.build.call_method(self, $1, $2, $3, nullptr, $4, nullptr);
  673. }
  674. | primary_value call_op operation2 command_args cmd_brace_block
  675. {
  676. auto method_call = driver.build.call_method(self, $1, $2, $3, nullptr, $4, nullptr);
  677. auto &delimited_block = $5;
  678. $$ = driver.build.block(self, method_call,
  679. delimited_block->begin,
  680. delimited_block->args,
  681. delimited_block->body,
  682. delimited_block->end);
  683. DIAGCHECK();
  684. }
  685. | primary_value tCOLON2 operation2 command_args %prec tLOWEST
  686. {
  687. $$ = driver.build.call_method(self, $1, $2, $3, nullptr, $4, nullptr);
  688. }
  689. | primary_value tCOLON2 operation2 command_args cmd_brace_block
  690. {
  691. auto method_call = driver.build.call_method(self, $1, $2, $3, nullptr, $4, nullptr);
  692. auto &delimited_block = $5;
  693. $$ = driver.build.block(self, method_call,
  694. delimited_block->begin,
  695. delimited_block->args,
  696. delimited_block->body,
  697. delimited_block->end);
  698. DIAGCHECK();
  699. }
  700. | kSUPER command_args
  701. {
  702. $$ = driver.build.keywordSuper(self, $1, nullptr, $2, nullptr);
  703. }
  704. | kYIELD command_args
  705. {
  706. $$ = driver.build.keywordYield(self, $1, nullptr, $2, nullptr);
  707. DIAGCHECK();
  708. }
  709. | k_return call_args
  710. {
  711. $$ = driver.build.keywordReturn(self, $1, nullptr, $2, nullptr);
  712. }
  713. | kBREAK call_args
  714. {
  715. $$ = driver.build.keywordBreak(self, $1, nullptr, $2, nullptr);
  716. }
  717. | kNEXT call_args
  718. {
  719. $$ = driver.build.keywordNext(self, $1, nullptr, $2, nullptr);
  720. }
  721. mlhs: mlhs_basic
  722. {
  723. $$ = driver.build.multi_lhs(self, nullptr, $1, nullptr);
  724. }
  725. | tLPAREN mlhs_inner rparen
  726. {
  727. $$ = driver.build.begin(self, $1, $2, $3);
  728. }
  729. mlhs_inner: mlhs_basic
  730. {
  731. $$ = driver.build.multi_lhs(self, nullptr, $1, nullptr);
  732. }
  733. | tLPAREN mlhs_inner rparen
  734. {
  735. $$ = driver.build.multi_lhs1(self, $1, $2, $3);
  736. }
  737. mlhs_basic: mlhs_head
  738. | mlhs_head mlhs_item
  739. {
  740. auto &list = $1;
  741. list->emplace_back($2);
  742. $$ = list;
  743. }
  744. | mlhs_head tSTAR mlhs_node
  745. {
  746. auto &list = $1;
  747. list->emplace_back(driver.build.splat_mlhs(self, $2, $3));
  748. $$ = list;
  749. }
  750. | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
  751. {
  752. auto &head = $1;
  753. head->emplace_back(driver.build.splat_mlhs(self, $2, $3));
  754. head->concat($5);
  755. $$ = head;
  756. }
  757. | mlhs_head tSTAR
  758. {
  759. auto &list = $1;
  760. list->emplace_back(driver.build.splat_mlhs(self, $2, nullptr));
  761. $$ = list;
  762. }
  763. | mlhs_head tSTAR tCOMMA mlhs_post
  764. {
  765. auto &head = $1;
  766. head->emplace_back(driver.build.splat_mlhs(self, $2, nullptr));
  767. head->concat($4);
  768. $$ = head;
  769. }
  770. | tSTAR mlhs_node
  771. {
  772. $$ = driver.alloc.node_list(driver.build.splat_mlhs(self, $1, $2));
  773. }
  774. | tSTAR mlhs_node tCOMMA mlhs_post
  775. {
  776. node_list *items = driver.alloc.node_list(driver.build.splat_mlhs(self, $1, $2));
  777. items->concat($4);
  778. $$ = items;
  779. }
  780. | tSTAR
  781. {
  782. $$ = driver.alloc.node_list(driver.build.splat_mlhs(self, $1, nullptr));
  783. }
  784. | tSTAR tCOMMA mlhs_post
  785. {
  786. node_list *items = driver.alloc.node_list(driver.build.splat_mlhs(self, $1, nullptr));
  787. items->concat($3);
  788. $$ = items;
  789. }
  790. mlhs_item: mlhs_node
  791. | tLPAREN mlhs_inner rparen
  792. {
  793. $$ = driver.build.begin(self, $1, $2, $3);
  794. }
  795. mlhs_head: mlhs_item tCOMMA
  796. {
  797. $$ = driver.alloc.node_list($1);
  798. }
  799. | mlhs_head mlhs_item tCOMMA
  800. {
  801. auto &list = $1;
  802. list->emplace_back($2);
  803. $$ = list;
  804. }
  805. mlhs_post: mlhs_item
  806. {
  807. $$ = driver.alloc.node_list($1);
  808. }
  809. | mlhs_post tCOMMA mlhs_item
  810. {
  811. auto &list = $1;
  812. list->emplace_back($3);
  813. $$ = list;
  814. }
  815. mlhs_node: user_variable
  816. {
  817. $$ = driver.build.assignable(self, $1);
  818. DIAGCHECK();
  819. }
  820. | keyword_variable
  821. {
  822. $$ = driver.build.assignable(self, $1);
  823. DIAGCHECK();
  824. }
  825. | primary_value tLBRACK2 opt_call_args rbracket
  826. {
  827. $$ = driver.build.indexAsgn(self, $1, $2, $3, $4);
  828. }
  829. | primary_value call_op tIDENTIFIER
  830. {
  831. $$ = driver.build.attrAsgn(self, $1, $2, $3);
  832. }
  833. | primary_value tCOLON2 tIDENTIFIER
  834. {
  835. $$ = driver.build.attrAsgn(self, $1, $2, $3);
  836. }
  837. | primary_value call_op tCONSTANT
  838. {
  839. $$ = driver.build.attrAsgn(self, $1, $2, $3);
  840. }
  841. | primary_value tCOLON2 tCONSTANT
  842. {
  843. $$ = driver.build.assignable(self, driver.build.constFetch(self, $1, $2, $3));
  844. DIAGCHECK();
  845. }
  846. | tCOLON3 tCONSTANT
  847. {
  848. $$ = driver.build.assignable(self, driver.build.constGlobal(self, $1, $2));
  849. DIAGCHECK();
  850. }
  851. | backref
  852. {
  853. $$ = driver.build.assignable(self, $1);
  854. DIAGCHECK();
  855. }
  856. lhs: user_variable
  857. {
  858. $$ = driver.build.assignable(self, $1);
  859. DIAGCHECK();
  860. }
  861. | keyword_variable
  862. {
  863. $$ = driver.build.assignable(self, $1);
  864. DIAGCHECK();
  865. }
  866. | primary_value tLBRACK2 opt_call_args rbracket
  867. {
  868. $$ = driver.build.indexAsgn(self, $1, $2, $3, $4);
  869. }
  870. | primary_value call_op tIDENTIFIER
  871. {
  872. $$ = driver.build.attrAsgn(self, $1, $2, $3);
  873. }
  874. | primary_value tCOLON2 tIDENTIFIER
  875. {
  876. $$ = driver.build.attrAsgn(self, $1, $2, $3);
  877. }
  878. | primary_value call_op tCONSTANT
  879. {
  880. $$ = driver.build.attrAsgn(self, $1, $2, $3);
  881. }
  882. | primary_value tCOLON2 tCONSTANT
  883. {
  884. $$ = driver.build.assignable(self, driver.build.constFetch(self, $1, $2, $3));
  885. DIAGCHECK();
  886. }
  887. | tCOLON3 tCONSTANT
  888. {
  889. $$ = driver.build.assignable(self, driver.build.constGlobal(self, $1, $2));
  890. DIAGCHECK();
  891. }
  892. | backref
  893. {
  894. $$ = driver.build.assignable(self, $1);
  895. DIAGCHECK();
  896. }
  897. cname: tIDENTIFIER
  898. {
  899. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ModuleNameConst, $1);
  900. YYERROR;
  901. }
  902. | tCONSTANT
  903. cpath: tCOLON3 cname
  904. {
  905. $$ = driver.build.constGlobal(self, $1, $2);
  906. }
  907. | cname
  908. {
  909. $$ = driver.build.const_(self, $1);
  910. }
  911. | primary_value tCOLON2 cname
  912. {
  913. $$ = driver.build.constFetch(self, $1, $2, $3);
  914. }
  915. fname: tIDENTIFIER | tCONSTANT | tFID
  916. | op
  917. | reswords
  918. fsym: fname
  919. {
  920. $$ = driver.build.symbol(self, $1);
  921. }
  922. | symbol
  923. fitem: fsym
  924. | dsym
  925. undef_list: fitem
  926. {
  927. $$ = driver.alloc.node_list($1);
  928. }
  929. | undef_list tCOMMA
  930. {
  931. driver.lex.set_state_expr_fname();
  932. }
  933. fitem
  934. {
  935. auto &list = $1;
  936. list->emplace_back($4);
  937. $$ = list;
  938. }
  939. op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
  940. | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
  941. | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
  942. | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
  943. | tUPLUS | tUMINUS | tAREF | tASET | tDSTAR | tBACK_REF2
  944. reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
  945. | kALIAS | kAND | kBEGIN | kBREAK | kCASE
  946. | kCLASS | kDEF | kDEFINED | kDO | kELSE
  947. | kELSIF | kEND | kENSURE | kFALSE | kFOR
  948. | kIN | kMODULE | kNEXT | kNIL | kNOT
  949. | kOR | kREDO | kRESCUE | kRETRY | kRETURN
  950. | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
  951. | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
  952. | kUNTIL
  953. arg: lhs tEQL arg_rhs
  954. {
  955. $$ = driver.build.assign(self, $1, $2, $3);
  956. }
  957. | var_lhs tOP_ASGN arg_rhs
  958. {
  959. $$ = driver.build.op_assign(self, $1, $2, $3);
  960. DIAGCHECK();
  961. }
  962. | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
  963. {
  964. $$ = driver.build.op_assign(self, driver.build.index(self, $1, $2, $3, $4), $5, $6);
  965. DIAGCHECK();
  966. }
  967. | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
  968. {
  969. $$ = driver.build.op_assign(self, driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr), $4, $5);
  970. DIAGCHECK();
  971. }
  972. | primary_value call_op tCONSTANT tOP_ASGN arg_rhs
  973. {
  974. $$ = driver.build.op_assign(self, driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr), $4, $5);
  975. DIAGCHECK();
  976. }
  977. | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
  978. {
  979. $$ = driver.build.op_assign(self, driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr), $4, $5);
  980. DIAGCHECK();
  981. }
  982. | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
  983. {
  984. auto const_ = driver.build.constOpAssignable(self, driver.build.constFetch(self, $1, $2, $3));
  985. $$ = driver.build.op_assign(self, const_, $4, $5);
  986. DIAGCHECK();
  987. }
  988. | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
  989. {
  990. auto const_ = driver.build.constOpAssignable(self, driver.build.constGlobal(self, $1, $2));
  991. $$ = driver.build.op_assign(self, const_, $3, $4);
  992. DIAGCHECK();
  993. }
  994. | backref tOP_ASGN arg_rhs
  995. {
  996. $$ = driver.build.op_assign(self, $1, $2, $3);
  997. DIAGCHECK();
  998. }
  999. | arg tDOT2 arg
  1000. {
  1001. $$ = driver.build.range_inclusive(self, $1, $2, $3);
  1002. }
  1003. | arg tDOT3 arg
  1004. {
  1005. $$ = driver.build.range_exclusive(self, $1, $2, $3);
  1006. }
  1007. | arg tDOT2
  1008. {
  1009. $$ = driver.build.range_inclusive(self, $1, $2, nullptr);
  1010. }
  1011. | arg tDOT3
  1012. {
  1013. $$ = driver.build.range_exclusive(self, $1, $2, nullptr);
  1014. }
  1015. | arg tPLUS arg
  1016. {
  1017. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1018. }
  1019. | arg tMINUS arg
  1020. {
  1021. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1022. }
  1023. | arg tSTAR2 arg
  1024. {
  1025. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1026. }
  1027. | arg tDIVIDE arg
  1028. {
  1029. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1030. }
  1031. | arg tPERCENT arg
  1032. {
  1033. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1034. }
  1035. | arg tPOW arg
  1036. {
  1037. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1038. }
  1039. | tUNARY_NUM simple_numeric tPOW arg
  1040. {
  1041. $$ = driver.build.unary_op(self, $1, driver.build.binaryOp(self, $2, $3, $4));
  1042. }
  1043. | tUPLUS arg
  1044. {
  1045. $$ = driver.build.unary_op(self, $1, $2);
  1046. }
  1047. | tUMINUS arg
  1048. {
  1049. $$ = driver.build.unary_op(self, $1, $2);
  1050. }
  1051. | arg tPIPE arg
  1052. {
  1053. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1054. }
  1055. | arg tCARET arg
  1056. {
  1057. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1058. }
  1059. | arg tAMPER2 arg
  1060. {
  1061. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1062. }
  1063. | arg tCMP arg
  1064. {
  1065. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1066. }
  1067. | rel_expr %prec tCMP
  1068. | arg tEQ arg
  1069. {
  1070. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1071. }
  1072. | arg tEQQ arg
  1073. {
  1074. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1075. }
  1076. | arg tNEQ arg
  1077. {
  1078. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1079. }
  1080. | arg tMATCH arg
  1081. {
  1082. $$ = driver.build.match_op(self, $1, $2, $3);
  1083. DIAGCHECK();
  1084. }
  1085. | arg tNMATCH arg
  1086. {
  1087. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1088. }
  1089. | tBANG arg
  1090. {
  1091. $$ = driver.build.not_op(self, $1, nullptr, $2, nullptr);
  1092. }
  1093. | tTILDE arg
  1094. {
  1095. $$ = driver.build.unary_op(self, $1, $2);
  1096. }
  1097. | arg tLSHFT arg
  1098. {
  1099. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1100. }
  1101. | arg tRSHFT arg
  1102. {
  1103. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1104. }
  1105. | arg tANDOP arg
  1106. {
  1107. $$ = driver.build.logicalAnd(self, $1, $2, $3);
  1108. }
  1109. | arg tOROP arg
  1110. {
  1111. $$ = driver.build.logicalOr(self, $1, $2, $3);
  1112. }
  1113. | kDEFINED opt_nl arg
  1114. {
  1115. $$ = driver.build.keywordDefined(self, $1, $3);
  1116. }
  1117. | arg tEH arg opt_nl tCOLON arg
  1118. {
  1119. $$ = driver.build.ternary(self, $1, $2, $3, $5, $6);
  1120. }
  1121. | primary
  1122. relop: tGT | tLT | tGEQ | tLEQ
  1123. rel_expr: arg relop arg %prec tGT
  1124. {
  1125. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1126. }
  1127. | rel_expr relop arg %prec tGT
  1128. {
  1129. $$ = driver.build.binaryOp(self, $1, $2, $3);
  1130. }
  1131. arg_value: arg
  1132. aref_args: list_none
  1133. | args trailer
  1134. | args tCOMMA assocs trailer
  1135. {
  1136. auto &list = $1;
  1137. list->emplace_back(driver.build.associate(self, nullptr, $3, nullptr));
  1138. $$ = list;
  1139. }
  1140. | assocs trailer
  1141. {
  1142. $$ = driver.alloc.node_list(driver.build.associate(self, nullptr, $1, nullptr));
  1143. }
  1144. arg_rhs: arg %prec tOP_ASGN
  1145. | arg kRESCUE_MOD arg
  1146. {
  1147. node_list rescue_body(driver.build.rescue_body(self, $2, nullptr, nullptr, nullptr, nullptr, $3));
  1148. $$ = driver.build.beginBody(self, $1, &rescue_body, nullptr, nullptr, nullptr, nullptr);
  1149. }
  1150. paren_args: tLPAREN2 opt_call_args rparen
  1151. {
  1152. $$ = driver.alloc.delimited_node_list($1, $2, $3);
  1153. }
  1154. opt_paren_args: // nothing
  1155. {
  1156. $$ = driver.alloc.delimited_node_list(nullptr, driver.alloc.node_list(), nullptr);
  1157. }
  1158. | paren_args
  1159. opt_call_args: // nothing
  1160. {
  1161. $$ = driver.alloc.node_list();
  1162. }
  1163. | call_args
  1164. | args tCOMMA
  1165. | args tCOMMA assocs tCOMMA
  1166. {
  1167. auto &list = $1;
  1168. list->emplace_back(driver.build.associate(self, nullptr, $3, nullptr));
  1169. $$ = list;
  1170. }
  1171. | assocs tCOMMA
  1172. {
  1173. $$ = driver.alloc.node_list(driver.build.associate(self, nullptr, $1, nullptr));
  1174. }
  1175. call_args: command
  1176. {
  1177. $$ = driver.alloc.node_list($1);
  1178. }
  1179. | args opt_block_arg
  1180. {
  1181. auto &args = $1;
  1182. args->concat($2);
  1183. $$ = args;
  1184. }
  1185. | assocs opt_block_arg
  1186. {
  1187. node_list *args = driver.alloc.node_list(driver.build.associate(self, nullptr, $1, nullptr));
  1188. args->concat($2);
  1189. $$ = args;
  1190. }
  1191. | args tCOMMA assocs opt_block_arg
  1192. {
  1193. auto &args = $1;
  1194. args->emplace_back(driver.build.associate(self, nullptr, $3, nullptr));
  1195. args->concat($4);
  1196. $$ = args;
  1197. }
  1198. | block_arg
  1199. {
  1200. $$ = driver.alloc.node_list($1);
  1201. }
  1202. command_args: {
  1203. ruby_parser::token_type last_token = driver.last_token->type();
  1204. bool lookahead = (last_token == ruby_parser::token_type::tLBRACK) || (last_token == ruby_parser::token_type::tLPAREN_ARG);
  1205. if (lookahead) {
  1206. auto top = driver.lex.cmdarg.pop();
  1207. driver.lex.cmdarg.push(true);
  1208. driver.lex.cmdarg.push(top);
  1209. } else {
  1210. driver.lex.cmdarg.push(true);
  1211. }
  1212. }
  1213. call_args
  1214. {
  1215. ruby_parser::token_type last_token = driver.last_token->type();
  1216. bool lookahead = (last_token == ruby_parser::token_type::tLBRACE_ARG);
  1217. if (lookahead) {
  1218. auto top = driver.lex.cmdarg.pop();
  1219. driver.lex.cmdarg.pop();
  1220. driver.lex.cmdarg.push(top);
  1221. } else {
  1222. driver.lex.cmdarg.pop();
  1223. }
  1224. $$ = $2;
  1225. }
  1226. block_arg: tAMPER arg_value
  1227. {
  1228. $$ = driver.build.blockPass(self, $1, $2);
  1229. }
  1230. opt_block_arg: tCOMMA block_arg
  1231. {
  1232. $$ = driver.alloc.node_list($2);
  1233. }
  1234. | // nothing
  1235. {
  1236. $$ = driver.alloc.node_list();
  1237. }
  1238. args: arg_value
  1239. {
  1240. $$ = driver.alloc.node_list($1);
  1241. }
  1242. | tSTAR arg_value
  1243. {
  1244. $$ = driver.alloc.node_list(driver.build.splat(self, $1, $2));
  1245. }
  1246. | args tCOMMA arg_value
  1247. {
  1248. auto &list = $1;
  1249. list->emplace_back($3);
  1250. $$ = list;
  1251. }
  1252. | args tCOMMA tSTAR arg_value
  1253. {
  1254. auto &list = $1;
  1255. list->emplace_back(driver.build.splat(self, $3, $4));
  1256. $$ = list;
  1257. }
  1258. mrhs_arg: mrhs
  1259. {
  1260. $$ = driver.build.array(self, nullptr, $1, nullptr);
  1261. }
  1262. | arg_value
  1263. mrhs: args tCOMMA arg_value
  1264. {
  1265. auto &list = $1;
  1266. list->emplace_back($3);
  1267. $$ = list;
  1268. }
  1269. | args tCOMMA tSTAR arg_value
  1270. {
  1271. auto &list = $1;
  1272. list->emplace_back(driver.build.splat(self, $3, $4));
  1273. $$ = list;
  1274. }
  1275. | tSTAR arg_value
  1276. {
  1277. $$ = driver.alloc.node_list(driver.build.splat(self, $1, $2));
  1278. }
  1279. primary: literal
  1280. | strings
  1281. | xstring
  1282. | regexp
  1283. | words
  1284. | qwords
  1285. | symbols
  1286. | qsymbols
  1287. | var_ref
  1288. | backref
  1289. | tFID
  1290. {
  1291. $$ = driver.build.call_method(self, nullptr, nullptr, $1, nullptr, nullptr, nullptr);
  1292. }
  1293. | kBEGIN
  1294. {
  1295. $<stack>$ = driver.copy_stack();
  1296. driver.lex.cmdarg.clear();
  1297. }
  1298. bodystmt kEND
  1299. {
  1300. driver.replace_stack($<stack>2);
  1301. $$ = driver.build.beginKeyword(self, $1, $3, $4);
  1302. }
  1303. | tLPAREN_ARG stmt
  1304. {
  1305. driver.lex.set_state_expr_endarg();
  1306. }
  1307. rparen
  1308. {
  1309. $$ = driver.build.begin(self, $1, $2, $4);
  1310. }
  1311. | tLPAREN_ARG
  1312. {
  1313. driver.lex.set_state_expr_endarg();
  1314. }
  1315. opt_nl tRPAREN
  1316. {
  1317. $$ = driver.build.begin(self, $1, nullptr, $4);
  1318. }
  1319. | tLPAREN compstmt tRPAREN
  1320. {
  1321. $$ = driver.build.begin(self, $1, $2, $3);
  1322. }
  1323. | primary_value tCOLON2 tCONSTANT
  1324. {
  1325. $$ = driver.build.constFetch(self, $1, $2, $3);
  1326. }
  1327. | tCOLON3 tCONSTANT
  1328. {
  1329. $$ = driver.build.constGlobal(self, $1, $2);
  1330. }
  1331. | tLBRACK aref_args tRBRACK
  1332. {
  1333. $$ = driver.build.array(self, $1, $2, $3);
  1334. }
  1335. | tLBRACE assoc_list tRCURLY
  1336. {
  1337. $$ = driver.build.associate(self, $1, $2, $3);
  1338. }
  1339. | k_return
  1340. {
  1341. $$ = driver.build.keywordReturn(self, $1, nullptr, nullptr, nullptr);
  1342. }
  1343. | kYIELD tLPAREN2 call_args rparen
  1344. {
  1345. $$ = driver.build.keywordYield(self, $1, $2, $3, $4);
  1346. DIAGCHECK();
  1347. }
  1348. | kYIELD tLPAREN2 rparen
  1349. {
  1350. node_list tmp;
  1351. $$ = driver.build.keywordYield(self, $1, $2, &tmp, $3);
  1352. DIAGCHECK();
  1353. }
  1354. | kYIELD
  1355. {
  1356. $$ = driver.build.keywordYield(self, $1, nullptr, nullptr, nullptr);
  1357. DIAGCHECK();
  1358. }
  1359. | kDEFINED opt_nl tLPAREN2 expr rparen
  1360. {
  1361. $$ = driver.build.keywordDefined(self, $1, $4);
  1362. }
  1363. | kNOT tLPAREN2 expr rparen
  1364. {
  1365. $$ = driver.build.not_op(self, $1, $2, $3, $4);
  1366. }
  1367. | kNOT tLPAREN2 rparen
  1368. {
  1369. $$ = driver.build.not_op(self, $1, $2, nullptr, $3);
  1370. }
  1371. | fcall brace_block
  1372. {
  1373. auto method_call = driver.build.call_method(self, nullptr, nullptr, $1, nullptr, nullptr, nullptr);
  1374. auto &delimited_block = $2;
  1375. $$ = driver.build.block(self, method_call,
  1376. delimited_block->begin,
  1377. delimited_block->args,
  1378. delimited_block->body,
  1379. delimited_block->end);
  1380. DIAGCHECK();
  1381. }
  1382. | method_call
  1383. | method_call brace_block
  1384. {
  1385. auto &delimited_block = $2;
  1386. $$ = driver.build.block(self, $1,
  1387. delimited_block->begin,
  1388. delimited_block->args,
  1389. delimited_block->body,
  1390. delimited_block->end);
  1391. DIAGCHECK();
  1392. }
  1393. | tLAMBDA lambda
  1394. {
  1395. auto lambda_call = driver.build.callLambda(self, $1);
  1396. auto &lambda = $2;
  1397. $$ = driver.build.block(self, lambda_call,
  1398. lambda->begin,
  1399. lambda->args,
  1400. lambda->body,
  1401. lambda->end);
  1402. DIAGCHECK();
  1403. }
  1404. | kIF expr_value then compstmt if_tail kEND
  1405. {
  1406. auto &else_ = $5;
  1407. $$ = driver.build.condition(self, $1, $2, $3, $4,
  1408. else_ ? else_->tok : nullptr,
  1409. else_ ? else_->nod : nullptr, $6);
  1410. }
  1411. | kUNLESS expr_value then compstmt opt_else kEND
  1412. {
  1413. auto &else_ = $5;
  1414. $$ = driver.build.condition(self, $1, $2, $3,
  1415. else_ ? else_->nod : nullptr,
  1416. else_ ? else_->tok : nullptr, $4, $6);
  1417. }
  1418. | kWHILE expr_value_do compstmt kEND
  1419. {
  1420. $$ = driver.build.loop_while(self, $1, $2->nod, $2->tok, $3, $4);
  1421. }
  1422. | kUNTIL expr_value_do compstmt kEND
  1423. {
  1424. $$ = driver.build.loopUntil(self, $1, $2->nod, $2->tok, $3, $4);
  1425. }
  1426. | kCASE expr_value opt_terms case_body kEND
  1427. {
  1428. auto &case_body = $4;
  1429. auto &else_ = case_body->els;
  1430. $$ = driver.build.case_(self, $1, $2,
  1431. &case_body->whens,
  1432. else_ ? else_->tok : nullptr,
  1433. else_ ? else_->nod : nullptr, $5);
  1434. }
  1435. | kCASE opt_terms case_body kEND
  1436. {
  1437. auto &case_body = $3;
  1438. auto &else_ = case_body->els;
  1439. $$ = driver.build.case_(self, $1, nullptr,
  1440. &case_body->whens,
  1441. else_ ? else_->tok : nullptr,
  1442. else_ ? else_->nod : nullptr, $4);
  1443. }
  1444. | kFOR for_var kIN expr_value_do compstmt kEND
  1445. {
  1446. $$ = driver.build.for_(self, $1, $2, $3, $4->nod, $4->tok, $5, $6);
  1447. }
  1448. | kCLASS cpath superclass
  1449. {
  1450. driver.lex.extend_static();
  1451. driver.lex.cmdarg.push(false);
  1452. driver.lex.cond.push(false);
  1453. driver.lex.context.push(Context::State::CLASS);
  1454. }
  1455. bodystmt kEND
  1456. {
  1457. if (!driver.lex.context.classDefintinionAllowed()) {
  1458. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ClassInDef, $1);
  1459. YYERROR;
  1460. }
  1461. auto class_tok = $1;
  1462. auto end_tok = $6;
  1463. auto &superclass_ = $3;
  1464. auto lt_t = superclass_ ? superclass_->tok : nullptr;
  1465. auto superclass = superclass_ ? superclass_->nod : nullptr;
  1466. $$ = driver.build.def_class(self, class_tok, $2, lt_t, superclass, $5, end_tok);
  1467. driver.lex.cmdarg.pop();
  1468. driver.lex.cond.pop();
  1469. driver.lex.unextend();
  1470. driver.lex.context.pop();
  1471. }
  1472. | kCLASS tLSHFT expr term
  1473. {
  1474. driver.lex.extend_static();
  1475. driver.lex.cmdarg.push(false);
  1476. driver.lex.cond.push(false);
  1477. driver.lex.context.push(Context::State::SCLASS);
  1478. }
  1479. bodystmt kEND
  1480. {
  1481. $$ = driver.build.def_sclass(self, $1, $2, $3, $6, $7);
  1482. driver.lex.cmdarg.pop();
  1483. driver.lex.cond.pop();
  1484. driver.lex.unextend();
  1485. driver.lex.context.pop();
  1486. }
  1487. | kMODULE cpath
  1488. {
  1489. driver.lex.extend_static();
  1490. driver.lex.cmdarg.push(false);
  1491. }
  1492. bodystmt kEND
  1493. {
  1494. if (!driver.lex.context.moduleDefintinionAllowed()) {
  1495. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ModuleInDef, $1);
  1496. YYERROR;
  1497. }
  1498. auto module_tok = $1;
  1499. auto end_tok = $5;
  1500. $$ = driver.build.defModule(self, module_tok, $2, $4, end_tok);
  1501. driver.lex.cmdarg.pop();
  1502. driver.lex.unextend();
  1503. }
  1504. | kDEF fname
  1505. {
  1506. driver.lex.extend_static();
  1507. driver.lex.cmdarg.push(false);
  1508. driver.lex.cond.push(false);
  1509. driver.lex.context.push(Context::State::DEF);
  1510. }
  1511. f_arglist bodystmt kEND
  1512. {
  1513. $$ = driver.build.defMethod(self, $1, $2, $4, $5, $6);
  1514. driver.lex.cmdarg.pop();
  1515. driver.lex.cond.pop();
  1516. driver.lex.unextend();
  1517. driver.lex.context.pop();
  1518. }
  1519. | kDEF singleton dot_or_colon
  1520. {
  1521. driver.lex.set_state_expr_fname();
  1522. }
  1523. fname
  1524. {
  1525. driver.lex.extend_static();
  1526. driver.lex.cmdarg.push(false);
  1527. driver.lex.cond.push(false);
  1528. driver.lex.context.push(Context::State::DEFS);
  1529. }
  1530. f_arglist bodystmt kEND
  1531. {
  1532. $$ = driver.build.defSingleton(self, $1, $2, $3, $5, $7, $8, $9);
  1533. DIAGCHECK();
  1534. driver.lex.cmdarg.pop();
  1535. driver.lex.cond.pop();
  1536. driver.lex.unextend();
  1537. driver.lex.context.pop();
  1538. }
  1539. | kBREAK
  1540. {
  1541. $$ = driver.build.keywordBreak(self, $1, nullptr, nullptr, nullptr);
  1542. }
  1543. | kNEXT
  1544. {
  1545. $$ = driver.build.keywordNext(self, $1, nullptr, nullptr, nullptr);
  1546. }
  1547. | kREDO
  1548. {
  1549. $$ = driver.build.keywordRedo(self, $1);
  1550. }
  1551. | kRETRY
  1552. {
  1553. $$ = driver.build.keywordRetry(self, $1);
  1554. }
  1555. primary_value: primary
  1556. k_return: kRETURN
  1557. {
  1558. if (driver.lex.context.inClass()) {
  1559. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::InvalidReturn, $1);
  1560. YYERROR;
  1561. }
  1562. }
  1563. then: term
  1564. | kTHEN
  1565. | term kTHEN
  1566. {
  1567. $$ = $2;
  1568. }
  1569. do: term
  1570. | kDO_COND
  1571. if_tail: opt_else
  1572. | kELSIF expr_value then compstmt if_tail
  1573. {
  1574. auto elsif_t = $1;
  1575. auto &else_ = $5;
  1576. $$ = driver.alloc.node_with_token(elsif_t,
  1577. driver.build.condition(self,
  1578. elsif_t, $2, $3, $4,
  1579. else_ ? else_->tok : nullptr,
  1580. else_ ? else_->nod : nullptr, nullptr)
  1581. );
  1582. }
  1583. opt_else: none
  1584. {
  1585. $$ = nullptr;
  1586. }
  1587. | kELSE compstmt
  1588. {
  1589. $$ = driver.alloc.node_with_token($1, $2);
  1590. }
  1591. for_var: lhs
  1592. | mlhs
  1593. f_marg: f_norm_arg
  1594. {
  1595. $$ = driver.build.arg(self, $1);
  1596. }
  1597. | tLPAREN f_margs rparen
  1598. {
  1599. $$ = driver.build.multi_lhs(self, $1, $2, $3);
  1600. }
  1601. f_marg_list: f_marg
  1602. {
  1603. $$ = driver.alloc.node_list($1);
  1604. }
  1605. | f_marg_list tCOMMA f_marg
  1606. {
  1607. auto &list = $1;
  1608. list->emplace_back($3);
  1609. $$ = list;
  1610. }
  1611. f_margs: f_marg_list
  1612. | f_marg_list tCOMMA tSTAR f_norm_arg
  1613. {
  1614. auto &list = $1;
  1615. list->emplace_back(driver.build.restarg(self, $3, $4));
  1616. $$ = list;
  1617. }
  1618. | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
  1619. {
  1620. auto &args = $1;
  1621. args->emplace_back(driver.build.restarg(self, $3, $4));
  1622. args->concat($6);
  1623. $$ = args;
  1624. }
  1625. | f_marg_list tCOMMA tSTAR
  1626. {
  1627. auto &list = $1;
  1628. list->emplace_back(driver.build.restarg(self, $3, nullptr));
  1629. $$ = list;
  1630. }
  1631. | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
  1632. {
  1633. auto &args = $1;
  1634. args->emplace_back(driver.build.restarg(self, $3, nullptr));
  1635. args->concat($5);
  1636. $$ = args;
  1637. }
  1638. | tSTAR f_norm_arg
  1639. {
  1640. $$ = driver.alloc.node_list(driver.build.restarg(self, $1, $2));
  1641. }
  1642. | tSTAR f_norm_arg tCOMMA f_marg_list
  1643. {
  1644. auto &args = $4;
  1645. args->push_front(driver.build.restarg(self, $1, $2));
  1646. $$ = args;
  1647. }
  1648. | tSTAR
  1649. {
  1650. $$ = driver.alloc.node_list(driver.build.restarg(self, $1, nullptr));
  1651. }
  1652. | tSTAR tCOMMA f_marg_list
  1653. {
  1654. auto &args = $3;
  1655. args->push_front(driver.build.restarg(self, $1, nullptr));
  1656. $$ = args;
  1657. }
  1658. block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
  1659. {
  1660. auto &args = $1;
  1661. args->concat($3);
  1662. args->concat($4);
  1663. $$ = args;
  1664. }
  1665. | f_block_kwarg opt_f_block_arg
  1666. {
  1667. auto &args = $1;
  1668. args->concat($2);
  1669. $$ = args;
  1670. }
  1671. | f_kwrest opt_f_block_arg
  1672. {
  1673. auto &args = $1;
  1674. args->concat($2);
  1675. $$ = args;
  1676. }
  1677. | f_block_arg
  1678. {
  1679. $$ = $1;
  1680. }
  1681. opt_block_args_tail:
  1682. tCOMMA block_args_tail
  1683. {
  1684. $$ = $2;
  1685. }
  1686. | // nothing
  1687. {
  1688. $$ = driver.alloc.node_list();
  1689. }
  1690. block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
  1691. {
  1692. auto &args = $1;
  1693. args->concat($3);
  1694. args->concat($5);
  1695. args->concat($6);
  1696. $$ = args;
  1697. }
  1698. | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
  1699. {
  1700. auto &args = $1;
  1701. args->concat($3);
  1702. args->concat($5);
  1703. args->concat($7);
  1704. args->concat($8);
  1705. $$ = args;
  1706. }
  1707. | f_arg tCOMMA f_block_optarg opt_block_args_tail
  1708. {
  1709. auto &args = $1;
  1710. args->concat($3);
  1711. args->concat($4);
  1712. $$ = args;
  1713. }
  1714. | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
  1715. {
  1716. auto &args = $1;
  1717. args->concat($3);
  1718. args->concat($5);
  1719. args->concat($6);
  1720. $$ = args;
  1721. }
  1722. | f_arg tCOMMA f_rest_arg opt_block_args_tail
  1723. {
  1724. auto &args = $1;
  1725. args->concat($3);
  1726. args->concat($4);
  1727. $$ = args;
  1728. }
  1729. | f_arg tCOMMA
  1730. | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
  1731. {
  1732. auto &args = $1;
  1733. args->concat($3);
  1734. args->concat($5);
  1735. args->concat($6);
  1736. $$ = args;
  1737. }
  1738. | f_arg opt_block_args_tail
  1739. {
  1740. auto &args = $1;
  1741. auto &block_args_tail = $2;
  1742. if (block_args_tail->size() == 0 && args->size() == 1) {
  1743. $$ = driver.alloc.node_list(driver.build.procarg0(self, args->at(0)));
  1744. } else {
  1745. args->concat(block_args_tail);
  1746. $$ = args;
  1747. }
  1748. }
  1749. | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
  1750. {
  1751. auto &args = $1;
  1752. args->concat($3);
  1753. args->concat($4);
  1754. $$ = args;
  1755. }
  1756. | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
  1757. {
  1758. auto &args = $1;
  1759. args->concat($3);
  1760. args->concat($5);
  1761. args->concat($6);
  1762. $$ = args;
  1763. }
  1764. | f_block_optarg opt_block_args_tail
  1765. {
  1766. auto &args = $1;
  1767. args->concat($2);
  1768. $$ = args;
  1769. }
  1770. | f_block_optarg tCOMMA f_arg opt_block_args_tail
  1771. {
  1772. auto &args = $1;
  1773. args->concat($3);
  1774. args->concat($4);
  1775. $$ = args;
  1776. }
  1777. | f_rest_arg opt_block_args_tail
  1778. {
  1779. auto &args = $1;
  1780. args->concat($2);
  1781. $$ = args;
  1782. }
  1783. | f_rest_arg tCOMMA f_arg opt_block_args_tail
  1784. {
  1785. auto &args = $1;
  1786. args->concat($3);
  1787. args->concat($4);
  1788. $$ = args;
  1789. }
  1790. | block_args_tail
  1791. opt_block_param: // nothing
  1792. {
  1793. $$ = driver.build.args(self, nullptr, nullptr, nullptr, true);
  1794. DIAGCHECK();
  1795. }
  1796. | block_param_def
  1797. {
  1798. driver.lex.set_state_expr_value();
  1799. }
  1800. block_param_def: tPIPE opt_bv_decl tPIPE
  1801. {
  1802. $$ = driver.build.args(self, $1, $2, $3, true);
  1803. DIAGCHECK();
  1804. }
  1805. | tOROP
  1806. {
  1807. $$ = driver.build.args(self, $1, nullptr, $1, true);
  1808. DIAGCHECK();
  1809. }
  1810. | tPIPE block_param opt_bv_decl tPIPE
  1811. {
  1812. auto &params = $2;
  1813. params->concat($3);
  1814. $$ = driver.build.args(self, $1, params, $4, true);
  1815. DIAGCHECK();
  1816. }
  1817. opt_bv_decl: opt_nl
  1818. {
  1819. $$ = driver.alloc.node_list();
  1820. }
  1821. | opt_nl tSEMI bv_decls opt_nl
  1822. {
  1823. $$ = $3;
  1824. }
  1825. bv_decls: bvar
  1826. {
  1827. $$ = driver.alloc.node_list($1);
  1828. }
  1829. | bv_decls tCOMMA bvar
  1830. {
  1831. auto &list = $1;
  1832. list->emplace_back($3);
  1833. $$ = list;
  1834. }
  1835. bvar: tIDENTIFIER
  1836. {
  1837. auto ident = $1;
  1838. driver.lex.declare(ident->string());
  1839. $$ = driver.build.shadowarg(self, ident);
  1840. }
  1841. | f_bad_arg
  1842. {
  1843. $$ = nullptr;
  1844. }
  1845. lambda: {
  1846. driver.lex.extend_dynamic();
  1847. }
  1848. f_larglist
  1849. {
  1850. driver.lex.cmdarg.push(false);
  1851. }
  1852. lambda_body
  1853. {
  1854. driver.lex.cmdarg.pop();
  1855. auto &delimited_block = $4;
  1856. delimited_block->args = $2;
  1857. $$ = delimited_block;
  1858. driver.lex.unextend();
  1859. }
  1860. f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN
  1861. {
  1862. auto &args = $2;
  1863. args->concat($3);
  1864. $$ = driver.build.args(self, $1, args, $4, true);
  1865. DIAGCHECK();
  1866. }
  1867. | f_args
  1868. {
  1869. $$ = driver.build.args(self, nullptr, $1, nullptr, true);
  1870. DIAGCHECK();
  1871. }
  1872. lambda_body: tLAMBEG
  1873. {
  1874. driver.lex.context.push(Context::State::LAMBDA);
  1875. }
  1876. compstmt tRCURLY
  1877. {
  1878. $$ = driver.alloc.delimited_block($1, nullptr, $3, $4);
  1879. driver.lex.context.pop();
  1880. }
  1881. | kDO_LAMBDA
  1882. {
  1883. driver.lex.context.push(Context::State::LAMBDA);
  1884. }
  1885. bodystmt kEND
  1886. {
  1887. $$ = driver.alloc.delimited_block($1, nullptr, $3, $4);
  1888. driver.lex.context.pop();
  1889. }
  1890. do_block: kDO_BLOCK
  1891. {
  1892. driver.lex.context.push(Context::State::BLOCK);
  1893. }
  1894. do_body kEND
  1895. {
  1896. auto &delimited_block = $3;
  1897. delimited_block->begin = $1;
  1898. delimited_block->end = $4;
  1899. $$ = delimited_block;
  1900. driver.lex.context.pop();
  1901. }
  1902. block_call: command do_block
  1903. {
  1904. auto &delimited_block = $2;
  1905. $$ = driver.build.block(self, $1,
  1906. delimited_block->begin,
  1907. delimited_block->args,
  1908. delimited_block->body,
  1909. delimited_block->end
  1910. );
  1911. DIAGCHECK();
  1912. }
  1913. | block_call dot_or_colon operation2 opt_paren_args
  1914. {
  1915. auto &delimited = $4;
  1916. $$ = driver.build.call_method(self, $1, $2, $3,
  1917. delimited->begin,
  1918. delimited->inner,
  1919. delimited->end);
  1920. }
  1921. | block_call dot_or_colon operation2 opt_paren_args brace_block
  1922. {
  1923. auto &delimited = $4;
  1924. auto method_call = driver.build.call_method(self, $1, $2, $3,
  1925. delimited->begin,
  1926. delimited->inner,
  1927. delimited->end);
  1928. auto &block = $5;
  1929. $$ = driver.build.block(self, method_call,
  1930. block->begin,
  1931. block->args,
  1932. block->body,
  1933. block->end);
  1934. DIAGCHECK();
  1935. }
  1936. | block_call dot_or_colon operation2 command_args do_block
  1937. {
  1938. auto method_call = driver.build.call_method(self, $1, $2, $3, nullptr, $4, nullptr);
  1939. auto &block = $5;
  1940. $$ = driver.build.block(self, method_call, block->begin, block->args, block->body, block->end);
  1941. DIAGCHECK();
  1942. }
  1943. method_call: fcall paren_args
  1944. {
  1945. auto &delimited = $2;
  1946. $$ = driver.build.call_method(self, nullptr, nullptr, $1,
  1947. delimited->begin,
  1948. delimited->inner,
  1949. delimited->end);
  1950. }
  1951. | primary_value call_op operation2 opt_paren_args
  1952. {
  1953. auto &delimited = $4;
  1954. $$ = driver.build.call_method(self, $1, $2, $3,
  1955. delimited->begin,
  1956. delimited->inner,
  1957. delimited->end);
  1958. }
  1959. | primary_value tCOLON2 operation2 paren_args
  1960. {
  1961. auto &delimited = $4;
  1962. $$ = driver.build.call_method(self, $1, $2, $3,
  1963. delimited->begin,
  1964. delimited->inner,
  1965. delimited->end);
  1966. }
  1967. | primary_value tCOLON2 operation3
  1968. {
  1969. $$ = driver.build.call_method(self, $1, $2, $3, nullptr, nullptr, nullptr);
  1970. }
  1971. | primary_value call_op paren_args
  1972. {
  1973. auto &delimited = $3;
  1974. $$ = driver.build.call_method(self, $1, $2, nullptr,
  1975. delimited->begin,
  1976. delimited->inner,
  1977. delimited->end);
  1978. }
  1979. | primary_value tCOLON2 paren_args
  1980. {
  1981. auto &delimited = $3;
  1982. $$ = driver.build.call_method(self, $1, $2, nullptr,
  1983. delimited->begin,
  1984. delimited->inner,
  1985. delimited->end);
  1986. }
  1987. | kSUPER paren_args
  1988. {
  1989. auto &delimited = $2;
  1990. $$ = driver.build.keywordSuper(self, $1,
  1991. delimited->begin,
  1992. delimited->inner,
  1993. delimited->end);
  1994. }
  1995. | kSUPER
  1996. {
  1997. $$ = driver.build.keywordZsuper(self, $1);
  1998. }
  1999. | primary_value tLBRACK2 opt_call_args rbracket
  2000. {
  2001. $$ = driver.build.index(self, $1, $2, $3, $4);
  2002. }
  2003. brace_block: tLCURLY
  2004. {
  2005. driver.lex.context.push(Context::State::BLOCK);
  2006. }
  2007. brace_body tRCURLY
  2008. {
  2009. auto &block = $3;
  2010. block->begin = $1;
  2011. block->end = $4;
  2012. $$ = block;
  2013. driver.lex.context.pop();
  2014. }
  2015. | kDO
  2016. {
  2017. driver.lex.context.push(Context::State::BLOCK);
  2018. }
  2019. do_body kEND
  2020. {
  2021. auto &block = $3;
  2022. block->begin = $1;
  2023. block->end = $4;
  2024. $$ = block;
  2025. driver.lex.context.pop();
  2026. }
  2027. brace_body: {
  2028. driver.lex.extend_dynamic();
  2029. }
  2030. opt_block_param bodystmt
  2031. {
  2032. $$ = driver.alloc.delimited_block(nullptr, $2, $3, nullptr);
  2033. driver.lex.unextend();
  2034. }
  2035. do_body: {
  2036. driver.lex.extend_dynamic();
  2037. }
  2038. {
  2039. driver.lex.cmdarg.push(false);
  2040. }
  2041. opt_block_param bodystmt
  2042. {
  2043. $$ = driver.alloc.delimited_block(nullptr, $3, $4, nullptr);
  2044. driver.lex.unextend();
  2045. driver.lex.cmdarg.pop();
  2046. }
  2047. case_body: kWHEN args then compstmt cases
  2048. {
  2049. auto &cases = $5;
  2050. cases->whens.push_front(driver.build.when(self, $1, $2, $3, $4));
  2051. $$ = cases;
  2052. }
  2053. cases: opt_else
  2054. {
  2055. $$ = driver.alloc.case_body($1);
  2056. }
  2057. | case_body
  2058. opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
  2059. {
  2060. auto &exc_var = $3;
  2061. auto &exc_list_ = $2;
  2062. auto exc_list = exc_list_
  2063. ? driver.build.array(self, nullptr, exc_list_, nullptr)
  2064. : nullptr;
  2065. auto &rescues = $6;
  2066. rescues->push_front(driver.build.rescue_body(self, $1,
  2067. exc_list,
  2068. exc_var ? exc_var->tok : nullptr,
  2069. exc_var ? exc_var->nod : nullptr,
  2070. $4, $5));
  2071. $$ = rescues;
  2072. }
  2073. |
  2074. {
  2075. $$ = driver.alloc.node_list();
  2076. }
  2077. exc_list: arg_value
  2078. {
  2079. $$ = driver.alloc.node_list($1);
  2080. }
  2081. | mrhs
  2082. | list_none
  2083. exc_var: tASSOC lhs
  2084. {
  2085. $$ = driver.alloc.node_with_token($1, $2);
  2086. }
  2087. | // nothing
  2088. {
  2089. $$ = nullptr;
  2090. }
  2091. opt_ensure: kENSURE compstmt
  2092. {
  2093. $$ = driver.alloc.node_with_token($1, $2);
  2094. }
  2095. | // nothing
  2096. {
  2097. $$ = nullptr;
  2098. }
  2099. literal: numeric
  2100. | symbol
  2101. | dsym
  2102. strings: string
  2103. {
  2104. $$ = driver.build.string_compose(self, nullptr, $1, nullptr);
  2105. }
  2106. string: string1
  2107. {
  2108. $$ = driver.alloc.node_list($1);
  2109. }
  2110. | string string1
  2111. {
  2112. auto &list = $1;
  2113. list->emplace_back($2);
  2114. $$ = list;
  2115. }
  2116. string1: tSTRING_BEG string_contents tSTRING_END
  2117. {
  2118. auto str = driver.build.string_compose(self, $1, $2, $3);
  2119. $$ = driver.build.dedentString(self, str, driver.lex.dedentLevel().value_or(0));
  2120. }
  2121. | tSTRING
  2122. {
  2123. auto str = driver.build.string(self, $1);
  2124. $$ = driver.build.dedentString(self, str, driver.lex.dedentLevel().value_or(0));
  2125. }
  2126. | tCHARACTER
  2127. {
  2128. $$ = driver.build.character(self, $1);
  2129. }
  2130. xstring: tXSTRING_BEG xstring_contents tSTRING_END
  2131. {
  2132. auto xstr = driver.build.xstring_compose(self, $1, $2, $3);
  2133. $$ = driver.build.dedentString(self, xstr, driver.lex.dedentLevel().value_or(0));
  2134. }
  2135. regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT
  2136. {
  2137. auto opts = driver.build.regexp_options(self, $4);
  2138. $$ = driver.build.regexp_compose(self, $1, $2, $3, opts);
  2139. DIAGCHECK();
  2140. }
  2141. words: tWORDS_BEG word_list tSTRING_END
  2142. {
  2143. $$ = driver.build.words_compose(self, $1, $2, $3);
  2144. }
  2145. word_list: // nothing
  2146. {
  2147. $$ = driver.alloc.node_list();
  2148. }
  2149. | word_list word tSPACE
  2150. {
  2151. auto &list = $1;
  2152. list->emplace_back(driver.build.word(self, $2));
  2153. $$ = list;
  2154. }
  2155. word: string_content
  2156. {
  2157. $$ = driver.alloc.node_list($1);
  2158. }
  2159. | word string_content
  2160. {
  2161. auto &list = $1;
  2162. list->emplace_back($2);
  2163. $$ = list;
  2164. }
  2165. symbols: tSYMBOLS_BEG symbol_list tSTRING_END
  2166. {
  2167. $$ = driver.build.symbols_compose(self, $1, $2, $3);
  2168. }
  2169. symbol_list: // nothing
  2170. {
  2171. $$ = driver.alloc.node_list();
  2172. }
  2173. | symbol_list word tSPACE
  2174. {
  2175. auto &list = $1;
  2176. list->emplace_back(driver.build.word(self, $2));
  2177. $$ = list;
  2178. }
  2179. qwords: tQWORDS_BEG qword_list tSTRING_END
  2180. {
  2181. $$ = driver.build.words_compose(self, $1, $2, $3);
  2182. }
  2183. qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END
  2184. {
  2185. $$ = driver.build.symbols_compose(self, $1, $2, $3);
  2186. }
  2187. qword_list: // nothing
  2188. {
  2189. $$ = driver.alloc.node_list();
  2190. }
  2191. | qword_list tSTRING_CONTENT tSPACE
  2192. {
  2193. auto &list = $1;
  2194. list->emplace_back(driver.build.string_internal(self, $2));
  2195. $$ = list;
  2196. }
  2197. qsym_list: // nothing
  2198. {
  2199. $$ = driver.alloc.node_list();
  2200. }
  2201. | qsym_list tSTRING_CONTENT tSPACE
  2202. {
  2203. auto &list = $1;
  2204. list->emplace_back(driver.build.symbol_internal(self, $2));
  2205. $$ = list;
  2206. }
  2207. string_contents: // nothing
  2208. {
  2209. $$ = driver.alloc.node_list();
  2210. }
  2211. | string_contents string_content
  2212. {
  2213. auto &list = $1;
  2214. list->emplace_back($2);
  2215. $$ = list;
  2216. }
  2217. xstring_contents: // nothing
  2218. {
  2219. $$ = driver.alloc.node_list();
  2220. }
  2221. | xstring_contents string_content
  2222. {
  2223. auto &list = $1;
  2224. list->emplace_back($2);
  2225. $$ = list;
  2226. }
  2227. regexp_contents: // nothing
  2228. {
  2229. $$ = driver.alloc.node_list();
  2230. }
  2231. | regexp_contents string_content
  2232. {
  2233. auto &list = $1;
  2234. list->emplace_back($2);
  2235. $$ = list;
  2236. }
  2237. string_content: tSTRING_CONTENT
  2238. {
  2239. $$ = driver.build.string_internal(self, $1);
  2240. }
  2241. | tSTRING_DVAR string_dvar
  2242. {
  2243. $$ = $2;
  2244. }
  2245. | tSTRING_DBEG
  2246. {
  2247. driver.lex.cond.push(false);
  2248. driver.lex.cmdarg.push(false);
  2249. }
  2250. compstmt tSTRING_DEND
  2251. {
  2252. driver.lex.cond.pop();
  2253. driver.lex.cmdarg.pop();
  2254. $$ = driver.build.begin(self, $1, $3, $4);
  2255. }
  2256. string_dvar: tGVAR
  2257. {
  2258. $$ = driver.build.gvar(self, $1);
  2259. }
  2260. | tIVAR
  2261. {
  2262. $$ = driver.build.ivar(self, $1);
  2263. }
  2264. | tCVAR
  2265. {
  2266. $$ = driver.build.cvar(self, $1);
  2267. }
  2268. | backref
  2269. symbol: tSYMBOL
  2270. {
  2271. driver.lex.set_state_expr_end();
  2272. $$ = driver.build.symbol(self, $1);
  2273. }
  2274. dsym: tSYMBEG xstring_contents tSTRING_END
  2275. {
  2276. driver.lex.set_state_expr_end();
  2277. $$ = driver.build.symbol_compose(self, $1, $2, $3);
  2278. }
  2279. numeric: simple_numeric
  2280. {
  2281. $$ = $1;
  2282. }
  2283. | tUNARY_NUM simple_numeric %prec tLOWEST
  2284. {
  2285. $$ = driver.build.unary_op(self, $1, $2);
  2286. }
  2287. simple_numeric: tINTEGER
  2288. {
  2289. driver.lex.set_state_expr_end();
  2290. $$ = driver.build.integer(self, $1);
  2291. }
  2292. | tFLOAT
  2293. {
  2294. driver.lex.set_state_expr_end();
  2295. $$ = driver.build.float_(self, $1);
  2296. }
  2297. | tRATIONAL
  2298. {
  2299. driver.lex.set_state_expr_end();
  2300. $$ = driver.build.rational(self, $1);
  2301. }
  2302. | tIMAGINARY
  2303. {
  2304. driver.lex.set_state_expr_end();
  2305. $$ = driver.build.complex(self, $1);
  2306. }
  2307. | tRATIONAL_IMAGINARY
  2308. {
  2309. driver.lex.set_state_expr_end();
  2310. $$ = driver.build.rational_complex(self, $1);
  2311. }
  2312. | tFLOAT_IMAGINARY
  2313. {
  2314. driver.lex.set_state_expr_end();
  2315. $$ = driver.build.floatComplex(self, $1);
  2316. }
  2317. user_variable: tIDENTIFIER
  2318. {
  2319. $$ = driver.build.ident(self, $1);
  2320. }
  2321. | tIVAR
  2322. {
  2323. $$ = driver.build.ivar(self, $1);
  2324. }
  2325. | tGVAR
  2326. {
  2327. $$ = driver.build.gvar(self, $1);
  2328. }
  2329. | tCONSTANT
  2330. {
  2331. $$ = driver.build.const_(self, $1);
  2332. }
  2333. | tCVAR
  2334. {
  2335. $$ = driver.build.cvar(self, $1);
  2336. }
  2337. keyword_variable: kNIL
  2338. {
  2339. $$ = driver.build.nil(self, $1);
  2340. }
  2341. | kSELF
  2342. {
  2343. $$ = driver.build.self_(self, $1);
  2344. }
  2345. | kTRUE
  2346. {
  2347. $$ = driver.build.true_(self, $1);
  2348. }
  2349. | kFALSE
  2350. {
  2351. $$ = driver.build.false_(self, $1);
  2352. }
  2353. | k__FILE__
  2354. {
  2355. $$ = driver.build.fileLiteral(self, $1);
  2356. }
  2357. | k__LINE__
  2358. {
  2359. $$ = driver.build.line_literal(self, $1);
  2360. }
  2361. | k__ENCODING__
  2362. {
  2363. $$ = driver.build.encodingLiteral(self, $1);
  2364. }
  2365. var_ref: user_variable
  2366. {
  2367. $$ = driver.build.accessible(self, $1);
  2368. }
  2369. | keyword_variable
  2370. {
  2371. $$ = driver.build.accessible(self, $1);
  2372. }
  2373. var_lhs: user_variable
  2374. {
  2375. $$ = driver.build.assignable(self, $1);
  2376. DIAGCHECK();
  2377. }
  2378. | keyword_variable
  2379. {
  2380. $$ = driver.build.assignable(self, $1);
  2381. DIAGCHECK();
  2382. }
  2383. backref: tNTH_REF
  2384. {
  2385. $$ = driver.build.nth_ref(self, $1);
  2386. }
  2387. | tBACK_REF
  2388. {
  2389. $$ = driver.build.backRef(self, $1);
  2390. }
  2391. superclass: tLT
  2392. {
  2393. driver.lex.set_state_expr_value();
  2394. }
  2395. expr_value term
  2396. {
  2397. $$ = driver.alloc.node_with_token($1, $3);
  2398. }
  2399. | // nothing
  2400. {
  2401. $$ = nullptr;
  2402. }
  2403. f_arglist: tLPAREN2 f_args rparen
  2404. {
  2405. driver.lex.set_state_expr_value();
  2406. $$ = driver.build.args(self, $1, $2, $3, true);
  2407. }
  2408. | {
  2409. $<boolean>$ = driver.lex.in_kwarg;
  2410. driver.lex.in_kwarg = true;
  2411. }
  2412. f_args term
  2413. {
  2414. driver.lex.in_kwarg = $<boolean>1;
  2415. $$ = driver.build.args(self, nullptr, $2, nullptr, true);
  2416. DIAGCHECK();
  2417. }
  2418. args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
  2419. {
  2420. auto &args = $1;
  2421. args->concat($3);
  2422. args->concat($4);
  2423. $$ = args;
  2424. }
  2425. | f_kwarg opt_f_block_arg
  2426. {
  2427. auto &args = $1;
  2428. args->concat($2);
  2429. $$ = args;
  2430. }
  2431. | f_kwrest opt_f_block_arg
  2432. {
  2433. auto &args = $1;
  2434. args->concat($2);
  2435. $$ = args;
  2436. }
  2437. | f_block_arg
  2438. {
  2439. $$ = $1;
  2440. }
  2441. opt_args_tail: tCOMMA args_tail
  2442. {
  2443. $$ = $2;
  2444. }
  2445. | // nothing
  2446. {
  2447. $$ = driver.alloc.node_list();
  2448. }
  2449. f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
  2450. {
  2451. auto &args = $1;
  2452. args->concat($3);
  2453. args->concat($5);
  2454. args->concat($6);
  2455. $$ = args;
  2456. }
  2457. | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
  2458. {
  2459. auto &args = $1;
  2460. args->concat($3);
  2461. args->concat($5);
  2462. args->concat($7);
  2463. args->concat($8);
  2464. $$ = args;
  2465. }
  2466. | f_arg tCOMMA f_optarg opt_args_tail
  2467. {
  2468. auto &args = $1;
  2469. args->concat($3);
  2470. args->concat($4);
  2471. $$ = args;
  2472. }
  2473. | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
  2474. {
  2475. auto &args = $1;
  2476. args->concat($3);
  2477. args->concat($5);
  2478. args->concat($6);
  2479. $$ = args;
  2480. }
  2481. | f_arg tCOMMA f_rest_arg opt_args_tail
  2482. {
  2483. auto &args = $1;
  2484. args->concat($3);
  2485. args->concat($4);
  2486. $$ = args;
  2487. }
  2488. | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
  2489. {
  2490. auto &args = $1;
  2491. args->concat($3);
  2492. args->concat($5);
  2493. args->concat($6);
  2494. $$ = args;
  2495. }
  2496. | f_arg opt_args_tail
  2497. {
  2498. auto &args = $1;
  2499. args->concat($2);
  2500. $$ = args;
  2501. }
  2502. | f_optarg tCOMMA f_rest_arg opt_args_tail
  2503. {
  2504. auto &args = $1;
  2505. args->concat($3);
  2506. args->concat($4);
  2507. $$ = args;
  2508. }
  2509. | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
  2510. {
  2511. auto &args = $1;
  2512. args->concat($3);
  2513. args->concat($5);
  2514. args->concat($6);
  2515. $$ = args;
  2516. }
  2517. | f_optarg opt_args_tail
  2518. {
  2519. auto &args = $1;
  2520. args->concat($2);
  2521. $$ = args;
  2522. }
  2523. | f_optarg tCOMMA f_arg opt_args_tail
  2524. {
  2525. auto &args = $1;
  2526. args->concat($3);
  2527. args->concat($4);
  2528. $$ = args;
  2529. }
  2530. | f_rest_arg opt_args_tail
  2531. {
  2532. auto &args = $1;
  2533. args->concat($2);
  2534. $$ = args;
  2535. }
  2536. | f_rest_arg tCOMMA f_arg opt_args_tail
  2537. {
  2538. auto &args = $1;
  2539. args->concat($3);
  2540. args->concat($4);
  2541. $$ = args;
  2542. }
  2543. | args_tail
  2544. {
  2545. $$ = $1;
  2546. }
  2547. | // nothing
  2548. {
  2549. $$ = driver.alloc.node_list();
  2550. }
  2551. f_bad_arg: tCONSTANT
  2552. {
  2553. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ArgumentConst, $1);
  2554. YYERROR;
  2555. }
  2556. | tIVAR
  2557. {
  2558. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ArgumentIvar, $1);
  2559. YYERROR;
  2560. }
  2561. | tGVAR
  2562. {
  2563. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ArgumentGvar, $1);
  2564. YYERROR;
  2565. }
  2566. | tCVAR
  2567. {
  2568. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ArgumentCvar, $1);
  2569. YYERROR;
  2570. }
  2571. f_norm_arg: f_bad_arg
  2572. | tIDENTIFIER
  2573. {
  2574. auto ident = $1;
  2575. driver.lex.declare(ident->string());
  2576. $$ = ident;
  2577. }
  2578. f_arg_asgn: f_norm_arg
  2579. {
  2580. $$ = $1;
  2581. }
  2582. f_arg_item: f_arg_asgn
  2583. {
  2584. $$ = driver.build.arg(self, $1);
  2585. }
  2586. | tLPAREN f_margs rparen
  2587. {
  2588. $$ = driver.build.multi_lhs(self, $1, $2, $3);
  2589. }
  2590. f_arg: f_arg_item
  2591. {
  2592. $$ = driver.alloc.node_list($1);
  2593. }
  2594. | f_arg tCOMMA f_arg_item
  2595. {
  2596. auto &list = $1;
  2597. list->emplace_back($3);
  2598. $$ = list;
  2599. }
  2600. f_label: tLABEL
  2601. {
  2602. auto label = $1;
  2603. if (!driver.valid_kwarg_name(label)) {
  2604. driver.diagnostics.emplace_back(dlevel::ERROR, dclass::ArgumentConst, label);
  2605. YYERROR;
  2606. }
  2607. driver.lex.declare(label->string());
  2608. $$ = label;
  2609. }
  2610. f_kw: f_label arg_value
  2611. {
  2612. $$ = driver.build.kwoptarg(self, $1, $2);
  2613. }
  2614. | f_label
  2615. {
  2616. $$ = driver.build.kwarg(self, $1);
  2617. }
  2618. f_block_kw: f_label primary_value
  2619. {
  2620. $$ = driver.build.kwoptarg(self, $1, $2);
  2621. }
  2622. | f_label
  2623. {
  2624. $$ = driver.build.kwarg(self, $1);
  2625. }
  2626. f_block_kwarg: f_block_kw
  2627. {
  2628. $$ = driver.alloc.node_list($1);
  2629. }
  2630. | f_block_kwarg tCOMMA f_block_kw
  2631. {
  2632. auto &list = $1;
  2633. list->emplace_back($3);
  2634. $$ = list;
  2635. }
  2636. f_kwarg: f_kw
  2637. {
  2638. $$ = driver.alloc.node_list($1);
  2639. }
  2640. | f_kwarg tCOMMA f_kw
  2641. {
  2642. auto &list = $1;
  2643. list->emplace_back($3);
  2644. $$ = list;
  2645. }
  2646. kwrest_mark: tPOW | tDSTAR
  2647. f_kwrest: kwrest_mark tIDENTIFIER
  2648. {
  2649. auto ident = $2;
  2650. driver.lex.declare(ident->string());
  2651. auto kwrestarg = driver.build.kwrestarg(self, $1, ident);
  2652. $$ = driver.alloc.node_list(kwrestarg);
  2653. }
  2654. | kwrest_mark
  2655. {
  2656. auto kwrestarg = driver.build.kwrestarg(self, $1, nullptr);
  2657. $$ = driver.alloc.node_list(kwrestarg);
  2658. }
  2659. f_opt: f_arg_asgn tEQL arg_value
  2660. {
  2661. $$ = driver.build.optarg(self, $1, $2, $3);
  2662. }
  2663. f_block_opt: f_arg_asgn tEQL primary_value
  2664. {
  2665. $$ = driver.build.optarg(self, $1, $2, $3);
  2666. }
  2667. f_block_optarg: f_block_opt
  2668. {
  2669. $$ = driver.alloc.node_list($1);
  2670. }
  2671. | f_block_optarg tCOMMA f_block_opt
  2672. {
  2673. auto &list = $1;
  2674. list->emplace_back($3);
  2675. $$ = list;
  2676. }
  2677. f_optarg: f_opt
  2678. {
  2679. $$ = driver.alloc.node_list($1);
  2680. }
  2681. | f_optarg tCOMMA f_opt
  2682. {
  2683. auto &list = $1;
  2684. list->emplace_back($3);
  2685. $$ = list;
  2686. }
  2687. restarg_mark: tSTAR2 | tSTAR
  2688. f_rest_arg: restarg_mark tIDENTIFIER
  2689. {
  2690. auto ident = $2;
  2691. driver.lex.declare(ident->string());
  2692. auto restarg = driver.build.restarg(self, $1, ident);
  2693. $$ = driver.alloc.node_list(restarg);
  2694. }
  2695. | restarg_mark
  2696. {
  2697. auto restarg = driver.build.restarg(self, $1, nullptr);
  2698. $$ = driver.alloc.node_list(restarg);
  2699. }
  2700. blkarg_mark: tAMPER2 | tAMPER
  2701. f_block_arg: blkarg_mark tIDENTIFIER
  2702. {
  2703. auto ident = $2;
  2704. driver.lex.declare(ident->string());
  2705. auto blockarg = driver.build.blockarg(self, $1, ident);
  2706. $$ = driver.alloc.node_list(blockarg);
  2707. }
  2708. opt_f_block_arg: tCOMMA f_block_arg
  2709. {
  2710. $$ = $2;
  2711. }
  2712. |
  2713. {
  2714. $$ = driver.alloc.node_list();
  2715. }
  2716. singleton: var_ref
  2717. | tLPAREN2 expr rparen
  2718. {
  2719. $$ = $2;
  2720. }
  2721. assoc_list: // nothing
  2722. {
  2723. $$ = driver.alloc.node_list();
  2724. }
  2725. | assocs trailer
  2726. assocs: assoc
  2727. {
  2728. $$ = driver.alloc.node_list($1);
  2729. }
  2730. | assocs tCOMMA assoc
  2731. {
  2732. auto &list = $1;
  2733. list->emplace_back($3);
  2734. $$ = list;
  2735. }
  2736. assoc: arg_value tASSOC arg_value
  2737. {
  2738. $$ = driver.build.pair(self, $1, $2, $3);
  2739. }
  2740. | tLABEL arg_value
  2741. {
  2742. $$ = driver.build.pair_keyword(self, $1, $2);
  2743. }
  2744. | tSTRING_BEG string_contents tLABEL_END arg_value
  2745. {
  2746. $$ = driver.build.pair_quoted(self, $1, $2, $3, $4);
  2747. }
  2748. | tDSTAR arg_value
  2749. {
  2750. $$ = driver.build.kwsplat(self, $1, $2);
  2751. }
  2752. operation: tIDENTIFIER | tCONSTANT | tFID
  2753. operation2: tIDENTIFIER | tCONSTANT | tFID | op
  2754. operation3: tIDENTIFIER | tFID | op
  2755. dot_or_colon: call_op | tCOLON2
  2756. call_op: tDOT
  2757. {
  2758. // XXX what is this???
  2759. // $$ = put(p, [:dot, $1[1]]
  2760. // whitequark/parser doesn't check
  2761. // raw source of the token,
  2762. // so :dot/:anddot works as a flag.
  2763. $$ = $1;
  2764. }
  2765. | tANDDOT
  2766. {
  2767. // XXX what is this???
  2768. // $$ = [:anddot, $1[1]]
  2769. $$ = $1;
  2770. }
  2771. opt_terms: | terms
  2772. opt_nl: | tNL
  2773. rparen: opt_nl tRPAREN
  2774. {
  2775. $$ = $2;
  2776. }
  2777. rbracket: opt_nl tRBRACK
  2778. {
  2779. $$ = $2;
  2780. }
  2781. trailer: | tNL | tCOMMA
  2782. term: tSEMI
  2783. {
  2784. yyerrok;
  2785. }
  2786. | tNL
  2787. terms: term
  2788. | terms tSEMI
  2789. none: // nothing
  2790. {
  2791. $$ = nullptr;
  2792. }
  2793. list_none: // nothing
  2794. {
  2795. $$ = nullptr;
  2796. }
  2797. %%