从自定义MODE </eof> </eof>内部到达<eof>时出现ANTlr4 <eof>问题

时间:2013-05-30 11:09:01

标签: antlr4

我的语法中有几种不同的模式,并且发现如果在其中一种模式中达到<EOF>,则当前文本会合并到<EOF>标记内。

例如,如果我传递格式错误的表达,例如大礼帽&#34;通过语法} WORD WORD <EOF>代替WORD WORD QUOTE IN_QUOTE {{ 1}}

<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; 是否有首选方法?

我已尝试使用ANTlr 4版本和今天的github大师,并获得相同的结果。

戴夫

1 个答案:

答案 0 :(得分:1)

more命令指示词法分析器不发出“部分”令牌。 QUOTEIN_QUOTE部分将始终与以下令牌合并,而不是向您提供QUOTATIONQUOTEIN_QUOTE令牌,单个QUOTATION令牌或根本没有。

至少有两种方法可以解决这种情况。

  1. 删除more命令,并在解析器中单独处理QUOTEIN_QUOTEQUOTATION

  2. 保留more命令,并在IN_QUOTE令牌后将以下规则添加到词法分析器。对于您的输入,这会产生令牌WORD WORD INCOMPLETE_QUOTE

    INCOMPLETE_QUOTE
        :   EOF -> popMode
        ;