ANTLR3的错误处理问题
我尝试了以下方式报告错误ANTLR3的错误处理问题,antlr,grammar,antlr3,context-free-grammar,Antlr,Grammar,Antlr3,Context Free Grammar,我尝试了以下方式报告错误 @members{ public String getErrorMessage(RecognitionException e,String[] tokenNames) { List stack=getRuleInvocationStack(e,this.getClass().getName()); String msg=null; if(e instanceof NoViableAltException){
@members{
public String getErrorMessage(RecognitionException e,String[] tokenNames)
{
List stack=getRuleInvocationStack(e,this.getClass().getName());
String msg=null;
if(e instanceof NoViableAltException){
<some code>
}
else{
msg=super.getErrorMessage(e,tokenNames);
}
String[] inputLines = e.input.toString().split("\r\n");
String line = "";
if(e.token.getCharPositionInLine()==0)
line = "at \"" + inputLines[e.token.getLine() - 2];
else if(e.token.getCharPositionInLine()>0)
line = "at \"" + inputLines[e.token.getLine() - 1];
return ": " + msg.split("at")[0] + line + "\" => [" + stack.get(stack.size() - 1) + "]";
}
public String getTokenErrorDisplay(Token t){
return t.toString();
}
}
我有两个问题
1) 有没有合适的方法来做我做过的同样的事情
2) 我想用它们真正的符号来代替CLOSSB、SEMICOL、CLOSB等。如何使用.g文件中的映射来实现这一点
谢谢。1)有没有合适的方法来做我做过的同样的事情
我不知道是否有一个定义正确的方式来显示错误。我对显示错误的看法是一个litmis测试。如果用户能够根据您提供给他们的信息找出修复错误的方法,那就很好了。如果用户被错误消息弄糊涂了,那么该消息需要更多的工作。根据问题中给出的示例,符号仅为字符常量
我最喜欢看到错误的方式是用箭头指向该位置的线条
i、 e
第6行应为右括号
int a[6;
^
2) 我想用它们真正的符号来代替CLOSSB、SEMICOL、CLOSB等。如何使用.g文件中的映射来实现这一点
您必须读取单独生成的令牌文件,然后制作一个映射,即字典数据结构,以将令牌名称转换为令牌字符
编辑
首先,我们必须澄清符号的含义。如果您将符号的定义限制为仅在标记文件中使用字符或字符串定义的标记,则可以执行此操作,即“!”=13,或'public'=92,如果您选择使用符号的定义作为与令牌关联的任何文本,则这与我过去或计划要解决的问题不同
当ANTLR生成其令牌映射时,它使用三种不同的源:
SEMICOL
来说,这似乎很容易做到,但是对于FOO
这样的令牌,您如何获取这些信息呢
FOO : (X | Y)+;
fragment X : '4'..'6';
fragment Y : 'a' | 'bc' | . ;
2) 是否有一种方法可以使用.g文件的lex标记进行映射,例如
SEMICOL:';'代码>等?@GuyCoder,.tokens
文件不包含此信息:SEMICOL
将映射到数值(int)值,而不是;'代码>。还是我误解了?@GuyCoder,bartkiers
我想是对的。如果没有,那么使用.tokens
文件的方法是什么?@GuyCoder,你在回复谁?您链接到的邮件列表讨论没有提到任何关于.tokens
文件的内容,该文件包含您在上述答案中提到的信息。您不能。
谢谢您的直接回答。我想你是对的。
FOO : (X | Y)+;
fragment X : '4'..'6';
fragment Y : 'a' | 'bc' | . ;