2012-06-05 56 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;)。