2012-06-05 54 views
1

Java.g,我们可以发现以下规则(为清楚起见空白删除):Java.g:模糊的'声明'规则? (断言)

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

我有两个问题:

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

在此先感谢。

回答

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;)。