在丢失的令牌上输出与上下文相关的错误消息

时间:2012-07-18 18:03:46

标签: error-handling antlr

我有一个语法来解析一些源代码:

document
  : header body_block* EOF
    -> body_block*
  ;

header
  : header_statement*
  ;

body_block
  : '{' block_contents '}'
  ;

block_contents
  : declaration_list
  | ... other things ....

如果文档没有正文或没有标题的正文,则合法。

如果我尝试解析看起来像

的文档
int i;

然后ANTLR抱怨它在期待int时找到EOF。这是事实,但我想说它期待{。也就是说,如果输入包含标题和EOF之间不是body_block的内容,那么我想向用户建议他们打算将该文本包含在body_block内。

我已经做了几次几乎的工作尝试,如果这很有启发性,我可以发帖,但我希望我错过了一些简单的事情。

1 个答案:

答案 0 :(得分:1)

不漂亮,但这样的事情会这样做:

body_block
 : ('{')=> '{' block_contents '}'
 | t=.
   {
     if(!$t.text.equals("{")) {
       String message = "expected a '{' on line " + $t.getLine() + " near '" + $t.text + "'";
     }
     else {
       String message = "encountered a '{' without a '}' on line " + $t.getLine();
     }
     throw new RuntimeException(message);
   }
 ;

未经过测试,可能包含语法错误!

因此,只要'{' ... '}'不匹配,它就会落到. 1 并产生更易理解的错误消息。



1 请注意,解析器规则中的.匹配任何标记,而不是任何字符!