我有一个语法来解析一些源代码:
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
内。
我已经做了几次几乎的工作尝试,如果这很有启发性,我可以发帖,但我希望我错过了一些简单的事情。
答案 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 请注意,解析器规则中的.
匹配任何标记,而不是任何字符!