forked from NUDT-compiler/nudt-compiler-cpp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1016 B
40 lines
1016 B
#include "irgen/IRGen.h"
|
|
|
|
#include <stdexcept>
|
|
|
|
#include "SysYParser.h"
|
|
#include "ir/IR.h"
|
|
#include "utils/Log.h"
|
|
|
|
// 语句生成当前只实现了最小子集。
|
|
// 目前支持:
|
|
// - return <exp>;
|
|
//
|
|
// 还未支持:
|
|
// - 赋值语句
|
|
// - if / while 等控制流
|
|
// - 空语句、块语句嵌套分发之外的更多语句形态
|
|
|
|
std::any IRGenImpl::visitStmt(SysYParser::StmtContext* ctx) {
|
|
if (!ctx) {
|
|
throw std::runtime_error(FormatError("irgen", "缺少语句"));
|
|
}
|
|
if (ctx->returnStmt()) {
|
|
return ctx->returnStmt()->accept(this);
|
|
}
|
|
throw std::runtime_error(FormatError("irgen", "暂不支持的语句类型"));
|
|
}
|
|
|
|
|
|
std::any IRGenImpl::visitReturnStmt(SysYParser::ReturnStmtContext* ctx) {
|
|
if (!ctx) {
|
|
throw std::runtime_error(FormatError("irgen", "缺少 return 语句"));
|
|
}
|
|
if (!ctx->exp()) {
|
|
throw std::runtime_error(FormatError("irgen", "return 缺少表达式"));
|
|
}
|
|
ir::Value* v = EvalExpr(*ctx->exp());
|
|
builder_.CreateRet(v);
|
|
return BlockFlow::Terminated;
|
|
}
|