1

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

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 之间包含不是 a 的内容body_block,那么我想向用户建议他们打算将该文本包含在 abody_block中。

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

4

1 回答 1

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请注意,.解析器规则中的 a 匹配任何标记,而不是任何字符!

于 2012-07-18T18:54:18.027 回答