Antlr Java.g:不明确';报表';规则?(断言)

Antlr Java.g:不明确';报表';规则?(断言),antlr,antlr3,Antlr,Antlr3,在中,我们可以找到以下规则(为了清晰起见,删除了空格): 我有两个问题: 是否真的需要两个“断言”子规则 如果不是,为什么ANTLR不抱怨歧义,因为它们似乎定义了完全相同的输入 提前谢谢 Pedro F.写道: 是否真的需要两个“断言”子规则 不,它们是相等的。但是,通过查看语法的格式: statement : block | ('assert' ) expression (':' expression)? ';' | 'a

在中,我们可以找到以下规则(为了清晰起见,删除了空格):

我有两个问题:

  • 是否真的需要两个“断言”子规则
  • 如果不是,为什么ANTLR不抱怨歧义,因为它们似乎定义了完全相同的输入
  • 提前谢谢

    Pedro F.写道:

    是否真的需要两个“断言”子规则

    不,它们是相等的。但是,通过查看语法的格式:

    statement 
        :   block
    
        |   ('assert'
            )
            expression (':' expression)? ';'
        |   'assert'  expression (':' expression)? ';'     
        |   ...
    
    我(通过查看空格)怀疑语法中最初嵌入了代码:

    statement 
        :   block     { /* embedded code */
            }    
        |   ('assert' { /* embedded code */ }
            )
            expression (':' expression)? ';'
        |   'assert'  expression (':' expression)? ';'     
        |   ...
    
    而且可能会有更多的规则/标记被删除(当然都是猜测!)

    Pedro F.写道:

    如果不是,为什么ANTLR不抱怨歧义,因为它们似乎定义了完全相同的输入

    因为启用了全局回溯(选项中的
    backtrack=true;

    Pedro F.写道:

    是否真的需要两个“断言”子规则

    不,它们是相等的。但是,通过查看语法的格式:

    statement 
        :   block
    
        |   ('assert'
            )
            expression (':' expression)? ';'
        |   'assert'  expression (':' expression)? ';'     
        |   ...
    
    我(通过查看空格)怀疑语法中最初嵌入了代码:

    statement 
        :   block     { /* embedded code */
            }    
        |   ('assert' { /* embedded code */ }
            )
            expression (':' expression)? ';'
        |   'assert'  expression (':' expression)? ';'     
        |   ...
    
    而且可能会有更多的规则/标记被删除(当然都是猜测!)

    Pedro F.写道:

    如果不是,为什么ANTLR不抱怨歧义,因为它们似乎定义了完全相同的输入

    因为启用了全局回溯(选项中的
    backtrack=true;