1

ANTLRレクサーは、範囲式での私の試みを"1...3"フロートとして扱っていると思います。次のトークン定義を使用したときのように、式"x={1...3}"はレクサーから出てきます。"x={.3}"

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

AUTO : '...';

FLOATを変更して整数をチェックするようにすると、次のようになります。

FLOAT   :    ('0'..'9')+;

次に、式"x={1...3}"は正しくトークン化されます。誰かが私がこれを修正するのを手伝ってもらえますか?

ありがとう!

4

3 に答える 3

1

WayneHはあなたの問題にぶつかります。「.3」の形式(先行ゼロなし)のフロートを許可しました。したがって、レクサーは最後のを識別します。そして3とそれを浮動小数点数と見なします。その結果、3つのドットは表示されません。2つのドットとフロートが表示されます。

言語がfloatに対してこの形式を許可せず、小数点の左側に少なくとも1桁(0であっても)が必要なことは非常に一般的です。文法を変えることで問題が解決すると思います。

おそらく述語でそれを修正する方法がありますが、私はまだそれを行うための明白な方法を見つけるのに十分な時間をANTLRで過ごしていません。

于 2010-04-25T17:19:11.400 に答える
1

レクサーは最初のピリオドを FLOAT トークンに入れていると思いますが、残りの 2 つのピリオドは AUTO トークンを作成しません。ピリオドが float トークンまたは auto トークンの一部であるかどうかを判断するには、述語が必要です。

では、なぜ 2 つではなく 3 つのピリオドを使用しているのですか。言語は「範囲」に 2 つのピリオドを使用する必要があり、言語はピリオドがフロートの一部であるか、次の「文字」に基づいて範囲であるかを判断する必要があります。

さまざまなルールの述語を作成する方法については、Defiitive ANTLR リファレンスを調べる必要があるでしょう。

これが、タスクを完了するための正しい方法を見つけるのに役立つことを願っています.

于 2010-04-20T23:37:20.460 に答える
0

これをやりたい人のために...

http://www.antlr.org/wiki/display/ANTLR3/Lexer+grammar+for+floating+point%2C+dot%2C+range%2C+time+specs

言語構文を変更して、「...」を「to」キーワードに置き換えることができます。

于 2010-04-20T22:32:29.503 に答える