SymbolTableEntry* Parser::parseExpressionPrime(SymbolTableEntry* prevEntry){ SymbolTableEntry* result = prevEntry; if(isNext(tc_RELOP)){ OpType t = m_currentToken->getOpType(); match(tc_RELOP); SymbolTableEntry* exp = parseSimpleExpression(); result = newTemp(); SymbolTableEntry* tr = newLabel(); SymbolTableEntry* end = newLabel(); if(t == op_LT){ m_code->generate(cd_LT, prevEntry, exp, tr); } else if(t == op_LE){ m_code->generate(cd_LE, prevEntry, exp, tr); } else if(t == op_GT){ m_code->generate(cd_GT, prevEntry, exp, tr); } else if(t == op_GE){ m_code->generate(cd_GE, prevEntry, exp, tr); } else if(t == op_EQ){ m_code->generate(cd_EQ, prevEntry, exp, tr); } else{ m_code->generate(cd_NE, prevEntry, exp, tr); } m_code->generate(cd_ASSIGN, m_symbolTable->lookup(CodeFalse), NULL, result); m_code->generate(cd_GOTO, NULL, NULL, end); m_code->generate(cd_LABEL, NULL, NULL, tr); m_code->generate(cd_ASSIGN, m_symbolTable->lookup(CodeTrue), NULL, result); m_code->generate(cd_LABEL, NULL, NULL, end); } return result; }
void Parser::parseExpression_p(RelOpExpressionPtr expr) { Token op = m_curToken; if (match(TokenType::RelOp)) { expr->relOp = op.operatorType(); expr->rhs = parseSimpleExpression(); return; } // is empty return; }
ExpressionPtr Parser::parseExpression() { RelOpExpressionPtr expr(new RelOpExpression); expr->lhs = parseSimpleExpression(); parseExpression_p(expr); if (expr->rhs) { return expr; } return expr->lhs; }
SymbolTableEntry* Parser::parseExpression(){ SymbolTableEntry* entry = parseSimpleExpression(); entry = parseExpressionPrime(entry); return entry; }