Antlr4左递归规则似乎产生右关联解析

Antlr4左递归规则似乎产生右关联解析,antlr4,associativity,left-recursion,Antlr4,Associativity,Left Recursion,以下语法说明了这个问题: // test Antlr4 left recursion associativity grammar LRA; @parser::members { public static void main(String[] ignored) throws Exception{ final LRALexer lexer = new LRALexer(new ANTLRInputStream(System.in)); final LRAPa

以下语法说明了这个问题:

// test Antlr4 left recursion associativity
grammar LRA;
@parser::members {
    public static void main(String[] ignored) throws Exception{
        final LRALexer lexer = new LRALexer(new ANTLRInputStream(System.in));
        final LRAParser parser = new LRAParser(new CommonTokenStream(lexer));
        parser.setTrace(true);
        parser.file();
    }
}
ID: [A-Za-z_] ([A-Za-z_]|[0-9])*;
CMA: ',';
SMC: ';';
UNK: . -> skip;
file: punctuated EOF;
punctuated
    : punctuated cma punctuated
    | punctuated smc punctuated
    | expression
    ;
cma: CMA;
smc: SMC;
expression: id;
id: ID;
给定输入“a,b,c”,我得到侦听器事件跟踪输出

( 'a' ) ( ',' ( 'b' ) ( ',' ( 'c' ) ) )
其中,表示输入标点,表示退出标点,为简洁明了,省略所有其他规则

通过检查,侦听器事件的顺序表示正确的关联分析

通常的做法,以及明确的Antlr4引用,使我期望得到一个左关联解析,对应于下面的侦听器事件跟踪

( 'a' ) ( ',' ( 'b' ) ) ( ',' ( 'c' ) )

我的语法,我的期望,我对听众事件的解释,或者其他的东西有什么不对吗?

< P>我认为上面描述的解决方案是一个合适的答案。生成的解析器需要向递归调用传递一个优先级参数,并且由于优先级与令牌关联,因此令牌必须直接在递归规则中可用,以便Antlr可以找到其优先级

工作语法如下所示:

// test Antlr4 left recursion associativity
grammar LRA;
@parser::members {
    public static void main(String[] ignored) throws Exception{
        final LRALexer lexer = new LRALexer(new ANTLRInputStream(System.in));
        final LRAParser parser = new LRAParser(new CommonTokenStream(lexer));
        parser.setTrace(true);
        parser.file();
    }
}
ID: [A-Za-z_] ([A-Za-z_]|[0-9])*;
CMA: ',';
SMC: ';';
UNK: . -> skip;
file: punctuated EOF;
punctuated
    : punctuated CMA punctuated
    | punctuated SMC punctuated
    | expression
    ;
expression: id;
id: ID;

我没有遇到这个特殊的问题,但是有一个令牌参数可以尝试,您可以尝试将
表达式
移动到
带标点的
中作为第一个选项,看看这是否有什么不同。我发现有效的方法是将令牌直接提升到左侧递归规则中。标点:标点CMA标点|标点SMC标点|表达式;