~ANTLR のレクサーおよびパーサー規則で、否定メタ文字 をどのように使用できますか?
1 に答える
否定は、レクサーおよびパーサー規則内で発生する可能性があります。
レクサー ルール内では文字を否定でき、パーサー ルール内ではトークン (レクサー ルール) を否定できます。ただし、レクサー ルールとパーサー ルールの両方で、それぞれ単一の文字または単一のトークンのいずれかのみを否定できます。
いくつかの例:
レクサー規則
小文字の 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 は、レクサー ルール内の場合とは異なり、どの文字とも一致しないことに注意してください。パーサー ルール内では、任意のトークン (この場合はA、B、C、Dまたは) に一致します。E
パーサー規則を無効にすることはできないことに注意してください。以下は違法です。
p : ~a ;
a : A  ;