35 lines
996 B
C++
35 lines
996 B
C++
// 调用 ANTLR 生成的 Lexer/Parser,返回 parse tree。
|
||
#include "frontend/AntlrDriver.h"
|
||
|
||
#include <fstream>
|
||
#include <sstream>
|
||
#include <stdexcept>
|
||
|
||
#include "SysYLexer.h"
|
||
#include "SysYParser.h"
|
||
#include "antlr4-runtime.h"
|
||
|
||
AntlrResult ParseFileWithAntlr(const std::string& path) {
|
||
std::ifstream fin(path);
|
||
if (!fin.is_open()) {
|
||
throw std::runtime_error("无法打开输入文件: " + path);
|
||
}
|
||
std::ostringstream ss;
|
||
ss << fin.rdbuf();
|
||
|
||
auto input = std::make_unique<antlr4::ANTLRInputStream>(ss.str());
|
||
auto lexer = std::make_unique<SysYLexer>(input.get());
|
||
auto tokens = std::make_unique<antlr4::CommonTokenStream>(lexer.get());
|
||
auto parser = std::make_unique<SysYParser>(tokens.get());
|
||
parser->removeErrorListeners();
|
||
auto tree = parser->compUnit();
|
||
|
||
AntlrResult result;
|
||
result.input = std::move(input);
|
||
result.lexer = std::move(lexer);
|
||
result.tokens = std::move(tokens);
|
||
result.parser = std::move(parser);
|
||
result.tree = tree;
|
||
return result;
|
||
}
|