有没有办法获得在“无可行替代例外”下antlr试图匹配的规则的名称?

时间:2019-06-02 11:34:19

标签: java antlr antlr4

以下代码段显示了称为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)*')'
        ;

Link to full grammar

我真的很想从工具中获取尽可能多的信息,因为在抛出异常之前,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尝试匹配的规则?

0 个答案:

没有答案