CMDgram.y 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. %{
  2. // bison --defines=cmdgram.h --verbose -o cmdgram.cpp -p CMD CMDgram.y
  3. // Make sure we don't get gram.h twice.
  4. #define _CMDGRAM_H_
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include "console/console.h"
  8. #include "console/compiler.h"
  9. #include "console/consoleInternal.h"
  10. #include "core/strings/stringFunctions.h"
  11. #ifndef YYDEBUG
  12. #define YYDEBUG 0
  13. #endif
  14. #define YYSSIZE 350
  15. int outtext(char *fmt, ...);
  16. extern int serrors;
  17. #define nil 0
  18. #undef YY_ARGS
  19. #define YY_ARGS(x) x
  20. int CMDlex();
  21. void CMDerror(char *, ...);
  22. #ifdef alloca
  23. #undef alloca
  24. #endif
  25. #define alloca dMalloc
  26. template< typename T >
  27. struct Token
  28. {
  29. T value;
  30. U32 lineNumber;
  31. };
  32. %}
  33. %{
  34. /* Reserved Word Definitions */
  35. %}
  36. %token <i> rwDEFINE rwENDDEF rwDECLARE rwDECLARESINGLETON
  37. %token <i> rwBREAK rwELSE rwCONTINUE rwGLOBAL
  38. %token <i> rwIF rwNIL rwRETURN rwWHILE rwDO
  39. %token <i> rwENDIF rwENDWHILE rwENDFOR rwDEFAULT
  40. %token <i> rwFOR rwFOREACH rwFOREACHSTR rwIN rwDATABLOCK rwSWITCH rwCASE rwSWITCHSTR
  41. %token <i> rwCASEOR rwPACKAGE rwNAMESPACE rwCLASS
  42. %token <i> rwASSERT
  43. %token ILLEGAL_TOKEN
  44. %{
  45. /* Constants and Identifier Definitions */
  46. %}
  47. %token <c> CHRCONST
  48. %token <i> INTCONST
  49. %token <s> TTAG
  50. %token <s> VAR
  51. %token <s> IDENT
  52. %token <i> TYPEIDENT
  53. %token <str> DOCBLOCK
  54. %token <str> STRATOM
  55. %token <str> TAGATOM
  56. %token <f> FLTCONST
  57. %{
  58. /* Operator Definitions */
  59. %}
  60. %token <i> '+' '-' '*' '/' '<' '>' '=' '.' '|' '&' '%'
  61. %token <i> '(' ')' ',' ':' ';' '{' '}' '^' '~' '!' '@'
  62. %token <i> opINTNAME opINTNAMER
  63. %token <i> opMINUSMINUS opPLUSPLUS
  64. %token <i> STMT_SEP
  65. %token <i> opSHL opSHR opPLASN opMIASN opMLASN opDVASN opMODASN opANDASN
  66. %token <i> opXORASN opORASN opSLASN opSRASN opCAT
  67. %token <i> opEQ opNE opGE opLE opAND opOR opSTREQ
  68. %token <i> opCOLONCOLON
  69. %union {
  70. Token< char > c;
  71. Token< int > i;
  72. Token< const char* > s;
  73. Token< char* > str;
  74. Token< double > f;
  75. StmtNode* stmt;
  76. ExprNode* expr;
  77. SlotAssignNode* slist;
  78. VarNode* var;
  79. SlotDecl slot;
  80. InternalSlotDecl intslot;
  81. ObjectBlockDecl odcl;
  82. ObjectDeclNode* od;
  83. AssignDecl asn;
  84. IfStmtNode* ifnode;
  85. }
  86. %type <s> parent_block
  87. %type <ifnode> case_block
  88. %type <stmt> switch_stmt
  89. %type <stmt> decl
  90. %type <stmt> decl_list
  91. %type <stmt> package_decl
  92. %type <stmt> fn_decl_stmt
  93. %type <stmt> fn_decl_list
  94. %type <stmt> statement_list
  95. %type <stmt> stmt
  96. %type <expr> expr_list
  97. %type <expr> expr_list_decl
  98. %type <expr> aidx_expr
  99. %type <expr> funcall_expr
  100. %type <expr> assert_expr
  101. %type <expr> object_name
  102. %type <expr> object_args
  103. %type <expr> stmt_expr
  104. %type <expr> case_expr
  105. %type <expr> class_name_expr
  106. %type <stmt> if_stmt
  107. %type <stmt> while_stmt
  108. %type <stmt> for_stmt
  109. %type <stmt> foreach_stmt
  110. %type <stmt> stmt_block
  111. %type <stmt> datablock_decl
  112. %type <od> object_decl
  113. %type <od> object_decl_list
  114. %type <odcl> object_declare_block
  115. %type <expr> expr
  116. %type <slist> slot_assign_list_opt
  117. %type <slist> slot_assign_list
  118. %type <slist> slot_assign
  119. %type <slot> slot_acc
  120. %type <intslot> intslot_acc
  121. %type <stmt> expression_stmt
  122. %type <var> var_list
  123. %type <var> var_list_decl
  124. %type <asn> assign_op_struct
  125. %left '['
  126. %right opMODASN opANDASN opXORASN opPLASN opMIASN opMLASN opDVASN opMDASN opNDASN opNTASN opORASN opSLASN opSRASN '='
  127. %left '?' ':'
  128. %left opOR
  129. %left opAND
  130. %left '|'
  131. %left '^'
  132. %left '&'
  133. %left opEQ opNE
  134. %left '<' opLE '>' opGE
  135. %left '@' opCAT opSTREQ opSTRNE
  136. %left opSHL opSHR
  137. %left '+' '-'
  138. %left '*' '/' '%'
  139. %right '!' '~' opPLUSPLUS opMINUSMINUS UNARY
  140. %left '.'
  141. %left opINTNAME opINTNAMER
  142. %%
  143. start
  144. : decl_list
  145. { }
  146. ;
  147. decl_list
  148. :
  149. { $$ = nil; }
  150. | decl_list decl
  151. { if(!gStatementList) { gStatementList = $2; } else { gStatementList->append($2); } }
  152. ;
  153. decl
  154. : stmt
  155. { $$ = $1; }
  156. | fn_decl_stmt
  157. { $$ = $1; }
  158. | package_decl
  159. { $$ = $1; }
  160. ;
  161. package_decl
  162. : rwPACKAGE IDENT '{' fn_decl_list '}' ';'
  163. { $$ = $4; for(StmtNode *walk = ($4);walk;walk = walk->getNext() ) walk->setPackage($2.value); }
  164. ;
  165. fn_decl_list
  166. : fn_decl_stmt
  167. { $$ = $1; }
  168. | fn_decl_list fn_decl_stmt
  169. { $$ = $1; ($1)->append($2); }
  170. ;
  171. statement_list
  172. :
  173. { $$ = nil; }
  174. | statement_list stmt
  175. { if(!$1) { $$ = $2; } else { ($1)->append($2); $$ = $1; } }
  176. ;
  177. stmt
  178. : if_stmt
  179. | while_stmt
  180. | for_stmt
  181. | foreach_stmt
  182. | datablock_decl
  183. | switch_stmt
  184. | rwBREAK ';'
  185. { $$ = BreakStmtNode::alloc( $1.lineNumber ); }
  186. | rwCONTINUE ';'
  187. { $$ = ContinueStmtNode::alloc( $1.lineNumber ); }
  188. | rwRETURN ';'
  189. { $$ = ReturnStmtNode::alloc( $1.lineNumber, NULL ); }
  190. | rwRETURN expr ';'
  191. { $$ = ReturnStmtNode::alloc( $1.lineNumber, $2 ); }
  192. | expression_stmt ';'
  193. { $$ = $1; }
  194. | TTAG '=' expr ';'
  195. { $$ = TTagSetStmtNode::alloc( $1.lineNumber, $1.value, $3, NULL ); }
  196. | TTAG '=' expr ',' expr ';'
  197. { $$ = TTagSetStmtNode::alloc( $1.lineNumber, $1.value, $3, $5 ); }
  198. | DOCBLOCK
  199. { $$ = StrConstNode::alloc( $1.lineNumber, $1.value, false, true ); }
  200. ;
  201. fn_decl_stmt
  202. : rwDEFINE IDENT '(' var_list_decl ')' '{' statement_list '}'
  203. { $$ = FunctionDeclStmtNode::alloc( $1.lineNumber, $2.value, NULL, $4, $7 ); }
  204. | rwDEFINE IDENT opCOLONCOLON IDENT '(' var_list_decl ')' '{' statement_list '}'
  205. { $$ = FunctionDeclStmtNode::alloc( $1.lineNumber, $4.value, $2.value, $6, $9 ); }
  206. ;
  207. var_list_decl
  208. :
  209. { $$ = NULL; }
  210. | var_list
  211. { $$ = $1; }
  212. ;
  213. var_list
  214. : VAR
  215. { $$ = VarNode::alloc( $1.lineNumber, $1.value, NULL ); }
  216. | var_list ',' VAR
  217. { $$ = $1; ((StmtNode*)($1))->append((StmtNode*)VarNode::alloc( $3.lineNumber, $3.value, NULL ) ); }
  218. ;
  219. datablock_decl
  220. : rwDATABLOCK class_name_expr '(' expr parent_block ')' '{' slot_assign_list_opt '}' ';'
  221. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $4, NULL, $5.value, $8, NULL, true, false, false); }
  222. ;
  223. object_decl
  224. : rwDECLARE class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}'
  225. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $4, $6, $5.value, $9.slots, $9.decls, false, false, false); }
  226. | rwDECLARE class_name_expr '(' object_name parent_block object_args ')'
  227. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $4, $6, $5.value, NULL, NULL, false, false, false); }
  228. | rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' '{' object_declare_block '}'
  229. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $5, $8, $7.value, $11.slots, $11.decls, false, true, false); }
  230. | rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')'
  231. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $5, $8, $7.value, NULL, NULL, false, true, false); }
  232. | rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}'
  233. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $4, $6, $5.value, $9.slots, $9.decls, false, false, true); }
  234. | rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')'
  235. { $$ = ObjectDeclNode::alloc( $1.lineNumber, $2, $4, $6, $5.value, NULL, NULL, false, false, true); }
  236. ;
  237. parent_block
  238. :
  239. { $$.value = NULL; }
  240. | ':' IDENT
  241. { $$ = $2; }
  242. ;
  243. object_name
  244. :
  245. { $$ = StrConstNode::alloc( CodeBlock::smCurrentParser->getCurrentLine(), "", false); }
  246. | expr
  247. { $$ = $1; }
  248. ;
  249. object_args
  250. :
  251. { $$ = NULL; }
  252. | ',' expr_list
  253. { $$ = $2; }
  254. ;
  255. object_declare_block
  256. :
  257. { $$.slots = NULL; $$.decls = NULL; }
  258. | slot_assign_list
  259. { $$.slots = $1; $$.decls = NULL; }
  260. | object_decl_list
  261. { $$.slots = NULL; $$.decls = $1; }
  262. | slot_assign_list object_decl_list
  263. { $$.slots = $1; $$.decls = $2; }
  264. ;
  265. object_decl_list
  266. : object_decl ';'
  267. { $$ = $1; }
  268. | object_decl_list object_decl ';'
  269. { $1->append($2); $$ = $1; }
  270. ;
  271. stmt_block
  272. : '{' statement_list '}'
  273. { $$ = $2; }
  274. | stmt
  275. { $$ = $1; }
  276. ;
  277. switch_stmt
  278. : rwSWITCH '(' expr ')' '{' case_block '}'
  279. { $$ = $6; $6->propagateSwitchExpr($3, false); }
  280. | rwSWITCHSTR '(' expr ')' '{' case_block '}'
  281. { $$ = $6; $6->propagateSwitchExpr($3, true); }
  282. ;
  283. case_block
  284. : rwCASE case_expr ':' statement_list
  285. { $$ = IfStmtNode::alloc( $1.lineNumber, $2, $4, NULL, false); }
  286. | rwCASE case_expr ':' statement_list rwDEFAULT ':' statement_list
  287. { $$ = IfStmtNode::alloc( $1.lineNumber, $2, $4, $7, false); }
  288. | rwCASE case_expr ':' statement_list case_block
  289. { $$ = IfStmtNode::alloc( $1.lineNumber, $2, $4, $5, true); }
  290. ;
  291. case_expr
  292. : expr
  293. { $$ = $1;}
  294. | case_expr rwCASEOR expr
  295. { ($1)->append($3); $$=$1; }
  296. ;
  297. if_stmt
  298. : rwIF '(' expr ')' stmt_block
  299. { $$ = IfStmtNode::alloc($1.lineNumber, $3, $5, NULL, false); }
  300. | rwIF '(' expr ')' stmt_block rwELSE stmt_block
  301. { $$ = IfStmtNode::alloc($1.lineNumber, $3, $5, $7, false); }
  302. ;
  303. while_stmt
  304. : rwWHILE '(' expr ')' stmt_block
  305. { $$ = LoopStmtNode::alloc($1.lineNumber, nil, $3, nil, $5, false); }
  306. | rwDO stmt_block rwWHILE '(' expr ')'
  307. { $$ = LoopStmtNode::alloc($3.lineNumber, nil, $5, nil, $2, true); }
  308. ;
  309. for_stmt
  310. : rwFOR '(' expr ';' expr ';' expr ')' stmt_block
  311. { $$ = LoopStmtNode::alloc($1.lineNumber, $3, $5, $7, $9, false); }
  312. | rwFOR '(' expr ';' expr ';' ')' stmt_block
  313. { $$ = LoopStmtNode::alloc($1.lineNumber, $3, $5, NULL, $8, false); }
  314. | rwFOR '(' expr ';' ';' expr ')' stmt_block
  315. { $$ = LoopStmtNode::alloc($1.lineNumber, $3, NULL, $6, $8, false); }
  316. | rwFOR '(' expr ';' ';' ')' stmt_block
  317. { $$ = LoopStmtNode::alloc($1.lineNumber, $3, NULL, NULL, $7, false); }
  318. | rwFOR '(' ';' expr ';' expr ')' stmt_block
  319. { $$ = LoopStmtNode::alloc($1.lineNumber, NULL, $4, $6, $8, false); }
  320. | rwFOR '(' ';' expr ';' ')' stmt_block
  321. { $$ = LoopStmtNode::alloc($1.lineNumber, NULL, $4, NULL, $7, false); }
  322. | rwFOR '(' ';' ';' expr ')' stmt_block
  323. { $$ = LoopStmtNode::alloc($1.lineNumber, NULL, NULL, $5, $7, false); }
  324. | rwFOR '(' ';' ';' ')' stmt_block
  325. { $$ = LoopStmtNode::alloc($1.lineNumber, NULL, NULL, NULL, $6, false); }
  326. ;
  327. foreach_stmt
  328. : rwFOREACH '(' VAR rwIN expr ')' stmt_block
  329. { $$ = IterStmtNode::alloc( $1.lineNumber, $3.value, $5, $7, false ); }
  330. | rwFOREACHSTR '(' VAR rwIN expr ')' stmt_block
  331. { $$ = IterStmtNode::alloc( $1.lineNumber, $3.value, $5, $7, true ); }
  332. ;
  333. expression_stmt
  334. : stmt_expr
  335. { $$ = $1; }
  336. ;
  337. expr
  338. : stmt_expr
  339. { $$ = $1; }
  340. | '(' expr ')'
  341. { $$ = $2; }
  342. | expr '^' expr
  343. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  344. | expr '%' expr
  345. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  346. | expr '&' expr
  347. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  348. | expr '|' expr
  349. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  350. | expr '+' expr
  351. { $$ = FloatBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  352. | expr '-' expr
  353. { $$ = FloatBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  354. | expr '*' expr
  355. { $$ = FloatBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  356. | expr '/' expr
  357. { $$ = FloatBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  358. | '-' expr %prec UNARY
  359. { $$ = FloatUnaryExprNode::alloc( $1.lineNumber, $1.value, $2); }
  360. | '*' expr %prec UNARY
  361. { $$ = TTagDerefNode::alloc( $1.lineNumber, $2 ); }
  362. | TTAG
  363. { $$ = TTagExprNode::alloc( $1.lineNumber, $1.value ); }
  364. | expr '?' expr ':' expr
  365. { $$ = ConditionalExprNode::alloc( $1->dbgLineNumber, $1, $3, $5); }
  366. | expr '<' expr
  367. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  368. | expr '>' expr
  369. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  370. | expr opGE expr
  371. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  372. | expr opLE expr
  373. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  374. | expr opEQ expr
  375. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  376. | expr opNE expr
  377. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  378. | expr opOR expr
  379. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  380. | expr opSHL expr
  381. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  382. | expr opSHR expr
  383. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  384. | expr opAND expr
  385. { $$ = IntBinaryExprNode::alloc( $1->dbgLineNumber, $2.value, $1, $3); }
  386. | expr opSTREQ expr
  387. { $$ = StreqExprNode::alloc( $1->dbgLineNumber, $1, $3, true); }
  388. | expr opSTRNE expr
  389. { $$ = StreqExprNode::alloc( $1->dbgLineNumber, $1, $3, false); }
  390. | expr '@' expr
  391. { $$ = StrcatExprNode::alloc( $1->dbgLineNumber, $1, $3, $2.value); }
  392. | '!' expr
  393. { $$ = IntUnaryExprNode::alloc($1.lineNumber, $1.value, $2); }
  394. | '~' expr
  395. { $$ = IntUnaryExprNode::alloc($1.lineNumber, $1.value, $2); }
  396. | TAGATOM
  397. { $$ = StrConstNode::alloc( $1.lineNumber, $1.value, true); }
  398. | FLTCONST
  399. { $$ = FloatNode::alloc( $1.lineNumber, $1.value ); }
  400. | INTCONST
  401. { $$ = IntNode::alloc( $1.lineNumber, $1.value ); }
  402. | rwBREAK
  403. { $$ = ConstantNode::alloc( $1.lineNumber, StringTable->insert("break")); }
  404. | slot_acc
  405. { $$ = SlotAccessNode::alloc( $1.lineNumber, $1.object, $1.array, $1.slotName ); }
  406. | intslot_acc
  407. { $$ = InternalSlotAccessNode::alloc( $1.lineNumber, $1.object, $1.slotExpr, $1.recurse); }
  408. | IDENT
  409. { $$ = ConstantNode::alloc( $1.lineNumber, $1.value ); }
  410. | STRATOM
  411. { $$ = StrConstNode::alloc( $1.lineNumber, $1.value, false); }
  412. | VAR
  413. { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, NULL); }
  414. | VAR '[' aidx_expr ']'
  415. { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); }
  416. ;
  417. /*
  418. | rwDEFINE '(' var_list_decl ')' '{' statement_list '}'
  419. {
  420. const U32 bufLen = 64;
  421. UTF8 buffer[bufLen];
  422. dSprintf(buffer, bufLen, "__anonymous_function%d", gAnonFunctionID++);
  423. StringTableEntry fName = StringTable->insert(buffer);
  424. StmtNode *fndef = FunctionDeclStmtNode::alloc($1.lineNumber, fName, NULL, $3, $6);
  425. if(!gAnonFunctionList)
  426. gAnonFunctionList = fndef;
  427. else
  428. gAnonFunctionList->append(fndef);
  429. $$ = StrConstNode::alloc( $1.lineNumber, (UTF8*)fName, false );
  430. }
  431. */
  432. slot_acc
  433. : expr '.' IDENT
  434. { $$.lineNumber = $1->dbgLineNumber; $$.object = $1; $$.slotName = $3.value; $$.array = NULL; }
  435. | expr '.' IDENT '[' aidx_expr ']'
  436. { $$.lineNumber = $1->dbgLineNumber; $$.object = $1; $$.slotName = $3.value; $$.array = $5; }
  437. ;
  438. intslot_acc
  439. : expr opINTNAME class_name_expr
  440. { $$.lineNumber = $1->dbgLineNumber; $$.object = $1; $$.slotExpr = $3; $$.recurse = false; }
  441. | expr opINTNAMER class_name_expr
  442. { $$.lineNumber = $1->dbgLineNumber; $$.object = $1; $$.slotExpr = $3; $$.recurse = true; }
  443. ;
  444. class_name_expr
  445. : IDENT
  446. { $$ = ConstantNode::alloc( $1.lineNumber, $1.value ); }
  447. | '(' expr ')'
  448. { $$ = $2; }
  449. ;
  450. assign_op_struct
  451. : opPLUSPLUS
  452. { $$.lineNumber = $1.lineNumber; $$.token = opPLUSPLUS; $$.expr = FloatNode::alloc( $1.lineNumber, 1 ); }
  453. | opMINUSMINUS
  454. { $$.lineNumber = $1.lineNumber; $$.token = opMINUSMINUS; $$.expr = FloatNode::alloc( $1.lineNumber, 1 ); }
  455. | opPLASN expr
  456. { $$.lineNumber = $1.lineNumber; $$.token = '+'; $$.expr = $2; }
  457. | opMIASN expr
  458. { $$.lineNumber = $1.lineNumber; $$.token = '-'; $$.expr = $2; }
  459. | opMLASN expr
  460. { $$.lineNumber = $1.lineNumber; $$.token = '*'; $$.expr = $2; }
  461. | opDVASN expr
  462. { $$.lineNumber = $1.lineNumber; $$.token = '/'; $$.expr = $2; }
  463. | opMODASN expr
  464. { $$.lineNumber = $1.lineNumber; $$.token = '%'; $$.expr = $2; }
  465. | opANDASN expr
  466. { $$.lineNumber = $1.lineNumber; $$.token = '&'; $$.expr = $2; }
  467. | opXORASN expr
  468. { $$.lineNumber = $1.lineNumber; $$.token = '^'; $$.expr = $2; }
  469. | opORASN expr
  470. { $$.lineNumber = $1.lineNumber; $$.token = '|'; $$.expr = $2; }
  471. | opSLASN expr
  472. { $$.lineNumber = $1.lineNumber; $$.token = opSHL; $$.expr = $2; }
  473. | opSRASN expr
  474. { $$.lineNumber = $1.lineNumber; $$.token = opSHR; $$.expr = $2; }
  475. ;
  476. stmt_expr
  477. : funcall_expr
  478. { $$ = $1; }
  479. | assert_expr
  480. { $$ = $1; }
  481. | object_decl
  482. { $$ = $1; }
  483. | VAR '=' expr
  484. { $$ = AssignExprNode::alloc( $1.lineNumber, $1.value, NULL, $3); }
  485. | VAR '[' aidx_expr ']' '=' expr
  486. { $$ = AssignExprNode::alloc( $1.lineNumber, $1.value, $3, $6); }
  487. | VAR assign_op_struct
  488. { $$ = AssignOpExprNode::alloc( $1.lineNumber, $1.value, NULL, $2.expr, $2.token); }
  489. | VAR '[' aidx_expr ']' assign_op_struct
  490. { $$ = AssignOpExprNode::alloc( $1.lineNumber, $1.value, $3, $5.expr, $5.token); }
  491. | slot_acc assign_op_struct
  492. { $$ = SlotAssignOpNode::alloc( $1.lineNumber, $1.object, $1.slotName, $1.array, $2.token, $2.expr); }
  493. | slot_acc '=' expr
  494. { $$ = SlotAssignNode::alloc( $1.lineNumber, $1.object, $1.array, $1.slotName, $3); }
  495. | slot_acc '=' '{' expr_list '}'
  496. { $$ = SlotAssignNode::alloc( $1.lineNumber, $1.object, $1.array, $1.slotName, $4); }
  497. ;
  498. funcall_expr
  499. : IDENT '(' expr_list_decl ')'
  500. { $$ = FuncCallExprNode::alloc( $1.lineNumber, $1.value, NULL, $3, false); }
  501. | IDENT opCOLONCOLON IDENT '(' expr_list_decl ')'
  502. { $$ = FuncCallExprNode::alloc( $1.lineNumber, $3.value, $1.value, $5, false); }
  503. | expr '.' IDENT '(' expr_list_decl ')'
  504. { $1->append($5); $$ = FuncCallExprNode::alloc( $1->dbgLineNumber, $3.value, NULL, $1, true); }
  505. ;
  506. /*
  507. | expr '(' expr_list_decl ')'
  508. { $$ = FuncPointerCallExprNode::alloc( $1->dbgLineNumber, $1, $3); }
  509. ;
  510. */
  511. assert_expr
  512. : rwASSERT '(' expr ')'
  513. { $$ = AssertCallExprNode::alloc( $1.lineNumber, $3, NULL ); }
  514. | rwASSERT '(' expr ',' STRATOM ')'
  515. { $$ = AssertCallExprNode::alloc( $1.lineNumber, $3, $5.value ); }
  516. ;
  517. expr_list_decl
  518. :
  519. { $$ = NULL; }
  520. | expr_list
  521. { $$ = $1; }
  522. ;
  523. expr_list
  524. : expr
  525. { $$ = $1; }
  526. | expr_list ',' expr
  527. { ($1)->append($3); $$ = $1; }
  528. ;
  529. slot_assign_list_opt
  530. :
  531. { $$ = NULL; }
  532. | slot_assign_list
  533. { $$ = $1; }
  534. ;
  535. slot_assign_list
  536. : slot_assign
  537. { $$ = $1; }
  538. | slot_assign_list slot_assign
  539. { $1->append($2); $$ = $1; }
  540. ;
  541. slot_assign
  542. : IDENT '=' expr ';'
  543. { $$ = SlotAssignNode::alloc( $1.lineNumber, NULL, NULL, $1.value, $3); }
  544. | TYPEIDENT IDENT '=' expr ';'
  545. { $$ = SlotAssignNode::alloc( $1.lineNumber, NULL, NULL, $2.value, $4, $1.value); }
  546. | rwDATABLOCK '=' expr ';'
  547. { $$ = SlotAssignNode::alloc( $1.lineNumber, NULL, NULL, StringTable->insert("datablock"), $3); }
  548. | IDENT '[' aidx_expr ']' '=' expr ';'
  549. { $$ = SlotAssignNode::alloc( $1.lineNumber, NULL, $3, $1.value, $6); }
  550. | TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';'
  551. { $$ = SlotAssignNode::alloc( $1.lineNumber, NULL, $4, $2.value, $7, $1.value); }
  552. ;
  553. aidx_expr
  554. : expr
  555. { $$ = $1; }
  556. | aidx_expr ',' expr
  557. { $$ = CommaCatExprNode::alloc( $1->dbgLineNumber, $1, $3); }
  558. ;
  559. %%