以下代码段显示了称为blaise的语言的表达式。 Antlr在第7行对此test case进行了抱怨,因为规则funcall
在下面定义为在()之间包含一个非空的表达式列表。这是输出:
line 7:11 no viable alternative at input 'pi()'
line 7:10 mismatched input '(' expecting '.'
我发现语法是模棱两可的,这就是为什么没有可行的替代异常被抛出的原因。
expr : aexpr
| bexpr
;
aexpr : NUM
| IDENTIFIER
| aexpr binop aexpr
| '(' aexpr ')'
| funcall
| '-' aexpr
;
binop : '*' | '+' | '-' | '**' | '/'
;
bexpr : aexpr relop aexpr
| bexpr ('\\/' | '/\\') bexpr
| '-' bexpr
| NUM
// | IDENTIFIER
| funcall
;
relop : '=' | '~' | '<' | '<=' | '>=' | '>'
;
funcall : IDENTIFIER '('expr (',' expr)*')'
;
我真的很想从工具中获取尽可能多的信息,因为在抛出异常之前,Antlr尝试匹配哪些规则。我确实浏览了本书中有关错误恢复和策略的章节。从书中,我至少能找到的是,它有可能将reportNoViableAlternative
覆盖为:
public class MyErrorStrategy extends DefaultErrorStrategy {
@Override
public void reportNoViableAlternative(Parser parser,
NoViableAltException e)
throws RecognitionException
{
// ANTLR generates Parser subclasses from grammars and
// Parser extends Recognizer. Parameter parser is a
// pointer to the parser that detected the error
String msg = "can't choose between alternatives"; // nonstandard msg
parser.notifyErrorListeners(e.getOffendingToken(), msg, e);
}
}
是否可以从此处构建并获得Antlr尝试匹配的规则?