我有一个语法来解析一些源代码:
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
中.我已经做了一些几乎可行的尝试,如果这很有启发性,我可以发布,但我希望我只是错过了一些简单的事情。
最佳答案
不漂亮,但这样的事情会做到这一点:
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 请注意,
.
在解析器规则中匹配任何标记,而不是任何字符!
关于error-handling - 在丢失的 token 上输出适合上下文的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547581/