【问题标题】:Antlr4 left-recursive rule appears to produce right-associative parseAntlr4 左递归规则似乎产生右关联解析
【发布时间】:2013-08-05 00:32:14
【问题描述】:

下面的语法说明了这个问题:

// 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' ) ) )

其中(代表输入标点符号)代表退出标点符号,为简洁起见省略所有其他规则和清晰度。

通过检查,这种侦听器事件的顺序表示右关联解析。

Common practice 和 The Definitive Antlr 4 Reference,让我期待左关联解析,对应于以下侦听器事件跟踪

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

我的语法、我的期望、我对听众事件的解释或其他方面有什么问题吗?

【问题讨论】:

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

标签: antlr4 associativity left-recursion


【解决方案1】:

我认为上述解决方法是一个充分的答案。生成的解析器需要将优先级参数传递给递归调用,并且由于优先级与令牌相关联,因此令牌必须在递归规则中直接可用,以便 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多