ルールが一致していますが、文法をマッチングするときには、トークンが空です
-
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
をチェックするように見えます。
-
私はAntLR 4を使用しているときに、すべてのアクションコードをリスナーや訪問者に移行する提案で常にこれらの回答を開始します。
-
これはおそらく主な問題です。
String
がequals
の場合でも、"+".equals($op.text)
を取得しないことを保証するためにこの順序を使用したことに注意してください。 -
NullPointerException
ラベルの削除と代わりに$op.text
を参照することをお勧めします。-
リスナーや訪問者の使用に切り替えると、明示的なラベルを削除すると、解析ツリーのサイズがわずかに減少します。
-
-
(上級ユーザにのみ)構文エラーを含むいくつかのエッジケースでは、オブジェクトがまだ解析ツリーに存在している間にラベルが割り当てられない場合があります。特に、ラベルがルール参照に割り当てられている場合に発生する可能性があります(
null
ラベルがトークンリファレンスに割り当てられます)、ラベル付きルール内にエラーが表示されます。リスナー/訪問者の自動生成されたメソッドを介してコンテキストオブジェクトを参照すると、ラベルが割り当てられていなくてもインスタンスは利用可能になり、いくつかのエラーの詳細を報告する機能を改善します。
所属していません StackOverflow