Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
ExpressionPtr Parser::parseExpression()
{
    RelOpExpressionPtr expr(new RelOpExpression);

    expr->lhs = parseSimpleExpression();
    parseExpression_p(expr);

    if (expr->rhs) {
        return expr;
    }

    return expr->lhs;
}
Пример #4
0
SymbolTableEntry* Parser::parseExpression(){
	SymbolTableEntry* entry = parseSimpleExpression();
	entry = parseExpressionPrime(entry);
	return entry;
}