20

~ANTLR のレクサーおよびパーサー規則で、否定メタ文字 をどのように使用できますか?

4

1 に答える 1

36

否定は、レクサーおよびパーサー規則内で発生する可能性があります。

レクサー ルール内では文字を否定でき、パーサー ルール内ではトークン (レクサー ルール) を否定できます。ただし、レクサー ルールとパーサー ルールの両方で、それぞれ単一の文字または単一のトークンのいずれかのみを否定できます。

いくつかの例:

レクサー規則

小文字の ASCII 文字以外の 1 つ以上の文字に一致させるには、次のようにします。

NO_LOWERCASE : ~('a'..'z')+ ;

(negation-meta-char, ~, は よりも優先順位が高い+ため、上記の規則は と等しくなり(~('a'..'z'))+ます)

'a'..'z'は単一の文字に一致する (したがって、否定される可能性がある)ことに注意してください。ただし、次の規則は無効です。

ANY_EXCEPT_AB : ~('ab') ;

(当然) 2 文字に一致するため'ab'、否定することはできません。ではなく 2 文字で構成されるトークンを一致させる'ab'には、次の手順を実行する必要があります。

ANY_EXCEPT_AB 
  :  'a' ~'b' // any two chars starting with 'a' followed by any other than 'b'
  |  ~'a' .   // other than 'a' followed by any char
  ;

パーサー規則

パーサー ルール内で~、特定のトークンまたは複数のトークンを否定します。たとえば、次のトークンが定義されているとします。

A : 'A';
B : 'B';
C : 'C';
D : 'D';
E : 'E';

以外の任意のトークンに一致させたい場合はA、次のようにします。

p : ~A ;

Bと以外の任意のトークンに一致させたい場合はD、次のようにします。

p : ~(B | D) ;

Aただし、 が続く以外の任意の 2 つのトークンを一致させたい場合はB、次のことはできません。

p : ~(A B) ;

レクサー規則と同様に、複数のトークンを否定することはできません。上記を達成するには、次のことを行う必要があります。

P
  :  A ~B
  |  ~A .
  ; 

.パーサー ルール内の (DOT) char は、レクサー ルール内の場合とは異なり、どの文字とも一致しないことに注意してください。パーサー ルール内では、任意のトークン (この場合はABCDまたは) に一致します。E

パーサー規則を無効にすることはできないことに注意してください。以下は違法です。

p : ~a ;
a : A  ;
于 2011-11-27T10:30:46.110 に答える