乐者为王

Do one thing, and do it well.

ANTLR 4权威参考读书笔记(32)

前面我们介绍过ANTLR的自动错误恢复机制,现在让我们看看手动机制,有些时候它能够提供更好的错误恢复。

错误选项

某些语法错误非常常见,所以值得特别处理。例如,程序员经常在带有嵌套参数的函数调用结尾处忘记写大括号。特别是处理这些情况,我们所要做的就是添加选项来匹配错误但常见的语法。下面的语法识别单个参数或者可能在参数中使用嵌套括号的函数调用。规则fcall有两个所谓的错误选项。

1
2
3
4
5
6
7
8
9
stat: fcall ';' ;
fcall
    : ID '(' expr ')'
    | ID '(' expr ')' ')' { notifyErrorListeners("Too many parentheses"); }
    | ID '(' expr         { notifyErrorListeners("Missing closing ')'"); }
    ;
expr: '(' expr ')'
    | INT
    ;

虽然这些错误选项可能使ANTLR生成的语法分析器在选项之间选择时更困难,但它们不以任何方式混淆语法分析器。就像任何其它选项,如果它们与当前的输入一致,语法分析器就会匹配它们。现在,让我们从一个有效的函数调用开始,尝试一些匹配错误选项的输入序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ antlr Call.g
$ compile Call
$ grun Call stat
f(34);
EOF
$ grun Call stat
f((34);
EOF
line 1:6 Missing closing ')'
$ grun Call stat
f((34)));
EOF
line 1:8 Too many parentheses

Comments