Java.g:模糊的“陈述”规则? (断言)

时间:2012-06-05 10:17:47

标签: antlr antlr3

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

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

我有两个问题:

  1. 真的需要两个'断言'子规则吗?
  2. 如果没有,为什么ANTLR不抱怨含糊不清,因为它们似乎定义了完全相同的输入?
  3. 先谢谢。

1 个答案:

答案 0 :(得分:1)

  

Pedro F.写道:

     

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

不,他们是等同的。但是,通过查看语法Java.g的格式:

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;)已启用。