File indexing completed on 2024-04-28 04:36:08
0001 // THIS FILE IS GENERATED 0002 // WARNING! All changes made in this file will be lost! 0003 0004 #include "factparser.h" 0005 0006 0007 #include "factlexer.h" 0008 #include <QString> 0009 #include <QDebug> 0010 0011 namespace fact 0012 { 0013 0014 void Parser::tokenize( const QString& contents ) 0015 { 0016 m_contents = contents; 0017 Lexer lexer( this, contents ); 0018 0019 int kind = Parser::Token_EOF; 0020 do 0021 { 0022 kind = lexer.nextTokenKind(); 0023 0024 if ( !kind ) // when the lexer returns 0, the end of file is reached 0025 kind = Parser::Token_EOF; 0026 0027 Parser::Token &t = tokenStream->next(); 0028 t.kind = kind; 0029 if ( t.kind == Parser::Token_EOF ) 0030 { 0031 t.begin = -1; 0032 t.end = -1; 0033 } 0034 else 0035 { 0036 t.begin = lexer.tokenBegin(); 0037 t.end = lexer.tokenEnd(); 0038 } 0039 0040 if ( m_debug ) 0041 { 0042 qDebug() << kind << "(" << t.begin << "," << t.end << ")::" << tokenText(t.begin, t.end); 0043 } 0044 0045 } 0046 while ( kind != Parser::Token_EOF ); 0047 0048 this->yylex(); // produce the look ahead token 0049 } 0050 0051 QString Parser::tokenText( qint64 begin, qint64 end ) const 0052 { 0053 return m_contents.mid((int)begin, (int)end-begin+1); 0054 } 0055 0056 void Parser::reportProblem( Parser::ProblemType type, const QString& message ) 0057 { 0058 if (type == Error) 0059 qDebug() << "** ERROR:" << message; 0060 else if (type == Warning) 0061 qDebug() << "** WARNING:" << message; 0062 else if (type == Info) 0063 qDebug() << "** Info:" << message; 0064 } 0065 0066 // custom error recovery 0067 void Parser::expectedToken(int /*expected*/, qint64 /*where*/, const QString& name) 0068 { 0069 reportProblem( 0070 Parser::Error, 0071 QString("Expected token \"%1\"").arg(name)); 0072 } 0073 0074 void Parser::expectedSymbol(int /*expected_symbol*/, const QString& name) 0075 { 0076 qint64 line; 0077 qint64 col; 0078 size_t index = tokenStream->index()-1; 0079 Token &token = tokenStream->token(index); 0080 qDebug() << "token starts at:" << token.begin; 0081 qDebug() << "index is:" << index; 0082 tokenStream->startPosition(index, &line, &col); 0083 QString tokenValue = tokenText(token.begin, token.end); 0084 reportProblem( 0085 Parser::Error, 0086 QString("Expected symbol \"%1\" (current token: \"%2\" [%3] at line: %4 col: %5)") 0087 .arg(name) 0088 .arg(token.kind != 0 ? tokenValue : "EOF") 0089 .arg(token.kind) 0090 .arg(line) 0091 .arg(col)); 0092 } 0093 0094 void Parser::setDebug( bool debug ) 0095 { 0096 m_debug = debug; 0097 } 0098 0099 } // end of namespace fact 0100 0101 0102 namespace fact 0103 { 0104 0105 bool Parser::parseAssignmentStatement(AssignmentStatementAst **yynode) 0106 { 0107 *yynode = create<AssignmentStatementAst>(); 0108 0109 (*yynode)->startToken = tokenStream->index() - 1; 0110 (*yynode)->id = -1; 0111 0112 if (yytoken == Token_IDENTIFIER) 0113 { 0114 if (yytoken != Token_IDENTIFIER) 0115 { 0116 expectedToken(yytoken, Token_IDENTIFIER, "identifier"); 0117 return false; 0118 } 0119 (*yynode)->id = tokenStream->index() - 1; 0120 yylex(); 0121 0122 if (yytoken != Token_ASSIGN) 0123 { 0124 expectedToken(yytoken, Token_ASSIGN, "="); 0125 return false; 0126 } 0127 yylex(); 0128 0129 ExpressionAst *__node_0 = 0; 0130 if (!parseExpression(&__node_0)) 0131 { 0132 expectedSymbol(AstNode::ExpressionKind, "expression"); 0133 return false; 0134 } 0135 (*yynode)->expr = __node_0; 0136 0137 if (yytoken != Token_SEMICOLON) 0138 { 0139 expectedToken(yytoken, Token_SEMICOLON, ";"); 0140 return false; 0141 } 0142 yylex(); 0143 0144 } 0145 else 0146 { 0147 return false; 0148 } 0149 0150 (*yynode)->endToken = tokenStream->index() - 2; 0151 0152 return true; 0153 } 0154 0155 bool Parser::parseBlockStatement(BlockStatementAst **yynode) 0156 { 0157 *yynode = create<BlockStatementAst>(); 0158 0159 (*yynode)->startToken = tokenStream->index() - 1; 0160 0161 if (yytoken == Token_LBRACE) 0162 { 0163 if (yytoken != Token_LBRACE) 0164 { 0165 expectedToken(yytoken, Token_LBRACE, "{"); 0166 return false; 0167 } 0168 yylex(); 0169 0170 while (yytoken == Token_IF 0171 || yytoken == Token_IDENTIFIER 0172 || yytoken == Token_RETURN 0173 || yytoken == Token_LBRACE) 0174 { 0175 StatementAst *__node_1 = 0; 0176 if (!parseStatement(&__node_1)) 0177 { 0178 expectedSymbol(AstNode::StatementKind, "statement"); 0179 return false; 0180 } 0181 (*yynode)->stmtSequence = snoc((*yynode)->stmtSequence, __node_1, memoryPool); 0182 0183 } 0184 if (yytoken != Token_RBRACE) 0185 { 0186 expectedToken(yytoken, Token_RBRACE, "}"); 0187 return false; 0188 } 0189 yylex(); 0190 0191 } 0192 else 0193 { 0194 return false; 0195 } 0196 0197 (*yynode)->endToken = tokenStream->index() - 2; 0198 0199 return true; 0200 } 0201 0202 bool Parser::parseBody(BodyAst **yynode) 0203 { 0204 *yynode = create<BodyAst>(); 0205 0206 (*yynode)->startToken = tokenStream->index() - 1; 0207 0208 if (yytoken == Token_LBRACE) 0209 { 0210 if (yytoken != Token_LBRACE) 0211 { 0212 expectedToken(yytoken, Token_LBRACE, "{"); 0213 return false; 0214 } 0215 yylex(); 0216 0217 while (yytoken == Token_VAR) 0218 { 0219 DeclarationAst *__node_2 = 0; 0220 if (!parseDeclaration(&__node_2)) 0221 { 0222 expectedSymbol(AstNode::DeclarationKind, "declaration"); 0223 return false; 0224 } 0225 (*yynode)->declSequence = snoc((*yynode)->declSequence, __node_2, memoryPool); 0226 0227 } 0228 while (yytoken == Token_IF 0229 || yytoken == Token_IDENTIFIER 0230 || yytoken == Token_RETURN 0231 || yytoken == Token_LBRACE) 0232 { 0233 StatementAst *__node_3 = 0; 0234 if (!parseStatement(&__node_3)) 0235 { 0236 expectedSymbol(AstNode::StatementKind, "statement"); 0237 return false; 0238 } 0239 (*yynode)->stmtSequence = snoc((*yynode)->stmtSequence, __node_3, memoryPool); 0240 0241 } 0242 if (yytoken != Token_RBRACE) 0243 { 0244 expectedToken(yytoken, Token_RBRACE, "}"); 0245 return false; 0246 } 0247 yylex(); 0248 0249 } 0250 else 0251 { 0252 return false; 0253 } 0254 0255 (*yynode)->endToken = tokenStream->index() - 2; 0256 0257 return true; 0258 } 0259 0260 bool Parser::parseCondition(ConditionAst **yynode) 0261 { 0262 *yynode = create<ConditionAst>(); 0263 0264 (*yynode)->startToken = tokenStream->index() - 1; 0265 0266 if (yytoken == Token_NUMBER 0267 || yytoken == Token_IDENTIFIER) 0268 { 0269 ExpressionAst *__node_4 = 0; 0270 if (!parseExpression(&__node_4)) 0271 { 0272 expectedSymbol(AstNode::ExpressionKind, "expression"); 0273 return false; 0274 } 0275 (*yynode)->leftExpr = __node_4; 0276 0277 if (yytoken != Token_EQUAL) 0278 { 0279 expectedToken(yytoken, Token_EQUAL, "=="); 0280 return false; 0281 } 0282 yylex(); 0283 0284 ExpressionAst *__node_5 = 0; 0285 if (!parseExpression(&__node_5)) 0286 { 0287 expectedSymbol(AstNode::ExpressionKind, "expression"); 0288 return false; 0289 } 0290 (*yynode)->rightExpr = __node_5; 0291 0292 } 0293 else 0294 { 0295 return false; 0296 } 0297 0298 (*yynode)->endToken = tokenStream->index() - 2; 0299 0300 return true; 0301 } 0302 0303 bool Parser::parseDeclaration(DeclarationAst **yynode) 0304 { 0305 *yynode = create<DeclarationAst>(); 0306 0307 (*yynode)->startToken = tokenStream->index() - 1; 0308 0309 if (yytoken == Token_VAR) 0310 { 0311 if (yytoken != Token_VAR) 0312 { 0313 expectedToken(yytoken, Token_VAR, "var"); 0314 return false; 0315 } 0316 yylex(); 0317 0318 VariableAst *__node_6 = 0; 0319 if (!parseVariable(&__node_6)) 0320 { 0321 expectedSymbol(AstNode::VariableKind, "variable"); 0322 return false; 0323 } 0324 (*yynode)->var = __node_6; 0325 0326 while (yytoken == Token_COMMA) 0327 { 0328 if (yytoken != Token_COMMA) 0329 { 0330 expectedToken(yytoken, Token_COMMA, ","); 0331 return false; 0332 } 0333 yylex(); 0334 0335 VariableAst *__node_7 = 0; 0336 if (!parseVariable(&__node_7)) 0337 { 0338 expectedSymbol(AstNode::VariableKind, "variable"); 0339 return false; 0340 } 0341 (*yynode)->var = __node_7; 0342 0343 } 0344 if (yytoken != Token_SEMICOLON) 0345 { 0346 expectedToken(yytoken, Token_SEMICOLON, ";"); 0347 return false; 0348 } 0349 yylex(); 0350 0351 } 0352 else 0353 { 0354 return false; 0355 } 0356 0357 (*yynode)->endToken = tokenStream->index() - 2; 0358 0359 return true; 0360 } 0361 0362 bool Parser::parseExpression(ExpressionAst **yynode) 0363 { 0364 *yynode = create<ExpressionAst>(); 0365 0366 (*yynode)->startToken = tokenStream->index() - 1; 0367 0368 if (yytoken == Token_NUMBER 0369 || yytoken == Token_IDENTIFIER) 0370 { 0371 MultExpressionAst *__node_8 = 0; 0372 if (!parseMultExpression(&__node_8)) 0373 { 0374 expectedSymbol(AstNode::MultExpressionKind, "multExpression"); 0375 return false; 0376 } 0377 (*yynode)->leftExpr = __node_8; 0378 0379 while (yytoken == Token_MINUS) 0380 { 0381 if (yytoken != Token_MINUS) 0382 { 0383 expectedToken(yytoken, Token_MINUS, "-"); 0384 return false; 0385 } 0386 yylex(); 0387 0388 MultExpressionAst *__node_9 = 0; 0389 if (!parseMultExpression(&__node_9)) 0390 { 0391 expectedSymbol(AstNode::MultExpressionKind, "multExpression"); 0392 return false; 0393 } 0394 (*yynode)->rightExpr = __node_9; 0395 0396 } 0397 } 0398 else 0399 { 0400 return false; 0401 } 0402 0403 (*yynode)->endToken = tokenStream->index() - 2; 0404 0405 return true; 0406 } 0407 0408 bool Parser::parseFunctionDefinition(FunctionDefinitionAst **yynode) 0409 { 0410 *yynode = create<FunctionDefinitionAst>(); 0411 0412 (*yynode)->startToken = tokenStream->index() - 1; 0413 (*yynode)->id = -1; 0414 0415 if (yytoken == Token_FUNCTION) 0416 { 0417 if (yytoken != Token_FUNCTION) 0418 { 0419 expectedToken(yytoken, Token_FUNCTION, "function"); 0420 return false; 0421 } 0422 yylex(); 0423 0424 if (yytoken != Token_IDENTIFIER) 0425 { 0426 expectedToken(yytoken, Token_IDENTIFIER, "identifier"); 0427 return false; 0428 } 0429 (*yynode)->id = tokenStream->index() - 1; 0430 yylex(); 0431 0432 if (yytoken != Token_LPAREN) 0433 { 0434 expectedToken(yytoken, Token_LPAREN, "("); 0435 return false; 0436 } 0437 yylex(); 0438 0439 if (yytoken == Token_IDENTIFIER) 0440 { 0441 if (yytoken != Token_IDENTIFIER) 0442 { 0443 expectedToken(yytoken, Token_IDENTIFIER, "identifier"); 0444 return false; 0445 } 0446 (*yynode)->paramSequence = snoc((*yynode)->paramSequence, tokenStream->index() - 1, memoryPool); 0447 yylex(); 0448 0449 while (yytoken == Token_COMMA) 0450 { 0451 if (yytoken != Token_COMMA) 0452 { 0453 expectedToken(yytoken, Token_COMMA, ","); 0454 return false; 0455 } 0456 yylex(); 0457 0458 if (yytoken != Token_IDENTIFIER) 0459 { 0460 expectedToken(yytoken, Token_IDENTIFIER, "identifier"); 0461 return false; 0462 } 0463 (*yynode)->paramSequence = snoc((*yynode)->paramSequence, tokenStream->index() - 1, memoryPool); 0464 yylex(); 0465 0466 } 0467 } 0468 else if (true /*epsilon*/) 0469 { 0470 } 0471 else 0472 { 0473 return false; 0474 } 0475 if (yytoken != Token_RPAREN) 0476 { 0477 expectedToken(yytoken, Token_RPAREN, ")"); 0478 return false; 0479 } 0480 yylex(); 0481 0482 BodyAst *__node_10 = 0; 0483 if (!parseBody(&__node_10)) 0484 { 0485 expectedSymbol(AstNode::BodyKind, "body"); 0486 return false; 0487 } 0488 (*yynode)->body = __node_10; 0489 0490 } 0491 else 0492 { 0493 return false; 0494 } 0495 0496 (*yynode)->endToken = tokenStream->index() - 2; 0497 0498 return true; 0499 } 0500 0501 bool Parser::parseIfStatement(IfStatementAst **yynode) 0502 { 0503 *yynode = create<IfStatementAst>(); 0504 0505 (*yynode)->startToken = tokenStream->index() - 1; 0506 0507 if (yytoken == Token_IF) 0508 { 0509 if (yytoken != Token_IF) 0510 { 0511 expectedToken(yytoken, Token_IF, "if"); 0512 return false; 0513 } 0514 yylex(); 0515 0516 if (yytoken != Token_LPAREN) 0517 { 0518 expectedToken(yytoken, Token_LPAREN, "("); 0519 return false; 0520 } 0521 yylex(); 0522 0523 ConditionAst *__node_11 = 0; 0524 if (!parseCondition(&__node_11)) 0525 { 0526 expectedSymbol(AstNode::ConditionKind, "condition"); 0527 return false; 0528 } 0529 (*yynode)->cond = __node_11; 0530 0531 if (yytoken != Token_RPAREN) 0532 { 0533 expectedToken(yytoken, Token_RPAREN, ")"); 0534 return false; 0535 } 0536 yylex(); 0537 0538 StatementAst *__node_12 = 0; 0539 if (!parseStatement(&__node_12)) 0540 { 0541 expectedSymbol(AstNode::StatementKind, "statement"); 0542 return false; 0543 } 0544 (*yynode)->ifStmt = __node_12; 0545 0546 if (yytoken == Token_ELSE) 0547 { 0548 if (yytoken != Token_ELSE) 0549 { 0550 expectedToken(yytoken, Token_ELSE, "else"); 0551 return false; 0552 } 0553 yylex(); 0554 0555 StatementAst *__node_13 = 0; 0556 if (!parseStatement(&__node_13)) 0557 { 0558 expectedSymbol(AstNode::StatementKind, "statement"); 0559 return false; 0560 } 0561 (*yynode)->elseStmt = __node_13; 0562 0563 } 0564 else if (true /*epsilon*/) 0565 { 0566 } 0567 else 0568 { 0569 return false; 0570 } 0571 } 0572 else 0573 { 0574 return false; 0575 } 0576 0577 (*yynode)->endToken = tokenStream->index() - 2; 0578 0579 return true; 0580 } 0581 0582 bool Parser::parseMultExpression(MultExpressionAst **yynode) 0583 { 0584 *yynode = create<MultExpressionAst>(); 0585 0586 (*yynode)->startToken = tokenStream->index() - 1; 0587 0588 if (yytoken == Token_NUMBER 0589 || yytoken == Token_IDENTIFIER) 0590 { 0591 PrimaryAst *__node_14 = 0; 0592 if (!parsePrimary(&__node_14)) 0593 { 0594 expectedSymbol(AstNode::PrimaryKind, "primary"); 0595 return false; 0596 } 0597 (*yynode)->leftExpr = __node_14; 0598 0599 while (yytoken == Token_STAR) 0600 { 0601 if (yytoken != Token_STAR) 0602 { 0603 expectedToken(yytoken, Token_STAR, "*"); 0604 return false; 0605 } 0606 yylex(); 0607 0608 PrimaryAst *__node_15 = 0; 0609 if (!parsePrimary(&__node_15)) 0610 { 0611 expectedSymbol(AstNode::PrimaryKind, "primary"); 0612 return false; 0613 } 0614 (*yynode)->rightExpr = __node_15; 0615 0616 } 0617 } 0618 else 0619 { 0620 return false; 0621 } 0622 0623 (*yynode)->endToken = tokenStream->index() - 2; 0624 0625 return true; 0626 } 0627 0628 bool Parser::parsePrimary(PrimaryAst **yynode) 0629 { 0630 *yynode = create<PrimaryAst>(); 0631 0632 (*yynode)->startToken = tokenStream->index() - 1; 0633 (*yynode)->num = -1; 0634 (*yynode)->id = -1; 0635 0636 if (yytoken == Token_NUMBER 0637 || yytoken == Token_IDENTIFIER) 0638 { 0639 if (yytoken == Token_NUMBER) 0640 { 0641 if (yytoken != Token_NUMBER) 0642 { 0643 expectedToken(yytoken, Token_NUMBER, "integer literal"); 0644 return false; 0645 } 0646 (*yynode)->num = tokenStream->index() - 1; 0647 yylex(); 0648 0649 } 0650 else if (yytoken == Token_IDENTIFIER) 0651 { 0652 if (yytoken != Token_IDENTIFIER) 0653 { 0654 expectedToken(yytoken, Token_IDENTIFIER, "identifier"); 0655 return false; 0656 } 0657 (*yynode)->id = tokenStream->index() - 1; 0658 yylex(); 0659 0660 if (yytoken == Token_LPAREN) 0661 { 0662 if (yytoken != Token_LPAREN) 0663 { 0664 expectedToken(yytoken, Token_LPAREN, "("); 0665 return false; 0666 } 0667 yylex(); 0668 0669 ExpressionAst *__node_16 = 0; 0670 if (!parseExpression(&__node_16)) 0671 { 0672 expectedSymbol(AstNode::ExpressionKind, "expression"); 0673 return false; 0674 } 0675 (*yynode)->argumentSequence = snoc((*yynode)->argumentSequence, __node_16, memoryPool); 0676 0677 while (yytoken == Token_COMMA) 0678 { 0679 if (yytoken != Token_COMMA) 0680 { 0681 expectedToken(yytoken, Token_COMMA, ","); 0682 return false; 0683 } 0684 yylex(); 0685 0686 ExpressionAst *__node_17 = 0; 0687 if (!parseExpression(&__node_17)) 0688 { 0689 expectedSymbol(AstNode::ExpressionKind, "expression"); 0690 return false; 0691 } 0692 (*yynode)->argumentSequence = snoc((*yynode)->argumentSequence, __node_17, memoryPool); 0693 0694 } 0695 if (yytoken != Token_RPAREN) 0696 { 0697 expectedToken(yytoken, Token_RPAREN, ")"); 0698 return false; 0699 } 0700 yylex(); 0701 0702 } 0703 else if (true /*epsilon*/) 0704 { 0705 } 0706 else 0707 { 0708 return false; 0709 } 0710 } 0711 else 0712 { 0713 return false; 0714 } 0715 } 0716 else 0717 { 0718 return false; 0719 } 0720 0721 (*yynode)->endToken = tokenStream->index() - 2; 0722 0723 return true; 0724 } 0725 0726 bool Parser::parseProgram(ProgramAst **yynode) 0727 { 0728 *yynode = create<ProgramAst>(); 0729 0730 (*yynode)->startToken = tokenStream->index() - 1; 0731 0732 if (yytoken == Token_FUNCTION || yytoken == Token_EOF) 0733 { 0734 while (yytoken == Token_FUNCTION) 0735 { 0736 FunctionDefinitionAst *__node_18 = 0; 0737 if (!parseFunctionDefinition(&__node_18)) 0738 { 0739 expectedSymbol(AstNode::FunctionDefinitionKind, "functionDefinition"); 0740 return false; 0741 } 0742 (*yynode)->funSequence = snoc((*yynode)->funSequence, __node_18, memoryPool); 0743 0744 } 0745 if (Token_EOF != yytoken) 0746 { 0747 return false; 0748 } 0749 } 0750 else 0751 { 0752 return false; 0753 } 0754 0755 (*yynode)->endToken = tokenStream->index() - 2; 0756 0757 return true; 0758 } 0759 0760 bool Parser::parseReturnStatement(ReturnStatementAst **yynode) 0761 { 0762 *yynode = create<ReturnStatementAst>(); 0763 0764 (*yynode)->startToken = tokenStream->index() - 1; 0765 0766 if (yytoken == Token_RETURN) 0767 { 0768 if (yytoken != Token_RETURN) 0769 { 0770 expectedToken(yytoken, Token_RETURN, "return"); 0771 return false; 0772 } 0773 yylex(); 0774 0775 ExpressionAst *__node_19 = 0; 0776 if (!parseExpression(&__node_19)) 0777 { 0778 expectedSymbol(AstNode::ExpressionKind, "expression"); 0779 return false; 0780 } 0781 (*yynode)->expr = __node_19; 0782 0783 if (yytoken != Token_SEMICOLON) 0784 { 0785 expectedToken(yytoken, Token_SEMICOLON, ";"); 0786 return false; 0787 } 0788 yylex(); 0789 0790 } 0791 else 0792 { 0793 return false; 0794 } 0795 0796 (*yynode)->endToken = tokenStream->index() - 2; 0797 0798 return true; 0799 } 0800 0801 bool Parser::parseStatement(StatementAst **yynode) 0802 { 0803 *yynode = create<StatementAst>(); 0804 0805 (*yynode)->startToken = tokenStream->index() - 1; 0806 0807 if (yytoken == Token_IF 0808 || yytoken == Token_IDENTIFIER 0809 || yytoken == Token_RETURN 0810 || yytoken == Token_LBRACE) 0811 { 0812 if (yytoken == Token_IDENTIFIER) 0813 { 0814 AssignmentStatementAst *__node_20 = 0; 0815 if (!parseAssignmentStatement(&__node_20)) 0816 { 0817 expectedSymbol(AstNode::AssignmentStatementKind, "assignmentStatement"); 0818 return false; 0819 } 0820 (*yynode)->assignStmt = __node_20; 0821 0822 } 0823 else if (yytoken == Token_IF) 0824 { 0825 IfStatementAst *__node_21 = 0; 0826 if (!parseIfStatement(&__node_21)) 0827 { 0828 expectedSymbol(AstNode::IfStatementKind, "ifStatement"); 0829 return false; 0830 } 0831 (*yynode)->ifStmt = __node_21; 0832 0833 } 0834 else if (yytoken == Token_LBRACE) 0835 { 0836 BlockStatementAst *__node_22 = 0; 0837 if (!parseBlockStatement(&__node_22)) 0838 { 0839 expectedSymbol(AstNode::BlockStatementKind, "blockStatement"); 0840 return false; 0841 } 0842 (*yynode)->blockStmt = __node_22; 0843 0844 } 0845 else if (yytoken == Token_RETURN) 0846 { 0847 ReturnStatementAst *__node_23 = 0; 0848 if (!parseReturnStatement(&__node_23)) 0849 { 0850 expectedSymbol(AstNode::ReturnStatementKind, "returnStatement"); 0851 return false; 0852 } 0853 (*yynode)->returnStmt = __node_23; 0854 0855 } 0856 else 0857 { 0858 return false; 0859 } 0860 } 0861 else 0862 { 0863 return false; 0864 } 0865 0866 (*yynode)->endToken = tokenStream->index() - 2; 0867 0868 return true; 0869 } 0870 0871 bool Parser::parseVariable(VariableAst **yynode) 0872 { 0873 *yynode = create<VariableAst>(); 0874 0875 (*yynode)->startToken = tokenStream->index() - 1; 0876 (*yynode)->id = -1; 0877 0878 if (yytoken == Token_IDENTIFIER) 0879 { 0880 if (yytoken != Token_IDENTIFIER) 0881 { 0882 expectedToken(yytoken, Token_IDENTIFIER, "identifier"); 0883 return false; 0884 } 0885 (*yynode)->id = tokenStream->index() - 1; 0886 yylex(); 0887 0888 } 0889 else 0890 { 0891 return false; 0892 } 0893 0894 (*yynode)->endToken = tokenStream->index() - 2; 0895 0896 return true; 0897 } 0898 0899 0900 } // end of namespace fact 0901