Antlr4 ANTlr 4优先级的问题

Antlr4 ANTlr 4优先级的问题,antlr4,Antlr4,我不确定这是缺陷、限制还是我做错了……如果讨论这个问题的地点不对,我提前道歉 我试图更改解析“oil 0w prod或e12b/cpc”时使用的语法中的优先级,以便将其处理为“(oil 0w prod)或e12b/cpc”的等效项,而不是“oil 0w(prod或e12b/cpc)” 我的语法如下: parse : statement EOF ; statement : statement proximityOp statement # Proxi

我不确定这是缺陷、限制还是我做错了……如果讨论这个问题的地点不对,我提前道歉

我试图更改解析“oil 0w prod或e12b/cpc”时使用的语法中的优先级,以便将其处理为“(oil 0w prod)或e12b/cpc”的等效项,而不是“oil 0w(prod或e12b/cpc)”

我的语法如下:

parse           : statement EOF ;

statement       : statement proximityOp statement        # ProximityExpression
                | statement booleanOperator statement    # BooleanExpression
                | statement IN delimited                 # InExpression
                | delimited                              # NoSynonyms
                ;

delimited       : operand
                | operand delimiters+=DELIMITER values+=WORD
                ;

operand         : value                                  # SingleValue
                ;

value           : WORD                                   # Term
                ;

booleanOperator : AND|OR|NOT|LOW_RELATION|SAME_RELATION|HIGH_RELATION;

proximityOp     : W_PROX_OP|D_PROX_OP|S_PROX_OP|P_PROX_OP;

LBRACE      : '{';
RBRACE      : '}';
WS              : (' '|'\t'|'\r'|'\n') -> skip;
AND     : 'and' | 'AND' | '.' ;
OR      : 'or' | 'OR' | ',' ;
NOT     : 'not' | 'NOT' ;
DIGIT       : ('0'..'9');
W_PROX_OP   : DIGIT 'w' | DIGIT 'W' ;
S_PROX_OP   : DIGIT 's' | DIGIT 'S' ;
P_PROX_OP   : DIGIT 'p' | DIGIT 'P' ;
D_PROX_OP   : DIGIT 'd' | DIGIT 'D' ;
DELIMITER       : '/' | ':';
SYN_DELIM       : '|' ;
USE_SYN         : '~' ;
USE_QUERYLET    : '$' ;
LPAREN      : '(';
RPAREN      : ')';
EXCLUSION       : '!' ;
EQUALS      : '=';
GREATER     : '>';
LOWER       : '<';
MT_EQUALS       : GREATER EQUALS ;
LT_EQUALS       : LOWER EQUALS ;
DOUBLE_EQUALS   : EQUALS EQUALS ;
SAME_RELATION   : '=/same' | '=/SAME';
HIGH_RELATION   : '=/high' | '=/HIGH';
LOW_RELATION    : '=/low' | '=/LOW';
IN              : WS 'in' WS;

COMMENTED       : LBRACE .*? RBRACE -> skip ;

WORD            : OTHER+ ;

OTHER           : ~[\{\}()!,/:|\[\] "=<>\~$];
在记录ParserRuleContext时,无论语法中ProximityExpression和BooleanExpression的顺序如何,我都会得到以下结果:

parsing... oil 0w prod or e12b/cpc
IN.... ParseContext, depth=1: oil0wprodore12b/cpc<EOF>
IN.... ProximityExpressionContext, depth=2: oil0wprodore12b/cpc
IN.... NoSynonymsContext, depth=3: oil
IN.... DelimitedContext, depth=4: oil
IN.... SingleValueContext, depth=5: oil
IN.... TermContext, depth=6: oil
OUT... TermContext
OUT... SingleValueContext
OUT... DelimitedContext
OUT... NoSynonymsContext
IN.... ProximityOpContext, depth=3: 0w
OUT... ProximityOpContext
IN.... BooleanExpressionContext, depth=3: prodore12b/cpc
IN.... NoSynonymsContext, depth=4: prod
IN.... DelimitedContext, depth=5: prod
IN.... SingleValueContext, depth=6: prod
IN.... TermContext, depth=7: prod
OUT... TermContext
OUT... SingleValueContext
OUT... DelimitedContext
OUT... NoSynonymsContext
IN.... BooleanOperatorContext, depth=4: or
OUT... BooleanOperatorContext
IN.... NoSynonymsContext, depth=4: e12b/cpc
IN.... DelimitedContext, depth=5: e12b/cpc
IN.... SingleValueContext, depth=6: e12b
IN.... TermContext, depth=7: e12b
OUT... TermContext
OUT... SingleValueContext
OUT... DelimitedContext
OUT... NoSynonymsContext
OUT... BooleanExpressionContext
OUT... ProximityExpressionContext
解析。。。油0w prod或e12b/cpc
在里面ParseContext,深度=1:oil0wprodore12b/cpc
在里面ProximityExpressionContext,深度=2:oil0wprodore12b/cpc
在里面NosynonymContext,深度=3:油
在里面DelimitedContext,深度=4:油
在里面SingleValueContext,深度=5:油
在里面术语上下文,深度=6:油
出来术语上下文
出来单值上下文
出来分隔上下文
出来无语法上下文
在里面ProximityOpContext,深度=3:0w
出来近邻上下文
在里面BooleanExpressionContext,深度=3:prodore12b/cpc
在里面NosynonymContext,深度=4:prod
在里面DelimitedContext,深度=5:prod
在里面SingleValueContext,深度=6:prod
在里面术语上下文,深度=7:prod
出来术语上下文
出来单值上下文
出来分隔上下文
出来无语法上下文
在里面BooleanOperatorContext,深度=4:或
出来布尔运算符上下文
在里面无同步上下文,深度=4:e12b/cpc
在里面DelimitedContext,深度=5:e12b/cpc
在里面SingleValueContext,深度=6:e12b
在里面术语上下文,深度=7:e12b
出来术语上下文
出来单值上下文
出来分隔上下文
出来无语法上下文
出来布尔表达式上下文
出来ProximityExpressionContext
我已经在ANTlr 4版本和github的todays master中尝试过这一点


戴夫,你好。能否将这些输入字符串转换为令牌名称字符串?你的代币是什么现在还不清楚。也就是说,我太懒了,想不出来它应该是:单词W_PROX_OP WORD或单词分隔符WORD这是您想要的信息吗?您还有什么需要澄清的吗?
parsing... oil 0w prod or e12b/cpc
IN.... ParseContext, depth=1: oil0wprodore12b/cpc<EOF>
IN.... ProximityExpressionContext, depth=2: oil0wprodore12b/cpc
IN.... NoSynonymsContext, depth=3: oil
IN.... DelimitedContext, depth=4: oil
IN.... SingleValueContext, depth=5: oil
IN.... TermContext, depth=6: oil
OUT... TermContext
OUT... SingleValueContext
OUT... DelimitedContext
OUT... NoSynonymsContext
IN.... ProximityOpContext, depth=3: 0w
OUT... ProximityOpContext
IN.... BooleanExpressionContext, depth=3: prodore12b/cpc
IN.... NoSynonymsContext, depth=4: prod
IN.... DelimitedContext, depth=5: prod
IN.... SingleValueContext, depth=6: prod
IN.... TermContext, depth=7: prod
OUT... TermContext
OUT... SingleValueContext
OUT... DelimitedContext
OUT... NoSynonymsContext
IN.... BooleanOperatorContext, depth=4: or
OUT... BooleanOperatorContext
IN.... NoSynonymsContext, depth=4: e12b/cpc
IN.... DelimitedContext, depth=5: e12b/cpc
IN.... SingleValueContext, depth=6: e12b
IN.... TermContext, depth=7: e12b
OUT... TermContext
OUT... SingleValueContext
OUT... DelimitedContext
OUT... NoSynonymsContext
OUT... BooleanExpressionContext
OUT... ProximityExpressionContext