0

記憶が正しければMissingTokenException、 、を取得し続けます。ANTLRWorks からのログファイル / コンソール出力は、私にとって十分に役に立ちません。NullPointerExceptionNoViableAlterativeException

私が求めているのは、次のような書き直しです。

(expression | FLOAT) '(' -> (expression | FLOAT) '*('

以下は、テスト ファイルを作成するために取り出した文法のサンプルです。

grammar Test;

expression
: //FLOAT '(' -> (FLOAT '*(')+
| add EOF!
;
term
:   
| '(' add ')'
| FLOAT
| IMULT
;

IMULT
:   (add ('(' add)*) -> (add ('*' add)*)
;
negation
:   '-'* term
;

unary
:   ('+' | '-')* negation
;

mult
:   unary (('*' | '/') unary)*
;

add
:   mult (('+' | '-') mult)*
;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;

FLOAT
:   ('0'..'9')+ '.' ('0'..'9')*// EXPONENT?
|   '.' ('0'..'9')+ //EXPONENT?
|   ('0'..'9')+ //EXPONENT
;

WS  :   ( ' '
    | '\t'
    | '\r'
    | '\n'
    ) {$channel=HIDDEN;}
;

私も試しました:

imult
: FLOAT '(' -> FLOAT '*('
;

この:

IMULT / imult
: expression '(' -> expression '*'
;

数え切れないほどの他のバージョン (ハック) と同様に。

誰でもこれで私を助けることができますか?

4

1 に答える 1

1

私は以前にこの問題に遭遇しました。基本的な答えは、ANTLR では、'->' ステートメントの右側に、左側に存在しないトークンを使用することが許可されていないということです。ただし、できることは、AST 用に特別に定義された追加のトークンを使用することです。次のように、文法規則の前に tokens ブロックを作成するだけです。

tokens { ABSTRACTTOKEN; }

このように、文法ステートメントの右側で使用できます。

imult
: FLOAT '(' -> ^(ABSTRACTTOKEN FLOAT) 
;

それが役立つことを願っています。

于 2012-10-03T21:21:55.230 に答える