0

私の文法にはいくつかの異なるモードがあり、これらのモードのいずれかで に到達すると、現在のテキストがトークン<EOF>内に組み込まれることがわかりました。<EOF>

たとえば、シルクハットのテールなどの不正な表現を文法に渡すと、WORD WORD <EOF>代わりにWORD WORD QUOTE IN_QUOTE <EOF>

ctx = {org.epo.presto.pql.grammar.PQL$ParseContext@520}"[]"
 children = {java.util.ArrayList@869} size = 2
  [0] = {org.epo.presto.pql.grammar.PQL$ProximityExpressionContext@1022}"[24]"
   _p = 0
   children = {java.util.ArrayList@1033} size = 2
   start = {org.antlr.v4.runtime.CommonToken@881}"[@0,0:2='top',<34>,1:0]"
   stop = {org.antlr.v4.runtime.CommonToken@882}"[@1,4:7='hat',<34>,1:4]"
   altNum = 0
   exception = null
   parent = {org.epo.presto.pql.grammar.PQL$ParseContext@520}"[]"
   invokingState = 24
  [1] = {org.antlr.v4.runtime.tree.TerminalNodeImpl@1023}"<EOF>"
   symbol = {org.antlr.v4.runtime.CommonToken@1028}"[@2,8:14='\" tails',<-1>,1:8]"
   parent = {org.epo.presto.pql.grammar.PQL$ParseContext@520}"[]"

私の文法の関連セクションは次のとおりです。

QUOTE           : '"' -> more, pushMode(QUOTED);
OTHER           : ~[\{\}()!,./:|\[\] "=<>\~$];
WORD            : OTHER+;

mode QUOTED;
QUOTATION       : '"' -> popMode;
IN_QUOTE        : ~["] -> more;

<EOF>モード内で処理するための好ましい方法はありますか?

ANTlr 4 リリースと github の今日のマスターの両方でこれを試しましたが、同じ結果が得られました。

デイブ

4

1 に答える 1

1

このmoreコマンドは、「部分」トークンを発行しないようにレクサーに指示します。QUOTEIN_QUOTE、およびQUOTATIONトークンを与える代わりに、QUOTEおよびのIN_QUOTE部分は常に次のトークンとマージされ、トークンが 1 つになるQUOTATIONか、まったくなくなる。

この状況に対処するには、少なくとも 2 つの選択肢があります。

  1. moreコマンドを削除しQUOTE、 、IN_QUOTE、およびQUOTATIONパーサーで個別に処理します。

  2. コマンドはそのままにmoreして、レクサーのIN_QUOTEトークンの後に次のルールを追加します。入力の場合、これにより tokens が生成されますWORD WORD INCOMPLETE_QUOTE

    INCOMPLETE_QUOTE
        :   EOF -> popMode
        ;
    
于 2013-05-30T13:49:42.947 に答える