CForStatement::CForStatement(tokenItor &itor) { Expect(For, *itor++); m_init = StatementPtr(new CAssignmentStatement(itor)); //초기식 Expect(To, *itor++); m_condition = CExpression::Parse(itor); //조건식 Expect(Step, *itor++); m_increment = StatementPtr(new CAssignmentStatement(itor)); //증감문 m_statement = StatementPtr(CStatement::Create(itor)); }
CIfStatement::CIfStatement(tokenItor &itor) : ifStatement(nullptr), elseStatement(nullptr) { Expect(If, *itor++); m_expression = CExpression::Parse(itor); ifStatement = StatementPtr(CStatement::Create(itor)); if (itor->token == Else) { itor++; elseStatement = StatementPtr(CStatement::Create(itor)); } }
FileScope::FileScope(const string &fileName, int fileSize, const MD5 &md5) : BlockScope("", "", StatementPtr(), BlockScope::FileScope), m_size(fileSize), m_md5(md5), m_system(false), m_isHHFile(false), m_preloadPriority(0), m_fileName(fileName), m_redeclaredFunctions(0) { pushAttribute(); // for global scope }
StatementPtr Parser::parseStatement() { if (m_curToken.tokenType() == TokenType::Begin) { return parseCompoundStatement(); } else if (match(TokenType::If)) { ExpressionPtr expression = parseExpression(); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } if (!match(TokenType::Then)) { reportError(ErrorCodes::ExpectedThen); panic(statementFollow, statementFollowSize); return StatementPtr(); } StatementPtr thenStatement = parseStatement(); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } if (!match(TokenType::Else)) { reportError(ErrorCodes::ExpectedElse); panic(statementFollow, statementFollowSize); return StatementPtr(); } StatementPtr elseStatement = parseStatement(); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } IfStatementPtr statement(new IfStatement); statement->expression = expression; statement->thenPart = thenStatement; statement->elsePart = elseStatement; return statement; } else if (match(TokenType::While)) { ExpressionPtr expression = parseExpression(); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } if (!match(TokenType::Do)) { reportError(ErrorCodes::ExpectedDo); panic(statementFollow, statementFollowSize); return StatementPtr(); } StatementPtr doPart = parseStatement(); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } WhileStatementPtr whileStatement(new WhileStatement); whileStatement->expression = expression; whileStatement->doPart = doPart; return whileStatement; } IdentifierPtr identifier = parseIdentifier(); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } AssignmentOrCallStatementPtr statement(new AssignmentOrCallStatement); statement->id = identifier; parseStatement_p(statement); if (m_errorCode > ErrorCodes::NoError) { panic(statementFollow, statementFollowSize); return StatementPtr(); } return statement; }
CWhileStatement::CWhileStatement(tokenItor &itor) { Expect(While, *itor++); m_expression = CExpression::Parse(itor); m_statement = StatementPtr(CStatement::Create(itor)); }
StatementPtr TypedefStatement::clone() { return StatementPtr(new TypedefStatement(*this)); }