我的语法中有几种不同的模式,并且发现如果在其中一种模式中达到<EOF>
,则当前文本会合并到<EOF>
标记内。
例如,如果我传递格式错误的表达,例如大礼帽&#34;通过语法1>} 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大师,并获得相同的结果。
戴夫
答案 0 :(得分:1)
more
命令指示词法分析器不发出“部分”令牌。 QUOTE
和IN_QUOTE
部分将始终与以下令牌合并,而不是向您提供QUOTATION
,QUOTE
和IN_QUOTE
令牌,单个QUOTATION
令牌或根本没有。
至少有两种方法可以解决这种情况。
删除more
命令,并在解析器中单独处理QUOTE
,IN_QUOTE
和QUOTATION
。
保留more
命令,并在IN_QUOTE
令牌后将以下规则添加到词法分析器。对于您的输入,这会产生令牌WORD
WORD
INCOMPLETE_QUOTE
。
INCOMPLETE_QUOTE
: EOF -> popMode
;