0

我的语法中有几种不同的模式,并且发现如果<EOF>在其中一种模式下达到,则当前文本将包含在<EOF>令牌中。

例如,如果我通过语法传递一个格式错误的表达式,例如top hat" tailsWORD 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 的今天的 master 中尝试过这个并得到相同的结果。

戴夫

4

1 回答 1

1

more命令指示词法分析器不发出“部分”标记。而不是给你QUOTE,IN_QUOTEQUOTATION标记,QUOTEandIN_QUOTE部分将始终与以下标记合并,给你一个QUOTATION标记或根本没有。

对于这种情况,您至少有两种选择。

  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 回答