~
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 ;