Beispiel #1
0
// castExpr ::= 'int' '(' expr ')'
//            | 'string' '(' expr ')'
//            | 'bool' '(' expr ')'
std::unique_ptr<Expr> FlowParser::castExpr()
{
	FNTRACE();
	FlowLocation sloc(location());

	FlowToken targetTypeToken = token();
	nextToken();

	if (!consume(FlowToken::RndOpen))
		return nullptr;

	std::unique_ptr<Expr> e(expr());

	if (!consume(FlowToken::RndClose))
		return nullptr;

	if (!e)
		return nullptr;

    Opcode targetType = makeOperator(targetTypeToken, e.get());
    if (targetType == Opcode::EXIT) {
        reportError("Type cast error. No cast implementation found for requested cast from %s to %s.",
                tos(e->getType()).c_str(), targetTypeToken.c_str());
        return nullptr;
    }

    if (targetType == Opcode::NOP) {
        return e;
    }

    printf("Type cast from %s to %s: %s\n", tos(e->getType()).c_str(), targetTypeToken.c_str(), mnemonic(targetType));
	return std::make_unique<UnaryExpr>(targetType, std::move(e), sloc.update(end()));
}
Beispiel #2
0
bool FlowParser::consume(FlowToken value)
{
	if (token() != value) {
		reportError("Unexpected token '%s' (expected: '%s')", token().c_str(), value.c_str());
		return false;
	}

	nextToken();
	return true;
}
Beispiel #3
0
std::string FlowLexer::tokenToString(FlowToken value) const
{
	return value.c_str();
}