4

単純な数式(いくつかのantlrの例のように)を解析および評価するための単純な文法(レクサーとパーサー)があり、単純な変数定義(つまり、浮動小数点値の割り当て)とこれらの変数の使用も可能であるとします。たとえば、次の処理が可能です。

 r = 2.5;
 PI = 3.14;
 PI * r * r;

これは、より複雑な文法で使用されることになっています。実際、いくつかの異なるもの。問題は、上記のレクサーが基本的にすべての文字列をトークンタイプID、つまり潜在的な変数名として認識することですが、より複雑な文法には他のキーワードが含まれる場合があります。

私が行った場合

lexer grammar ComplexLexer;
import SimpleMathExprLexer;
// ...
IF : 'if'|'IF';
THEN : 'then'|'THEN';
// ...

その場合、IDがすでにこれらのキーワードと一致していることはそれほど役に立ちません。importステートメントをこれらのルールの下に移動するだけでは機能しません。これを回避する方法はありますか、それとも私が作曲を見るときに完全に間違った道を進んでいますか?

4

1 に答える 1

2

ANTLR は、最初に定義されたルールを優先します。これは、lexer grammar がある場合、lexer grammarGをインポートしG3、その grammar の後に次のことを意味しG2ます。

lexer grammar G;

import G3, G2;

...

または同様に:

lexer grammar G;

import G3;

...


lexer grammar G3;

import G2;

...

からのルールは よりG3も優先されG2ますが、 からのルールはGの両方よりも優先されます。G3 G2

単一のレクサー文法と同様に、 、、 ...などのキーワードに一致するルールの後にIDENTIFIER定義するようなルール"if""then"

于 2012-11-09T20:23:39.680 に答える