8

ANTLRにNOTロジックはありますか? 私は基本的に私が持っているルールを否定しようとしていて、それが可能かどうか疑問に思っていました.ANDロジックもありますか?

4

2 に答える 2

15

@larsmans はすでに回答を提供しています。ANTLR ルールの法的な否定の例を挙げたいと思います (それらで間違いが起こることが非常に多いため)。

ANTLR の否定演算子は~(チルダ) です。lexer ルール内で、~は単一の文字を否定します。

NOT_A : ~'A';

'A'および以下を除く任意の文字に一致します。

NOT_LOWER_CASE : ~('a'..'z');

小文字の ASCII 文字を除く任意の文字に一致します。lats の例は、次のように書くこともできます。

NOT_LOWER_CASE : ~LOWER_CASE;
LOWER_CASE : 'a'..'z';

1 文字だけ否定する限り、使用は有効です~。次のようなことは無効です。

INVALID : ~('a' | 'aa');

文字列を否定できないためです'aa'

パーサー ルール内では、否定は文字では機能せず、トークンで機能します。したがって、parseルールは次のとおりです。

parse
  :  ~B
  ;

A : 'a';
B : 'b';
C : 'c';

以外の文字には一致しませ'b'が、トークン以外のBトークンには一致します。したがって、トークンA(文字'a') またはトークンC(文字) のいずれかに一致します'c'

.(DOT) 演算子にも同じロジックが適用されます。

  • lexer ルール内では、set の任意の文字に一致します\u0000..\uFFFF
  • パーサー規則の内部では、任意のトークン (任意のレクサー規則) に一致します。
于 2011-04-04T06:49:22.593 に答える
9

ANTLRは、文脈自由言語(CFL)用のパーサーを生成します。その文脈でnotは、は補完とand交差に変換されます。ただし、CFLは補集合と共通部分の下で閉じられません。つまり、not(rule)必ずしもCFGルールである必要はありません。

言い換えれば、適切な方法で実装することは不可能notandあるため、サポートされていません。

于 2011-04-03T21:21:43.557 に答える