0
私はこのトークンを持っていますリテラル文字列 "TODAY"を除く任意の非特殊文字列にマッチさせたいと思います。ANTLRのレクサー否定 - なぜ二重否定は働かないのですか?
ANTLRはお尻でこの痛みを行います
UNQUOTED :
(~('T'|'t'|~UnquotedStartChar) UnquotedChar*
(~('O'|'o'|~UnquotedChar) UnquotedChar*
| ('O'|'o')
(~('D'|'d'|~UnquotedChar) UnquotedChar*
| ('D'|'d')
(~('A'|'a'|~UnquotedChar) UnquotedChar*
| ('A'|'a')
(~('Y'|'y'|~UnquotedChar) UnquotedChar*
)?
)?
)?
)?
)
;
私は~('T'|'t'|~UnquotedStartChar)
で二重否定することによって利発されていた考え出し - それは「T」、「T」ではないすべてのものと一致している必要があり、私はそれが動作するはずですが、私は実際にそれをコンパイルしようとすると、私はこのエラーメッセージが表示されます:
error(100): antlr/QueryParser.g:0:1: syntax error: buildnfa: MismatchedTreeNodeException(16!=32)
UnquotedStartChar
は、それ自体かなり混乱しています。 ..しかし、私はそれがまだ関連性があると完全には分かっていない。とにかく最初の2つのレベルがあります。先に定義されているレクサー文法で
fragment
UnquotedStartChar
: EscapeSequence
| ~(ProhibitedAtStartOfUnquoted)
;
fragment
ProhibitedAtStartOfUnquoted
: ProhibitedInUnquoted
| Slash | PLUS | MINUS | DOLLAR;
fragment
EscapeSequence
: Backslash
('u' HexDigit HexDigit HexDigit HexDigit
| ~('u')
)
;
ああ、それは本当です、多分私の例は悪かったです。私がそれを賢明に働かせることができなかった他のケースがあります。たとえば、私は "W /"トークンを持っています。このトークンは、 "w/3"のように続くことがあります。私はすべてのものを単一のトークンにすることができますが、それからその番号を解析しなければなりません。だから私はちょうど "W /"トークンを持ってみましたが、 "w/3"は依然としてUNQUOTEDになりました。 – Trejkaz
ああ、私はあなたが簡単なやり方でできることを達成しようとしていたのではないかと心配しました。 –
うん。私たちがコードで使用しているドッジーな先読みのトリックさえ、今のところそれを使う必要がないときには、今日のために使っているようです。 > _>そうすれば、私は他の人を修正できるかどうかを修正するでしょう。私たちのキーワードのほとんどは、一番上に宣言されています。 – Trejkaz