1

Java.gには、次のルールがあります(わかりやすくするために空白は削除されています)。

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

私は2つの質問があります:

  1. 2つの「アサート」サブルールが本当に必要ですか?
  2. そうでない場合、ANTLRはまったく同じ入力を定義しているように見えるので、なぜあいまいさを訴えないのですか?

前もって感謝します。

4

1 に答える 1

1

PedroF.は次のように書いています。

2つの「アサート」サブルールが本当に必要ですか?

いいえ、同等です。ただし、文法Java.gのフォーマット方法を見ると、次のようになります。

statement 
    :   block

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

私は(空のスペースを見て)文法に元々コードが埋め込まれていたのではないかと思います。

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

そして、おそらくより多くのルール/トークンが削除されました(もちろん、すべて当て推量です!)。

PedroF.は次のように書いています。

そうでない場合、ANTLRはまったく同じ入力を定義しているように見えるので、なぜあいまいさを訴えないのですか?

グローバルバックトラッキング(backtrack=true;オプション内)が有効になっているためです。

于 2012-06-05T10:43:36.557 に答える