// 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())); }
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; }
std::string FlowLexer::tokenToString(FlowToken value) const { return value.c_str(); }