【发布时间】:2013-11-16 05:19:08
【问题描述】:
我正在尝试在我的 ParserVisitor 中获取更具体的错误消息的行号(访问由 antlr 生成的解析树)。然而,我在这门课上只有上下文ctx,我可以做ctx.getText()之类的事情,但不能做getLine()。有没有办法做到这一点?
ctx.getPayload() 可以用在这里吗?如果有,怎么做?
编辑:我正在使用 ANTLR 4 创建 java 文件。
尝试通过如下方法访问访问者中的行号:
@Override
public Type visitStatAssign(@NotNull BasicParser.StatAssignContext ctx) {
...
// some semantic error detected
int lineNo = ...
System.err.("Semantic error at line " + lineNo);
}
编辑 2: 我的词法分析器和解析器规则是相当标准的,例如在词法分析器中:
INT : 'int' ;
CHAR : 'char' ;
BOOL : 'bool' ;
STRING : 'string' ;
...在解析器规则baseType中:
baseType : INT | CHAR | BOOL | STRING ;
【问题讨论】:
-
你能贴一些代码吗?您使用的是哪个版本的 ANTLR?
-
你在使用树语法吗?可以发一下吗?
-
树语法到底是什么意思?抱歉这是我第一次发帖!
-
您必须编写一个用于词法分析的部分,它将您的输入转换为标记流。这是由词汇规则定义的。以及将您的标记转换为语义树的树语法。这是用解析器规则定义的。词法规则+解析器规则=语法规则。
-
这里的树语法肯定是无关紧要的吗?解析器访问者只是遍历它生成的树。解析出来的程序中的行号不就和这些无关了吗?
标签: antlr parse-tree