我正在尝试在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);
}
Run Code Online (Sandbox Code Playgroud)
编辑2:我的词法分析器和解析器规则是相当标准的,例如在词法分析器中:
INT : 'int' ;
CHAR : 'char' ;
BOOL : 'bool' ;
STRING : 'string' ;
Run Code Online (Sandbox Code Playgroud)
...在解析器规则baseType中:
baseType : INT | CHAR | BOOL | STRING ;
Run Code Online (Sandbox Code Playgroud)
njl*_*son 33
您可以使用ctx.start或获取规则中的第一个标记ctx.getStart().然后getLine()在令牌上使用以获取行号(并getCharPositionInLine()获取列).
Sam*_*ell 15
您可以使用ctx.getSourceInterval()获取规则所使用的令牌范围.您可以使用TokenStream.get(int index)获取与源间隔关联的令牌,然后从令牌获取位置信息.
Interval sourceInterval = ctx.getSourceInterval();
Token firstToken = commonTokenStream.get(sourceInterval.a);
int line = firstToken.getLine();
Run Code Online (Sandbox Code Playgroud)
如果您有 ParserRuleContext 对象,则可以按照@njlarsson 的建议直接获取行号:
ParserRuleContext ctx;
int line = ctx.getStart().getLine();
Run Code Online (Sandbox Code Playgroud)
但是,如果您只有一个 RuleContext 对象,则需要先将其类型转换为 ParserRuleContext:
RuleContext rctx;
ParserRuleContext ctx = (ParserRuleContext) rctx;
int line = ctx.getStart().getLine();
Run Code Online (Sandbox Code Playgroud)
注:>>我使用ANTLR4 >>在代码段以上,ctx并且rctx不被初始化为简洁。您需要使用适当的值初始化它们,例如ParserRuleContext ctx = parser.compilationUnit();
| 归档时间: |
|
| 查看次数: |
8938 次 |
| 最近记录: |