File indexing completed on 2024-05-19 08:27:45
0001 // THIS FILE IS GENERATED 0002 // WARNING! All changes made in this file will be lost! 0003 0004 #include "cool_parser.h" 0005 0006 0007 #include "cool_lexer.h" 0008 0009 0010 namespace cool 0011 { 0012 0013 void parser::tokenize( char *contents ) 0014 { 0015 Lexer lexer( this, contents ); 0016 0017 int kind = parser::Token_EOF; 0018 do 0019 { 0020 kind = lexer.yylex(); 0021 //std::cerr << lexer.YYText() << std::endl; //" "; // debug output 0022 0023 if ( !kind ) // when the lexer returns 0, the end of file is reached 0024 kind = parser::Token_EOF; 0025 0026 parser::token_type &t = this->token_stream->next(); 0027 t.kind = kind; 0028 t.begin = lexer.tokenBegin(); 0029 t.end = lexer.tokenEnd(); 0030 t.text = contents; 0031 } 0032 while ( kind != parser::Token_EOF ); 0033 0034 this->yylex(); // produce the look ahead token 0035 } 0036 0037 } // end of namespace cool 0038 0039 0040 namespace cool 0041 { 0042 0043 bool parser::parse_additive_expression(additive_expression_ast **yynode) 0044 { 0045 *yynode = create<additive_expression_ast>(); 0046 0047 (*yynode)->start_token = token_stream->index() - 1; 0048 0049 if (yytoken == Token_NEW 0050 || yytoken == Token_IF 0051 || yytoken == Token_WHILE 0052 || yytoken == Token_LET 0053 || yytoken == Token_CASE 0054 || yytoken == Token_LPAREN 0055 || yytoken == Token_LBRACE 0056 || yytoken == Token_TILDE 0057 || yytoken == Token_NOT 0058 || yytoken == Token_ISVOID 0059 || yytoken == Token_IDENTIFIER 0060 || yytoken == Token_INTEGER 0061 || yytoken == Token_STRING 0062 || yytoken == Token_TRUE 0063 || yytoken == Token_FALSE) 0064 { 0065 multiplicative_expression_ast *__node_0 = 0; 0066 if (!parse_multiplicative_expression(&__node_0)) 0067 { 0068 yy_expected_symbol(ast_node::Kind_multiplicative_expression, "multiplicative_expression"); 0069 return false; 0070 } 0071 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_0, memory_pool); 0072 0073 while (yytoken == Token_PLUS 0074 || yytoken == Token_MINUS) 0075 { 0076 if (yytoken == Token_PLUS) 0077 { 0078 if (yytoken != Token_PLUS) 0079 { 0080 yy_expected_token(yytoken, Token_PLUS, "+"); 0081 return false; 0082 } 0083 (*yynode)->op = token_stream->index() - 1; 0084 yylex(); 0085 0086 } 0087 else if (yytoken == Token_MINUS) 0088 { 0089 if (yytoken != Token_MINUS) 0090 { 0091 yy_expected_token(yytoken, Token_MINUS, "-"); 0092 return false; 0093 } 0094 (*yynode)->op = token_stream->index() - 1; 0095 yylex(); 0096 0097 } 0098 else 0099 { 0100 return false; 0101 } 0102 multiplicative_expression_ast *__node_1 = 0; 0103 if (!parse_multiplicative_expression(&__node_1)) 0104 { 0105 yy_expected_symbol(ast_node::Kind_multiplicative_expression, "multiplicative_expression"); 0106 return false; 0107 } 0108 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_1, memory_pool); 0109 0110 } 0111 } 0112 else 0113 { 0114 return false; 0115 } 0116 0117 (*yynode)->end_token = token_stream->index() - 1; 0118 0119 return true; 0120 } 0121 0122 bool parser::parse_block_expression(block_expression_ast **yynode) 0123 { 0124 *yynode = create<block_expression_ast>(); 0125 0126 (*yynode)->start_token = token_stream->index() - 1; 0127 0128 if (yytoken == Token_LBRACE) 0129 { 0130 if (yytoken != Token_LBRACE) 0131 { 0132 yy_expected_token(yytoken, Token_LBRACE, "{"); 0133 return false; 0134 } 0135 yylex(); 0136 0137 while (yytoken == Token_NEW 0138 || yytoken == Token_IF 0139 || yytoken == Token_WHILE 0140 || yytoken == Token_LET 0141 || yytoken == Token_CASE 0142 || yytoken == Token_LPAREN 0143 || yytoken == Token_LBRACE 0144 || yytoken == Token_TILDE 0145 || yytoken == Token_NOT 0146 || yytoken == Token_ISVOID 0147 || yytoken == Token_IDENTIFIER 0148 || yytoken == Token_INTEGER 0149 || yytoken == Token_STRING 0150 || yytoken == Token_TRUE 0151 || yytoken == Token_FALSE) 0152 { 0153 expression_ast *__node_2 = 0; 0154 if (!parse_expression(&__node_2)) 0155 { 0156 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0157 return false; 0158 } 0159 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_2, memory_pool); 0160 0161 if (yytoken != Token_SEMICOLON) 0162 { 0163 yy_expected_token(yytoken, Token_SEMICOLON, ";"); 0164 return false; 0165 } 0166 yylex(); 0167 0168 } 0169 if (yytoken != Token_RBRACE) 0170 { 0171 yy_expected_token(yytoken, Token_RBRACE, "}"); 0172 return false; 0173 } 0174 yylex(); 0175 0176 } 0177 else 0178 { 0179 return false; 0180 } 0181 0182 (*yynode)->end_token = token_stream->index() - 1; 0183 0184 return true; 0185 } 0186 0187 bool parser::parse_case_condition(case_condition_ast **yynode) 0188 { 0189 *yynode = create<case_condition_ast>(); 0190 0191 (*yynode)->start_token = token_stream->index() - 1; 0192 0193 if (yytoken == Token_IDENTIFIER) 0194 { 0195 if (yytoken != Token_IDENTIFIER) 0196 { 0197 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 0198 return false; 0199 } 0200 (*yynode)->name = token_stream->index() - 1; 0201 yylex(); 0202 0203 if (yytoken != Token_COLON) 0204 { 0205 yy_expected_token(yytoken, Token_COLON, ":"); 0206 return false; 0207 } 0208 yylex(); 0209 0210 if (yytoken != Token_TYPE) 0211 { 0212 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0213 return false; 0214 } 0215 (*yynode)->type = token_stream->index() - 1; 0216 yylex(); 0217 0218 if (yytoken != Token_ARROW_RIGHT) 0219 { 0220 yy_expected_token(yytoken, Token_ARROW_RIGHT, "=>"); 0221 return false; 0222 } 0223 yylex(); 0224 0225 expression_ast *__node_3 = 0; 0226 if (!parse_expression(&__node_3)) 0227 { 0228 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0229 return false; 0230 } 0231 (*yynode)->expression = __node_3; 0232 0233 } 0234 else 0235 { 0236 return false; 0237 } 0238 0239 (*yynode)->end_token = token_stream->index() - 1; 0240 0241 return true; 0242 } 0243 0244 bool parser::parse_case_expression(case_expression_ast **yynode) 0245 { 0246 *yynode = create<case_expression_ast>(); 0247 0248 (*yynode)->start_token = token_stream->index() - 1; 0249 0250 if (yytoken == Token_CASE) 0251 { 0252 if (yytoken != Token_CASE) 0253 { 0254 yy_expected_token(yytoken, Token_CASE, "case"); 0255 return false; 0256 } 0257 yylex(); 0258 0259 expression_ast *__node_4 = 0; 0260 if (!parse_expression(&__node_4)) 0261 { 0262 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0263 return false; 0264 } 0265 (*yynode)->expression = __node_4; 0266 0267 if (yytoken != Token_OF) 0268 { 0269 yy_expected_token(yytoken, Token_OF, "of"); 0270 return false; 0271 } 0272 yylex(); 0273 0274 while (yytoken == Token_IDENTIFIER) 0275 { 0276 case_condition_ast *__node_5 = 0; 0277 if (!parse_case_condition(&__node_5)) 0278 { 0279 yy_expected_symbol(ast_node::Kind_case_condition, "case_condition"); 0280 return false; 0281 } 0282 (*yynode)->condition_sequence = snoc((*yynode)->condition_sequence, __node_5, memory_pool); 0283 0284 if (yytoken != Token_SEMICOLON) 0285 { 0286 yy_expected_token(yytoken, Token_SEMICOLON, ";"); 0287 return false; 0288 } 0289 yylex(); 0290 0291 } 0292 if (yytoken != Token_ESAC) 0293 { 0294 yy_expected_token(yytoken, Token_ESAC, "esac"); 0295 return false; 0296 } 0297 yylex(); 0298 0299 } 0300 else 0301 { 0302 return false; 0303 } 0304 0305 (*yynode)->end_token = token_stream->index() - 1; 0306 0307 return true; 0308 } 0309 0310 bool parser::parse_class(class_ast **yynode) 0311 { 0312 *yynode = create<class_ast>(); 0313 0314 (*yynode)->start_token = token_stream->index() - 1; 0315 0316 if (yytoken == Token_CLASS) 0317 { 0318 if (yytoken != Token_CLASS) 0319 { 0320 yy_expected_token(yytoken, Token_CLASS, "class"); 0321 return false; 0322 } 0323 yylex(); 0324 0325 if (yytoken != Token_TYPE) 0326 { 0327 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0328 return false; 0329 } 0330 (*yynode)->type = token_stream->index() - 1; 0331 yylex(); 0332 0333 if (yytoken == Token_INHERITS) 0334 { 0335 if (yytoken != Token_INHERITS) 0336 { 0337 yy_expected_token(yytoken, Token_INHERITS, "inherits"); 0338 return false; 0339 } 0340 yylex(); 0341 0342 if (yytoken != Token_TYPE) 0343 { 0344 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0345 return false; 0346 } 0347 (*yynode)->base_type = token_stream->index() - 1; 0348 yylex(); 0349 0350 } 0351 else if (true /*epsilon*/) 0352 {} 0353 else 0354 { 0355 return false; 0356 } 0357 if (yytoken != Token_LBRACE) 0358 { 0359 yy_expected_token(yytoken, Token_LBRACE, "{"); 0360 return false; 0361 } 0362 yylex(); 0363 0364 while (yytoken == Token_IDENTIFIER) 0365 { 0366 feature_ast *__node_6 = 0; 0367 if (!parse_feature(&__node_6)) 0368 { 0369 yy_expected_symbol(ast_node::Kind_feature, "feature"); 0370 return false; 0371 } 0372 (*yynode)->feature_sequence = snoc((*yynode)->feature_sequence, __node_6, memory_pool); 0373 0374 if (yytoken != Token_SEMICOLON) 0375 { 0376 yy_expected_token(yytoken, Token_SEMICOLON, ";"); 0377 return false; 0378 } 0379 yylex(); 0380 0381 } 0382 if (yytoken != Token_RBRACE) 0383 { 0384 yy_expected_token(yytoken, Token_RBRACE, "}"); 0385 return false; 0386 } 0387 yylex(); 0388 0389 } 0390 else 0391 { 0392 return false; 0393 } 0394 0395 (*yynode)->end_token = token_stream->index() - 1; 0396 0397 return true; 0398 } 0399 0400 bool parser::parse_expression(expression_ast **yynode) 0401 { 0402 *yynode = create<expression_ast>(); 0403 0404 (*yynode)->start_token = token_stream->index() - 1; 0405 0406 if (yytoken == Token_NEW 0407 || yytoken == Token_IF 0408 || yytoken == Token_WHILE 0409 || yytoken == Token_LET 0410 || yytoken == Token_CASE 0411 || yytoken == Token_LPAREN 0412 || yytoken == Token_LBRACE 0413 || yytoken == Token_TILDE 0414 || yytoken == Token_NOT 0415 || yytoken == Token_ISVOID 0416 || yytoken == Token_IDENTIFIER 0417 || yytoken == Token_INTEGER 0418 || yytoken == Token_STRING 0419 || yytoken == Token_TRUE 0420 || yytoken == Token_FALSE) 0421 { 0422 relational_expression_ast *__node_7 = 0; 0423 if (!parse_relational_expression(&__node_7)) 0424 { 0425 yy_expected_symbol(ast_node::Kind_relational_expression, "relational_expression"); 0426 return false; 0427 } 0428 (*yynode)->expression = __node_7; 0429 0430 } 0431 else 0432 { 0433 return false; 0434 } 0435 0436 (*yynode)->end_token = token_stream->index() - 1; 0437 0438 return true; 0439 } 0440 0441 bool parser::parse_feature(feature_ast **yynode) 0442 { 0443 *yynode = create<feature_ast>(); 0444 0445 (*yynode)->start_token = token_stream->index() - 1; 0446 0447 if (yytoken == Token_IDENTIFIER) 0448 { 0449 if ((yytoken == Token_IDENTIFIER) && ( LA(2).kind == Token_LPAREN )) 0450 { 0451 if (yytoken != Token_IDENTIFIER) 0452 { 0453 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 0454 return false; 0455 } 0456 (*yynode)->name = token_stream->index() - 1; 0457 yylex(); 0458 0459 if (yytoken != Token_LPAREN) 0460 { 0461 yy_expected_token(yytoken, Token_LPAREN, "("); 0462 return false; 0463 } 0464 yylex(); 0465 0466 if (yytoken == Token_IDENTIFIER) 0467 { 0468 formal_ast *__node_8 = 0; 0469 if (!parse_formal(&__node_8)) 0470 { 0471 yy_expected_symbol(ast_node::Kind_formal, "formal"); 0472 return false; 0473 } 0474 (*yynode)->formal_sequence = snoc((*yynode)->formal_sequence, __node_8, memory_pool); 0475 0476 while (yytoken == Token_COMMA) 0477 { 0478 if (yytoken != Token_COMMA) 0479 { 0480 yy_expected_token(yytoken, Token_COMMA, ","); 0481 return false; 0482 } 0483 yylex(); 0484 0485 formal_ast *__node_9 = 0; 0486 if (!parse_formal(&__node_9)) 0487 { 0488 yy_expected_symbol(ast_node::Kind_formal, "formal"); 0489 return false; 0490 } 0491 (*yynode)->formal_sequence = snoc((*yynode)->formal_sequence, __node_9, memory_pool); 0492 0493 } 0494 } 0495 else if (true /*epsilon*/) 0496 {} 0497 else 0498 { 0499 return false; 0500 } 0501 if (yytoken != Token_RPAREN) 0502 { 0503 yy_expected_token(yytoken, Token_RPAREN, ")"); 0504 return false; 0505 } 0506 yylex(); 0507 0508 if (yytoken != Token_COLON) 0509 { 0510 yy_expected_token(yytoken, Token_COLON, ":"); 0511 return false; 0512 } 0513 yylex(); 0514 0515 if (yytoken != Token_TYPE) 0516 { 0517 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0518 return false; 0519 } 0520 (*yynode)->type = token_stream->index() - 1; 0521 yylex(); 0522 0523 if (yytoken != Token_LBRACE) 0524 { 0525 yy_expected_token(yytoken, Token_LBRACE, "{"); 0526 return false; 0527 } 0528 yylex(); 0529 0530 expression_ast *__node_10 = 0; 0531 if (!parse_expression(&__node_10)) 0532 { 0533 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0534 return false; 0535 } 0536 (*yynode)->expression = __node_10; 0537 0538 if (yytoken != Token_RBRACE) 0539 { 0540 yy_expected_token(yytoken, Token_RBRACE, "}"); 0541 return false; 0542 } 0543 yylex(); 0544 0545 } 0546 else if (yytoken == Token_IDENTIFIER) 0547 { 0548 if (yytoken != Token_IDENTIFIER) 0549 { 0550 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 0551 return false; 0552 } 0553 (*yynode)->name = token_stream->index() - 1; 0554 yylex(); 0555 0556 if (yytoken != Token_COLON) 0557 { 0558 yy_expected_token(yytoken, Token_COLON, ":"); 0559 return false; 0560 } 0561 yylex(); 0562 0563 if (yytoken != Token_TYPE) 0564 { 0565 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0566 return false; 0567 } 0568 (*yynode)->type = token_stream->index() - 1; 0569 yylex(); 0570 0571 if (yytoken == Token_ARROW_LEFT) 0572 { 0573 if (yytoken != Token_ARROW_LEFT) 0574 { 0575 yy_expected_token(yytoken, Token_ARROW_LEFT, "<-"); 0576 return false; 0577 } 0578 yylex(); 0579 0580 expression_ast *__node_11 = 0; 0581 if (!parse_expression(&__node_11)) 0582 { 0583 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0584 return false; 0585 } 0586 (*yynode)->expression = __node_11; 0587 0588 } 0589 else if (true /*epsilon*/) 0590 {} 0591 else 0592 { 0593 return false; 0594 } 0595 } 0596 else 0597 { 0598 return false; 0599 } 0600 } 0601 else 0602 { 0603 return false; 0604 } 0605 0606 (*yynode)->end_token = token_stream->index() - 1; 0607 0608 return true; 0609 } 0610 0611 bool parser::parse_formal(formal_ast **yynode) 0612 { 0613 *yynode = create<formal_ast>(); 0614 0615 (*yynode)->start_token = token_stream->index() - 1; 0616 0617 if (yytoken == Token_IDENTIFIER) 0618 { 0619 if (yytoken != Token_IDENTIFIER) 0620 { 0621 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 0622 return false; 0623 } 0624 (*yynode)->name = token_stream->index() - 1; 0625 yylex(); 0626 0627 if (yytoken != Token_COLON) 0628 { 0629 yy_expected_token(yytoken, Token_COLON, ":"); 0630 return false; 0631 } 0632 yylex(); 0633 0634 if (yytoken != Token_TYPE) 0635 { 0636 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0637 return false; 0638 } 0639 (*yynode)->type = token_stream->index() - 1; 0640 yylex(); 0641 0642 } 0643 else 0644 { 0645 return false; 0646 } 0647 0648 (*yynode)->end_token = token_stream->index() - 1; 0649 0650 return true; 0651 } 0652 0653 bool parser::parse_if_expression(if_expression_ast **yynode) 0654 { 0655 *yynode = create<if_expression_ast>(); 0656 0657 (*yynode)->start_token = token_stream->index() - 1; 0658 0659 if (yytoken == Token_IF) 0660 { 0661 if (yytoken != Token_IF) 0662 { 0663 yy_expected_token(yytoken, Token_IF, "if"); 0664 return false; 0665 } 0666 yylex(); 0667 0668 expression_ast *__node_12 = 0; 0669 if (!parse_expression(&__node_12)) 0670 { 0671 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0672 return false; 0673 } 0674 (*yynode)->condition = __node_12; 0675 0676 if (yytoken != Token_THEN) 0677 { 0678 yy_expected_token(yytoken, Token_THEN, "then"); 0679 return false; 0680 } 0681 yylex(); 0682 0683 expression_ast *__node_13 = 0; 0684 if (!parse_expression(&__node_13)) 0685 { 0686 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0687 return false; 0688 } 0689 (*yynode)->true_expression = __node_13; 0690 0691 if (yytoken != Token_ELSE) 0692 { 0693 yy_expected_token(yytoken, Token_ELSE, "else"); 0694 return false; 0695 } 0696 yylex(); 0697 0698 expression_ast *__node_14 = 0; 0699 if (!parse_expression(&__node_14)) 0700 { 0701 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0702 return false; 0703 } 0704 (*yynode)->false_expression = __node_14; 0705 0706 if (yytoken != Token_FI) 0707 { 0708 yy_expected_token(yytoken, Token_FI, "fi"); 0709 return false; 0710 } 0711 yylex(); 0712 0713 } 0714 else 0715 { 0716 return false; 0717 } 0718 0719 (*yynode)->end_token = token_stream->index() - 1; 0720 0721 return true; 0722 } 0723 0724 bool parser::parse_let_declaration(let_declaration_ast **yynode) 0725 { 0726 *yynode = create<let_declaration_ast>(); 0727 0728 (*yynode)->start_token = token_stream->index() - 1; 0729 0730 if (yytoken == Token_IDENTIFIER) 0731 { 0732 if (yytoken != Token_IDENTIFIER) 0733 { 0734 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 0735 return false; 0736 } 0737 (*yynode)->name = token_stream->index() - 1; 0738 yylex(); 0739 0740 if (yytoken != Token_COLON) 0741 { 0742 yy_expected_token(yytoken, Token_COLON, ":"); 0743 return false; 0744 } 0745 yylex(); 0746 0747 if (yytoken != Token_TYPE) 0748 { 0749 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0750 return false; 0751 } 0752 (*yynode)->type = token_stream->index() - 1; 0753 yylex(); 0754 0755 if (yytoken == Token_ARROW_LEFT) 0756 { 0757 if (yytoken != Token_ARROW_LEFT) 0758 { 0759 yy_expected_token(yytoken, Token_ARROW_LEFT, "<-"); 0760 return false; 0761 } 0762 yylex(); 0763 0764 expression_ast *__node_15 = 0; 0765 if (!parse_expression(&__node_15)) 0766 { 0767 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0768 return false; 0769 } 0770 (*yynode)->expression = __node_15; 0771 0772 } 0773 else if (true /*epsilon*/) 0774 {} 0775 else 0776 { 0777 return false; 0778 } 0779 } 0780 else 0781 { 0782 return false; 0783 } 0784 0785 (*yynode)->end_token = token_stream->index() - 1; 0786 0787 return true; 0788 } 0789 0790 bool parser::parse_let_expression(let_expression_ast **yynode) 0791 { 0792 *yynode = create<let_expression_ast>(); 0793 0794 (*yynode)->start_token = token_stream->index() - 1; 0795 0796 if (yytoken == Token_LET) 0797 { 0798 if (yytoken != Token_LET) 0799 { 0800 yy_expected_token(yytoken, Token_LET, "let"); 0801 return false; 0802 } 0803 yylex(); 0804 0805 let_declaration_ast *__node_16 = 0; 0806 if (!parse_let_declaration(&__node_16)) 0807 { 0808 yy_expected_symbol(ast_node::Kind_let_declaration, "let_declaration"); 0809 return false; 0810 } 0811 (*yynode)->declaration_sequence = snoc((*yynode)->declaration_sequence, __node_16, memory_pool); 0812 0813 while (yytoken == Token_COMMA) 0814 { 0815 if (yytoken != Token_COMMA) 0816 { 0817 yy_expected_token(yytoken, Token_COMMA, ","); 0818 return false; 0819 } 0820 yylex(); 0821 0822 let_declaration_ast *__node_17 = 0; 0823 if (!parse_let_declaration(&__node_17)) 0824 { 0825 yy_expected_symbol(ast_node::Kind_let_declaration, "let_declaration"); 0826 return false; 0827 } 0828 (*yynode)->declaration_sequence = snoc((*yynode)->declaration_sequence, __node_17, memory_pool); 0829 0830 } 0831 if (yytoken != Token_IN) 0832 { 0833 yy_expected_token(yytoken, Token_IN, "in"); 0834 return false; 0835 } 0836 yylex(); 0837 0838 expression_ast *__node_18 = 0; 0839 if (!parse_expression(&__node_18)) 0840 { 0841 yy_expected_symbol(ast_node::Kind_expression, "expression"); 0842 return false; 0843 } 0844 (*yynode)->body_expression = __node_18; 0845 0846 } 0847 else 0848 { 0849 return false; 0850 } 0851 0852 (*yynode)->end_token = token_stream->index() - 1; 0853 0854 return true; 0855 } 0856 0857 bool parser::parse_multiplicative_expression(multiplicative_expression_ast **yynode) 0858 { 0859 *yynode = create<multiplicative_expression_ast>(); 0860 0861 (*yynode)->start_token = token_stream->index() - 1; 0862 0863 if (yytoken == Token_NEW 0864 || yytoken == Token_IF 0865 || yytoken == Token_WHILE 0866 || yytoken == Token_LET 0867 || yytoken == Token_CASE 0868 || yytoken == Token_LPAREN 0869 || yytoken == Token_LBRACE 0870 || yytoken == Token_TILDE 0871 || yytoken == Token_NOT 0872 || yytoken == Token_ISVOID 0873 || yytoken == Token_IDENTIFIER 0874 || yytoken == Token_INTEGER 0875 || yytoken == Token_STRING 0876 || yytoken == Token_TRUE 0877 || yytoken == Token_FALSE) 0878 { 0879 postfix_expression_ast *__node_19 = 0; 0880 if (!parse_postfix_expression(&__node_19)) 0881 { 0882 yy_expected_symbol(ast_node::Kind_postfix_expression, "postfix_expression"); 0883 return false; 0884 } 0885 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_19, memory_pool); 0886 0887 while (yytoken == Token_STAR 0888 || yytoken == Token_SLASH) 0889 { 0890 if (yytoken == Token_STAR) 0891 { 0892 if (yytoken != Token_STAR) 0893 { 0894 yy_expected_token(yytoken, Token_STAR, "*"); 0895 return false; 0896 } 0897 (*yynode)->op = token_stream->index() - 1; 0898 yylex(); 0899 0900 } 0901 else if (yytoken == Token_SLASH) 0902 { 0903 if (yytoken != Token_SLASH) 0904 { 0905 yy_expected_token(yytoken, Token_SLASH, "/"); 0906 return false; 0907 } 0908 (*yynode)->op = token_stream->index() - 1; 0909 yylex(); 0910 0911 } 0912 else 0913 { 0914 return false; 0915 } 0916 postfix_expression_ast *__node_20 = 0; 0917 if (!parse_postfix_expression(&__node_20)) 0918 { 0919 yy_expected_symbol(ast_node::Kind_postfix_expression, "postfix_expression"); 0920 return false; 0921 } 0922 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_20, memory_pool); 0923 0924 } 0925 } 0926 else 0927 { 0928 return false; 0929 } 0930 0931 (*yynode)->end_token = token_stream->index() - 1; 0932 0933 return true; 0934 } 0935 0936 bool parser::parse_postfix_expression(postfix_expression_ast **yynode) 0937 { 0938 *yynode = create<postfix_expression_ast>(); 0939 0940 (*yynode)->start_token = token_stream->index() - 1; 0941 0942 if (yytoken == Token_NEW 0943 || yytoken == Token_IF 0944 || yytoken == Token_WHILE 0945 || yytoken == Token_LET 0946 || yytoken == Token_CASE 0947 || yytoken == Token_LPAREN 0948 || yytoken == Token_LBRACE 0949 || yytoken == Token_TILDE 0950 || yytoken == Token_NOT 0951 || yytoken == Token_ISVOID 0952 || yytoken == Token_IDENTIFIER 0953 || yytoken == Token_INTEGER 0954 || yytoken == Token_STRING 0955 || yytoken == Token_TRUE 0956 || yytoken == Token_FALSE) 0957 { 0958 unary_expression_ast *__node_21 = 0; 0959 if (!parse_unary_expression(&__node_21)) 0960 { 0961 yy_expected_symbol(ast_node::Kind_unary_expression, "unary_expression"); 0962 return false; 0963 } 0964 (*yynode)->base_expression = __node_21; 0965 0966 while (yytoken == Token_DOT 0967 || yytoken == Token_AT) 0968 { 0969 if (yytoken == Token_AT) 0970 { 0971 if (yytoken != Token_AT) 0972 { 0973 yy_expected_token(yytoken, Token_AT, "@"); 0974 return false; 0975 } 0976 yylex(); 0977 0978 if (yytoken != Token_TYPE) 0979 { 0980 yy_expected_token(yytoken, Token_TYPE, "type specification"); 0981 return false; 0982 } 0983 (*yynode)->at_type = token_stream->index() - 1; 0984 yylex(); 0985 0986 if (yytoken != Token_DOT) 0987 { 0988 yy_expected_token(yytoken, Token_DOT, "."); 0989 return false; 0990 } 0991 yylex(); 0992 0993 if (yytoken != Token_IDENTIFIER) 0994 { 0995 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 0996 return false; 0997 } 0998 (*yynode)->name = token_stream->index() - 1; 0999 yylex(); 1000 1001 if (yytoken != Token_LPAREN) 1002 { 1003 yy_expected_token(yytoken, Token_LPAREN, "("); 1004 return false; 1005 } 1006 yylex(); 1007 1008 if (yytoken == Token_NEW 1009 || yytoken == Token_IF 1010 || yytoken == Token_WHILE 1011 || yytoken == Token_LET 1012 || yytoken == Token_CASE 1013 || yytoken == Token_LPAREN 1014 || yytoken == Token_LBRACE 1015 || yytoken == Token_TILDE 1016 || yytoken == Token_NOT 1017 || yytoken == Token_ISVOID 1018 || yytoken == Token_IDENTIFIER 1019 || yytoken == Token_INTEGER 1020 || yytoken == Token_STRING 1021 || yytoken == Token_TRUE 1022 || yytoken == Token_FALSE) 1023 { 1024 expression_ast *__node_22 = 0; 1025 if (!parse_expression(&__node_22)) 1026 { 1027 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1028 return false; 1029 } 1030 (*yynode)->arguments_sequence = snoc((*yynode)->arguments_sequence, __node_22, memory_pool); 1031 1032 while (yytoken == Token_COMMA) 1033 { 1034 if (yytoken != Token_COMMA) 1035 { 1036 yy_expected_token(yytoken, Token_COMMA, ","); 1037 return false; 1038 } 1039 yylex(); 1040 1041 expression_ast *__node_23 = 0; 1042 if (!parse_expression(&__node_23)) 1043 { 1044 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1045 return false; 1046 } 1047 (*yynode)->arguments_sequence = snoc((*yynode)->arguments_sequence, __node_23, memory_pool); 1048 1049 } 1050 } 1051 else if (true /*epsilon*/) 1052 {} 1053 else 1054 { 1055 return false; 1056 } 1057 if (yytoken != Token_RPAREN) 1058 { 1059 yy_expected_token(yytoken, Token_RPAREN, ")"); 1060 return false; 1061 } 1062 yylex(); 1063 1064 } 1065 else if (yytoken == Token_DOT) 1066 { 1067 if (yytoken != Token_DOT) 1068 { 1069 yy_expected_token(yytoken, Token_DOT, "."); 1070 return false; 1071 } 1072 yylex(); 1073 1074 if (yytoken != Token_IDENTIFIER) 1075 { 1076 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 1077 return false; 1078 } 1079 (*yynode)->name = token_stream->index() - 1; 1080 yylex(); 1081 1082 if (yytoken != Token_LPAREN) 1083 { 1084 yy_expected_token(yytoken, Token_LPAREN, "("); 1085 return false; 1086 } 1087 yylex(); 1088 1089 if (yytoken == Token_NEW 1090 || yytoken == Token_IF 1091 || yytoken == Token_WHILE 1092 || yytoken == Token_LET 1093 || yytoken == Token_CASE 1094 || yytoken == Token_LPAREN 1095 || yytoken == Token_LBRACE 1096 || yytoken == Token_TILDE 1097 || yytoken == Token_NOT 1098 || yytoken == Token_ISVOID 1099 || yytoken == Token_IDENTIFIER 1100 || yytoken == Token_INTEGER 1101 || yytoken == Token_STRING 1102 || yytoken == Token_TRUE 1103 || yytoken == Token_FALSE) 1104 { 1105 expression_ast *__node_24 = 0; 1106 if (!parse_expression(&__node_24)) 1107 { 1108 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1109 return false; 1110 } 1111 (*yynode)->arguments_sequence = snoc((*yynode)->arguments_sequence, __node_24, memory_pool); 1112 1113 while (yytoken == Token_COMMA) 1114 { 1115 if (yytoken != Token_COMMA) 1116 { 1117 yy_expected_token(yytoken, Token_COMMA, ","); 1118 return false; 1119 } 1120 yylex(); 1121 1122 expression_ast *__node_25 = 0; 1123 if (!parse_expression(&__node_25)) 1124 { 1125 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1126 return false; 1127 } 1128 (*yynode)->arguments_sequence = snoc((*yynode)->arguments_sequence, __node_25, memory_pool); 1129 1130 } 1131 } 1132 else if (true /*epsilon*/) 1133 {} 1134 else 1135 { 1136 return false; 1137 } 1138 if (yytoken != Token_RPAREN) 1139 { 1140 yy_expected_token(yytoken, Token_RPAREN, ")"); 1141 return false; 1142 } 1143 yylex(); 1144 1145 } 1146 else 1147 { 1148 return false; 1149 } 1150 } 1151 } 1152 else 1153 { 1154 return false; 1155 } 1156 1157 (*yynode)->end_token = token_stream->index() - 1; 1158 1159 return true; 1160 } 1161 1162 bool parser::parse_primary_expression(primary_expression_ast **yynode) 1163 { 1164 *yynode = create<primary_expression_ast>(); 1165 1166 (*yynode)->start_token = token_stream->index() - 1; 1167 1168 if (yytoken == Token_NEW 1169 || yytoken == Token_IF 1170 || yytoken == Token_WHILE 1171 || yytoken == Token_LET 1172 || yytoken == Token_CASE 1173 || yytoken == Token_LPAREN 1174 || yytoken == Token_LBRACE 1175 || yytoken == Token_IDENTIFIER 1176 || yytoken == Token_INTEGER 1177 || yytoken == Token_STRING 1178 || yytoken == Token_TRUE 1179 || yytoken == Token_FALSE) 1180 { 1181 if ((yytoken == Token_IDENTIFIER) && ( LA(2).kind == Token_ARROW_LEFT )) 1182 { 1183 if (yytoken != Token_IDENTIFIER) 1184 { 1185 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 1186 return false; 1187 } 1188 (*yynode)->name = token_stream->index() - 1; 1189 yylex(); 1190 1191 if (yytoken != Token_ARROW_LEFT) 1192 { 1193 yy_expected_token(yytoken, Token_ARROW_LEFT, "<-"); 1194 return false; 1195 } 1196 yylex(); 1197 1198 expression_ast *__node_26 = 0; 1199 if (!parse_expression(&__node_26)) 1200 { 1201 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1202 return false; 1203 } 1204 (*yynode)->expression = __node_26; 1205 1206 } 1207 else if ((yytoken == Token_IDENTIFIER) && ( LA(2).kind == Token_LPAREN )) 1208 { 1209 if (yytoken != Token_IDENTIFIER) 1210 { 1211 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 1212 return false; 1213 } 1214 (*yynode)->name = token_stream->index() - 1; 1215 yylex(); 1216 1217 if (yytoken != Token_LPAREN) 1218 { 1219 yy_expected_token(yytoken, Token_LPAREN, "("); 1220 return false; 1221 } 1222 yylex(); 1223 1224 if (yytoken == Token_NEW 1225 || yytoken == Token_IF 1226 || yytoken == Token_WHILE 1227 || yytoken == Token_LET 1228 || yytoken == Token_CASE 1229 || yytoken == Token_LPAREN 1230 || yytoken == Token_LBRACE 1231 || yytoken == Token_TILDE 1232 || yytoken == Token_NOT 1233 || yytoken == Token_ISVOID 1234 || yytoken == Token_IDENTIFIER 1235 || yytoken == Token_INTEGER 1236 || yytoken == Token_STRING 1237 || yytoken == Token_TRUE 1238 || yytoken == Token_FALSE) 1239 { 1240 expression_ast *__node_27 = 0; 1241 if (!parse_expression(&__node_27)) 1242 { 1243 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1244 return false; 1245 } 1246 (*yynode)->argument_sequence = snoc((*yynode)->argument_sequence, __node_27, memory_pool); 1247 1248 while (yytoken == Token_COMMA) 1249 { 1250 if (yytoken != Token_COMMA) 1251 { 1252 yy_expected_token(yytoken, Token_COMMA, ","); 1253 return false; 1254 } 1255 yylex(); 1256 1257 expression_ast *__node_28 = 0; 1258 if (!parse_expression(&__node_28)) 1259 { 1260 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1261 return false; 1262 } 1263 (*yynode)->argument_sequence = snoc((*yynode)->argument_sequence, __node_28, memory_pool); 1264 1265 } 1266 } 1267 else if (true /*epsilon*/) 1268 {} 1269 else 1270 { 1271 return false; 1272 } 1273 if (yytoken != Token_RPAREN) 1274 { 1275 yy_expected_token(yytoken, Token_RPAREN, ")"); 1276 return false; 1277 } 1278 yylex(); 1279 1280 } 1281 else if (yytoken == Token_IDENTIFIER) 1282 { 1283 if (yytoken != Token_IDENTIFIER) 1284 { 1285 yy_expected_token(yytoken, Token_IDENTIFIER, "identifier"); 1286 return false; 1287 } 1288 (*yynode)->variable = token_stream->index() - 1; 1289 yylex(); 1290 1291 } 1292 else if (yytoken == Token_INTEGER) 1293 { 1294 if (yytoken != Token_INTEGER) 1295 { 1296 yy_expected_token(yytoken, Token_INTEGER, "integer literal"); 1297 return false; 1298 } 1299 (*yynode)->integer_literal = token_stream->index() - 1; 1300 yylex(); 1301 1302 } 1303 else if (yytoken == Token_STRING) 1304 { 1305 if (yytoken != Token_STRING) 1306 { 1307 yy_expected_token(yytoken, Token_STRING, "string literal"); 1308 return false; 1309 } 1310 (*yynode)->string_literal = token_stream->index() - 1; 1311 yylex(); 1312 1313 } 1314 else if (yytoken == Token_TRUE) 1315 { 1316 if (yytoken != Token_TRUE) 1317 { 1318 yy_expected_token(yytoken, Token_TRUE, "true"); 1319 return false; 1320 } 1321 (*yynode)->true_literal = token_stream->index() - 1; 1322 yylex(); 1323 1324 } 1325 else if (yytoken == Token_FALSE) 1326 { 1327 if (yytoken != Token_FALSE) 1328 { 1329 yy_expected_token(yytoken, Token_FALSE, "false"); 1330 return false; 1331 } 1332 (*yynode)->false_literal = token_stream->index() - 1; 1333 yylex(); 1334 1335 } 1336 else if (yytoken == Token_NEW) 1337 { 1338 if (yytoken != Token_NEW) 1339 { 1340 yy_expected_token(yytoken, Token_NEW, "new"); 1341 return false; 1342 } 1343 yylex(); 1344 1345 if (yytoken != Token_TYPE) 1346 { 1347 yy_expected_token(yytoken, Token_TYPE, "type specification"); 1348 return false; 1349 } 1350 (*yynode)->new_type = token_stream->index() - 1; 1351 yylex(); 1352 1353 } 1354 else if (yytoken == Token_LPAREN) 1355 { 1356 if (yytoken != Token_LPAREN) 1357 { 1358 yy_expected_token(yytoken, Token_LPAREN, "("); 1359 return false; 1360 } 1361 yylex(); 1362 1363 expression_ast *__node_29 = 0; 1364 if (!parse_expression(&__node_29)) 1365 { 1366 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1367 return false; 1368 } 1369 (*yynode)->expression = __node_29; 1370 1371 if (yytoken != Token_RPAREN) 1372 { 1373 yy_expected_token(yytoken, Token_RPAREN, ")"); 1374 return false; 1375 } 1376 yylex(); 1377 1378 } 1379 else if (yytoken == Token_IF) 1380 { 1381 if_expression_ast *__node_30 = 0; 1382 if (!parse_if_expression(&__node_30)) 1383 { 1384 yy_expected_symbol(ast_node::Kind_if_expression, "if_expression"); 1385 return false; 1386 } 1387 (*yynode)->if_expression = __node_30; 1388 1389 } 1390 else if (yytoken == Token_WHILE) 1391 { 1392 while_expression_ast *__node_31 = 0; 1393 if (!parse_while_expression(&__node_31)) 1394 { 1395 yy_expected_symbol(ast_node::Kind_while_expression, "while_expression"); 1396 return false; 1397 } 1398 (*yynode)->while_expression = __node_31; 1399 1400 } 1401 else if (yytoken == Token_LBRACE) 1402 { 1403 block_expression_ast *__node_32 = 0; 1404 if (!parse_block_expression(&__node_32)) 1405 { 1406 yy_expected_symbol(ast_node::Kind_block_expression, "block_expression"); 1407 return false; 1408 } 1409 (*yynode)->block_expression = __node_32; 1410 1411 } 1412 else if (yytoken == Token_LET) 1413 { 1414 let_expression_ast *__node_33 = 0; 1415 if (!parse_let_expression(&__node_33)) 1416 { 1417 yy_expected_symbol(ast_node::Kind_let_expression, "let_expression"); 1418 return false; 1419 } 1420 (*yynode)->let_expression = __node_33; 1421 1422 } 1423 else if (yytoken == Token_CASE) 1424 { 1425 case_expression_ast *__node_34 = 0; 1426 if (!parse_case_expression(&__node_34)) 1427 { 1428 yy_expected_symbol(ast_node::Kind_case_expression, "case_expression"); 1429 return false; 1430 } 1431 (*yynode)->case_expression = __node_34; 1432 1433 } 1434 else 1435 { 1436 return false; 1437 } 1438 } 1439 else 1440 { 1441 return false; 1442 } 1443 1444 (*yynode)->end_token = token_stream->index() - 1; 1445 1446 return true; 1447 } 1448 1449 bool parser::parse_program(program_ast **yynode) 1450 { 1451 *yynode = create<program_ast>(); 1452 1453 (*yynode)->start_token = token_stream->index() - 1; 1454 1455 if (yytoken == Token_CLASS || yytoken == Token_EOF) 1456 { 1457 while (yytoken == Token_CLASS) 1458 { 1459 class_ast *__node_35 = 0; 1460 if (!parse_class(&__node_35)) 1461 { 1462 yy_expected_symbol(ast_node::Kind_class, "class"); 1463 return false; 1464 } 1465 (*yynode)->klass_sequence = snoc((*yynode)->klass_sequence, __node_35, memory_pool); 1466 1467 if (yytoken != Token_SEMICOLON) 1468 { 1469 yy_expected_token(yytoken, Token_SEMICOLON, ";"); 1470 return false; 1471 } 1472 yylex(); 1473 1474 } 1475 if (Token_EOF != yytoken) 1476 { 1477 return false; 1478 } 1479 } 1480 else 1481 { 1482 return false; 1483 } 1484 1485 (*yynode)->end_token = token_stream->index() - 1; 1486 1487 return true; 1488 } 1489 1490 bool parser::parse_relational_expression(relational_expression_ast **yynode) 1491 { 1492 *yynode = create<relational_expression_ast>(); 1493 1494 (*yynode)->start_token = token_stream->index() - 1; 1495 1496 if (yytoken == Token_NEW 1497 || yytoken == Token_IF 1498 || yytoken == Token_WHILE 1499 || yytoken == Token_LET 1500 || yytoken == Token_CASE 1501 || yytoken == Token_LPAREN 1502 || yytoken == Token_LBRACE 1503 || yytoken == Token_TILDE 1504 || yytoken == Token_NOT 1505 || yytoken == Token_ISVOID 1506 || yytoken == Token_IDENTIFIER 1507 || yytoken == Token_INTEGER 1508 || yytoken == Token_STRING 1509 || yytoken == Token_TRUE 1510 || yytoken == Token_FALSE) 1511 { 1512 additive_expression_ast *__node_36 = 0; 1513 if (!parse_additive_expression(&__node_36)) 1514 { 1515 yy_expected_symbol(ast_node::Kind_additive_expression, "additive_expression"); 1516 return false; 1517 } 1518 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_36, memory_pool); 1519 1520 while (yytoken == Token_EQUAL 1521 || yytoken == Token_LESS_EQUAL 1522 || yytoken == Token_LESS) 1523 { 1524 if (yytoken == Token_EQUAL) 1525 { 1526 if (yytoken != Token_EQUAL) 1527 { 1528 yy_expected_token(yytoken, Token_EQUAL, "="); 1529 return false; 1530 } 1531 (*yynode)->op = token_stream->index() - 1; 1532 yylex(); 1533 1534 } 1535 else if (yytoken == Token_LESS_EQUAL) 1536 { 1537 if (yytoken != Token_LESS_EQUAL) 1538 { 1539 yy_expected_token(yytoken, Token_LESS_EQUAL, "<="); 1540 return false; 1541 } 1542 (*yynode)->op = token_stream->index() - 1; 1543 yylex(); 1544 1545 } 1546 else if (yytoken == Token_LESS) 1547 { 1548 if (yytoken != Token_LESS) 1549 { 1550 yy_expected_token(yytoken, Token_LESS, "<"); 1551 return false; 1552 } 1553 (*yynode)->op = token_stream->index() - 1; 1554 yylex(); 1555 1556 } 1557 else 1558 { 1559 return false; 1560 } 1561 additive_expression_ast *__node_37 = 0; 1562 if (!parse_additive_expression(&__node_37)) 1563 { 1564 yy_expected_symbol(ast_node::Kind_additive_expression, "additive_expression"); 1565 return false; 1566 } 1567 (*yynode)->expression_sequence = snoc((*yynode)->expression_sequence, __node_37, memory_pool); 1568 1569 } 1570 } 1571 else 1572 { 1573 return false; 1574 } 1575 1576 (*yynode)->end_token = token_stream->index() - 1; 1577 1578 return true; 1579 } 1580 1581 bool parser::parse_unary_expression(unary_expression_ast **yynode) 1582 { 1583 *yynode = create<unary_expression_ast>(); 1584 1585 (*yynode)->start_token = token_stream->index() - 1; 1586 1587 if (yytoken == Token_NEW 1588 || yytoken == Token_IF 1589 || yytoken == Token_WHILE 1590 || yytoken == Token_LET 1591 || yytoken == Token_CASE 1592 || yytoken == Token_LPAREN 1593 || yytoken == Token_LBRACE 1594 || yytoken == Token_TILDE 1595 || yytoken == Token_NOT 1596 || yytoken == Token_ISVOID 1597 || yytoken == Token_IDENTIFIER 1598 || yytoken == Token_INTEGER 1599 || yytoken == Token_STRING 1600 || yytoken == Token_TRUE 1601 || yytoken == Token_FALSE) 1602 { 1603 if (yytoken == Token_TILDE) 1604 { 1605 if (yytoken != Token_TILDE) 1606 { 1607 yy_expected_token(yytoken, Token_TILDE, "~"); 1608 return false; 1609 } 1610 (*yynode)->op = token_stream->index() - 1; 1611 yylex(); 1612 1613 primary_expression_ast *__node_38 = 0; 1614 if (!parse_primary_expression(&__node_38)) 1615 { 1616 yy_expected_symbol(ast_node::Kind_primary_expression, "primary_expression"); 1617 return false; 1618 } 1619 (*yynode)->expression = __node_38; 1620 1621 } 1622 else if (yytoken == Token_NOT) 1623 { 1624 if (yytoken != Token_NOT) 1625 { 1626 yy_expected_token(yytoken, Token_NOT, "not"); 1627 return false; 1628 } 1629 (*yynode)->op = token_stream->index() - 1; 1630 yylex(); 1631 1632 primary_expression_ast *__node_39 = 0; 1633 if (!parse_primary_expression(&__node_39)) 1634 { 1635 yy_expected_symbol(ast_node::Kind_primary_expression, "primary_expression"); 1636 return false; 1637 } 1638 (*yynode)->expression = __node_39; 1639 1640 } 1641 else if (yytoken == Token_ISVOID) 1642 { 1643 if (yytoken != Token_ISVOID) 1644 { 1645 yy_expected_token(yytoken, Token_ISVOID, "isvoid"); 1646 return false; 1647 } 1648 (*yynode)->op = token_stream->index() - 1; 1649 yylex(); 1650 1651 primary_expression_ast *__node_40 = 0; 1652 if (!parse_primary_expression(&__node_40)) 1653 { 1654 yy_expected_symbol(ast_node::Kind_primary_expression, "primary_expression"); 1655 return false; 1656 } 1657 (*yynode)->expression = __node_40; 1658 1659 } 1660 else if (yytoken == Token_NEW 1661 || yytoken == Token_IF 1662 || yytoken == Token_WHILE 1663 || yytoken == Token_LET 1664 || yytoken == Token_CASE 1665 || yytoken == Token_LPAREN 1666 || yytoken == Token_LBRACE 1667 || yytoken == Token_IDENTIFIER 1668 || yytoken == Token_INTEGER 1669 || yytoken == Token_STRING 1670 || yytoken == Token_TRUE 1671 || yytoken == Token_FALSE) 1672 { 1673 primary_expression_ast *__node_41 = 0; 1674 if (!parse_primary_expression(&__node_41)) 1675 { 1676 yy_expected_symbol(ast_node::Kind_primary_expression, "primary_expression"); 1677 return false; 1678 } 1679 (*yynode)->expression = __node_41; 1680 1681 } 1682 else 1683 { 1684 return false; 1685 } 1686 } 1687 else 1688 { 1689 return false; 1690 } 1691 1692 (*yynode)->end_token = token_stream->index() - 1; 1693 1694 return true; 1695 } 1696 1697 bool parser::parse_while_expression(while_expression_ast **yynode) 1698 { 1699 *yynode = create<while_expression_ast>(); 1700 1701 (*yynode)->start_token = token_stream->index() - 1; 1702 1703 if (yytoken == Token_WHILE) 1704 { 1705 if (yytoken != Token_WHILE) 1706 { 1707 yy_expected_token(yytoken, Token_WHILE, "while"); 1708 return false; 1709 } 1710 yylex(); 1711 1712 expression_ast *__node_42 = 0; 1713 if (!parse_expression(&__node_42)) 1714 { 1715 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1716 return false; 1717 } 1718 (*yynode)->condition = __node_42; 1719 1720 if (yytoken != Token_LOOP) 1721 { 1722 yy_expected_token(yytoken, Token_LOOP, "loop"); 1723 return false; 1724 } 1725 yylex(); 1726 1727 expression_ast *__node_43 = 0; 1728 if (!parse_expression(&__node_43)) 1729 { 1730 yy_expected_symbol(ast_node::Kind_expression, "expression"); 1731 return false; 1732 } 1733 (*yynode)->loop_expression = __node_43; 1734 1735 if (yytoken != Token_POOL) 1736 { 1737 yy_expected_token(yytoken, Token_POOL, "pool"); 1738 return false; 1739 } 1740 yylex(); 1741 1742 } 1743 else 1744 { 1745 return false; 1746 } 1747 1748 (*yynode)->end_token = token_stream->index() - 1; 1749 1750 return true; 1751 } 1752 1753 1754 } // end of namespace cool 1755 1756