ルールが一致していますが、文法をマッチングするときには、トークンが空です

StackOverflow https://stackoverflow.com//questions/21016803

  •  21-12-2019
  •  | 
  •  

質問

だから私のルールは

です
/* Addition and subtraction have the lowest precedence. */
additionExp returns [double value]
    :    m1=multiplyExp       {$value = $m1.value;} 
         ( op=AddOp m2=multiplyExp )* {
                                       if($op != null){ // test if matched
                                         if($op.text == "+" ){
                                           $value += $m2.value;
                                         }else{
                                           $value -= $m2.value;
                                         }                                         
                                        }
                                       }
    ;

AddOp : '+' | '-' ;
.

テストist 3 + 4ですが、op.textは常にNULLを返し、決してcharを返します。

誰もが私がaddopの値をテストする方法を知っていますか?

AntLR4アクションと属性

stat: ID '=' INT ';'
   {
    if ( !$block::symbols.contains($ID.text) ) {
      System.err.println("undefined variable: "+$ID.text);
    }
   }
   | block
   ;
.

役に立ちましたか?

解決

$op.textは常にnullですか?あなたの比較は、$op.text=="+"をチェックするのではなく、nullをチェックするように見えます。

  1. 私はAntLR 4を使用しているときに、すべてのアクションコードをリスナーや訪問者に移行する提案で常にこれらの回答を開始します。

  2. これはおそらく主な問題です。 Stringequalsの場合でも、"+".equals($op.text)を取得しないことを保証するためにこの順序を使用したことに注意してください。

  3. NullPointerExceptionラベルの削除と代わりに$op.textを参照することをお勧めします。

    1. リスナーや訪問者の使用に切り替えると、明示的なラベルを削除すると、解析ツリーのサイズがわずかに減少します。

    2. (上級ユーザにのみ)構文エラーを含むいくつかのエッジケースでは、オブジェクトがまだ解析ツリーに存在している間にラベルが割り当てられない場合があります。特に、ラベルがルール参照に割り当てられている場合に発生する可能性があります(nullラベルがトークンリファレンスに割り当てられます)、ラベル付きルール内にエラーが表示されます。リスナー/訪問者の自動生成されたメソッドを介してコンテキストオブジェクトを参照すると、ラベルが割り当てられていなくてもインスタンスは利用可能になり、いくつかのエラーの詳細を報告する機能を改善します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top