1

Java.g中,我们可以找到以下规则(为清楚起见删除了空格):

statement 
     :   block
         |   ('assert') expression (':' expression)? ';'
         |   'assert'  expression (':' expression)? ';'            
         |   'if' parExpression statement ('else' statement)?          
         (...)
         ;

我有两个问题:

  1. 真的需要两个“断言”子规则吗?
  2. 如果不是,为什么 ANTLR 不抱怨歧义,因为它们似乎定义了完全相同的输入?

提前致谢。

4

1 回答 1

1

佩德罗 F. 写道:

真的需要两个“断言”子规则吗?

不,它们是等价的。但是,通过查看语法Java.g的格式化方式:

statement 
    :   block

    |   ('assert'
        )
        expression (':' expression)? ';'
    |   'assert'  expression (':' expression)? ';'     
    |   ...

我怀疑(通过查看空格)语法最初嵌入了代码:

statement 
    :   block     { /* embedded code */
        }    
    |   ('assert' { /* embedded code */ }
        )
        expression (':' expression)? ';'
    |   'assert'  expression (':' expression)? ';'     
    |   ...

并且可能更多的规则/令牌被剥离(当然,所有的猜测!)。

佩德罗 F. 写道:

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

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

于 2012-06-05T10:43:36.557 回答