【发布时间】:2020-09-19 12:11:44
【问题描述】:
我有一个代码预处理器,它在源代码中插入一个#line 指令。该指令包含文件名、行号和字符位置。我有一个 #line 指令的词法分析器规则,它调用一个名为 newFile 的函数。 newFile 函数设置词法分析器的行号和字符位置。但是,我看不到设置源名称的方法。有一些函数可以获取源名称,但不能设置它。我尝试设置输入流源名称,但这似乎不起作用(我有一个errorListener,它从recognizer->getInputStream()->getSourceName() 获取文件名,但它总是返回初始文件名)。
我的代码是(C++目标):
preprocessor pp(_defines, _incpaths);
ANTLRInputStream input(pp.preprocess(filename));
myLexer lexer(&input);
CommonTokenStream tokens(&lexer);
myParser parser(&tokens);
antlr4::tree::ParseTree* tree = parser.start();
而且,newFile 代码是:
void myLexer::newFile (std::string newFilename, int newLine, int newPos)
{
static_cast<ANTLRInputStream*>(_input)->name = newFilename; // doesn't work
setLine(newLine);
setCharPositionInLine(newPos);
}
感谢所有帮助。
【问题讨论】:
标签: c++ antlr filenames antlr4 preprocessor