1

私は2つの割り当てを有効にしたいトークンを持っており、それを行うための最良の方法を見つけようとしています。

たとえば、私は持っています

TOSTRING = 'tostring'

しかし、私は'toString'が次のように有効であることも望んでいます:

TOSTRING = 'toString'

これを達成するための最良の方法は何ですか?

編集:*。tokenファイルに次のように出力させたい

TOSTRING=9
'toString'=9
'tostring'=9

言語を使用する私のコードはこの構造を使用し、token{}セクションにTOSTRING='tostring'を置くとこれが生成されます。単一の割り当てを持つレクサールールでさえ、これを行います。しかし、私が複数の割り当てを持っている場合、トークンは「toString」または「tostring」に対して作成されません

4

2 に答える 2

4

一般に、lexer の一部の制御が失われるため、tokens セクションは使用しないでください。常に実際のレクサー ルールを使用します。トークン セクションは、レクサー ルールを自動的に追加するだけです。単純な文字列以上のものが必要な場合に制限にぶつかり始めることを除けば、違いはありません。

大文字と小文字を区別しない場合は、次の記事を参照してください。

大文字と小文字を区別しないようにするにはどうすればよいですか?

ただし、不要なコードが大量に生成される 'A'|'a' メソッドではなく、LA() (そこで説明) のオーバーライドを介して実装してください。このキャメルケースだけの場合:

TOSTRING
    : 'to' ('s' | 'S') 'tring'
    ;
于 2012-12-06T03:52:16.303 に答える
3

TOSTRING最速の方法は、両方を受け入れるようにレクサールールを定義することです。

TOSTRING
    : 'tostring'   //alternative #1, lower-case 's'
    | 'toString'   //alternative #2, upper-case 'S'
    ;

または同等のもの:

TOSTRING
    : 'to' ('s' | 'S') 'tring'
    ;
于 2012-12-05T21:09:34.837 に答える