2016-11-02 31 views
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') 
    ) 
    ; 

答えて

0

、ルール(トークン)が矛盾する場合には優先されますので、あなただけのUNQUOTEDの上に「TODAY」のためのトークンを定義することができ、それが一般的なのではなく、文字列と一致する必要がありますUNQUOTEDトークン。

+0

ああ、それは本当です、多分私の例は悪かったです。私がそれを賢明に働かせることができなかった他のケースがあります。たとえば、私は "W /"トークンを持っています。このトークンは、 "w/3"のように続くことがあります。私はすべてのものを単一のトークンにすることができますが、それからその番号を解析しなければなりません。だから私はちょうど "W /"トークンを持ってみましたが、 "w/3"は依然としてUNQUOTEDになりました。 – Trejkaz

+0

ああ、私はあなたが簡単なやり方でできることを達成しようとしていたのではないかと心配しました。 –

+0

うん。私たちがコードで使用しているドッジーな先読みのトリックさえ、今のところそれを使う必要がないときには、今日のために使っているようです。 > _>そうすれば、私は他の人を修正できるかどうかを修正するでしょう。私たちのキーワードのほとんどは、一番上に宣言されています。 – Trejkaz

関連する問題