当前位置: 首页 > 知识库问答 >
问题:

ANTLR4:如何为同一个标签在规则中设置不同的上下文?

罗业
2023-03-14

我有这样的语法:

grammar SearchQuery;

queryDeclaration                        : predicateGroupItem predicateGroupItemWithBooleanOperator* ;
predicateGroupItemWithBooleanOperator   : groupOperator predicateGroupItem ;
predicateGroupItem                      : LEFT_BRACKET variable variableDelimiter
                                                expression expressionWithBoolean* RIGHT_BRACKET ;

variable                                : VARIABLE_STRING ;
variableDelimiter                       : VAR_DELIMITER  ;

expressionWithBoolean                   : boolOperator expression ;

expression                              : value ;

value                                   : polygonType;

boolOperator                            : or
                                        ;

or                                      : OR ;

groupOperator                           : AND ;

polygonType                             : POLYGON LEFT_BRACKET pointList (POLYGON_DELIMITER pointList)* RIGHT_BRACKET ;
longType                                : LONG ;
doubleType                              : DOUBLE ;

pointList                               : point
                                        | LEFT_BRACKET point ( POLYGON_DELIMITER point)* RIGHT_BRACKET
                                        ;

point                                   : latitude longitude ;

latitude                                : longType
                                        | doubleType
                                        ;

longitude                               : longType
                                        | doubleType
                                        ;

POLYGON                                 : [pP] [oO] [lL] [yY] [gG] [oO] [nN] ;


LONG                                    : DIGIT+ ;

DOUBLE                                  : DIGIT+ '.' DIGIT*
                                        | '.' DIGIT+
                                        ;

AND                                     : [aA] [nN] [dD] ;
OR                                      : COMMA
                                        | [oO] [rR]
                                        ;

VARIABLE_STRING                         : [a-zA-Z0-9.]+ ;
COMMA                                   : ',' ;
POLYGON_DELIMITER                       : ';' ;
VAR_DELIMITER                           : ':' ;

RIGHT_BRACKET                           : ')' ;
LEFT_BRACKET                            : '(' ;

WS                                      : [ \t\r\n]+ -> skip ;

fragment DIGIT                          : [0-9] ;

问题是,我不能在polygonType、pointList规则(除了POLYGON_分隔符,我需要使用逗号)和boolOperator规则(使用逗号)中同时使用逗号标记不同的规则。换句话说,如果我们将POLYGON_分隔符改为逗号,并用这样的值测试这样的语法

(polygons: polygon(20 30.4, 23.4 23),
           polygon(20 30.4, 23.4 23),
           polygon(20 30.4, 23.4 23))

我们将得到一个错误

mismatch input: ',' expecting {',', ')'}

如果有人能帮我理解这个问题,我会很高兴的。

另外,如果我们不改变当前语法,测试的值是

(poligons: polygon(20 30.4; 23.4 23),
           polygon(20 30.4; 23.4 23),
           polygon(20 30.4; 23.4 23))

共有1个答案

江光明
2023-03-14

由于这些规则:

OR                                      : COMMA
                                        | [oO] [rR]
                                        ;

COMMA                                   : ',' ;

lexer永远不会生成逗号标记,因为它已经与标记匹配。因为是在逗号之前定义的,所以它具有优先权。

这就是错误消息不匹配输入:','期望 {',', ')'}的真正含义。换句话说:不匹配输入:或期望{COMMA,RIGHT_BRACKET}

您应该做的是(如果OR运算符可以是“或”或“,”),让解析器规则匹配逗号

or                                      : OR
                                        | COMMA
                                        ;

OR                                      : [oO] [rR]
                                        ;

COMMA                                   : ',' ;

 类似资料:
  • 如何在NGINX配置中为两个位置设置相同的规则? 我尝试了以下方法 但是nginx reload抛出了这个错误:

  • 在我的代码中,我想区分相等和不相等的大小写。我想知道如何有效地做到这一点。目前,我以以下方式实现访问者: 我不确定这是否非常有效,因为/调用,它基本上循环所有子级。这样做了多次,所以我不确定这是否明智。另外,我调用两次。关于后者,我知道我可以缓存在一个局部变量中,但如果需要考虑多个子规则,这将很快导致相当丑陋的代码。 有没有办法更有效地做到这一点?基于某种令牌标识符或分支标识符的switch/ca

  • 我目前正在尝试创建一个选项卡视图,其中每个选项卡打开不同的布局。我正在使用android.support.design.widget.TabLayout,并且我使用适配器成功地将其与pagerView链接起来。现在,在myFragment类中,如果我调用onCreateView并膨胀布局,则布局(fragment_main)将显示在所有选项卡中。 我有3个片段连接3个标签。现在如何为每个片段设置不

  • 我有以下具有内部跨度的div: 和相关CSS: 问题是字体大小是良好的分辨率约640 x 320在横向,但如果我试图设置的分辨率设备,例如1920 x 1080,我总是得到的字体小于640 px分辨率(见下图)。 我应该设置什么以得到相同的尺寸和比例的不同的尺寸? 视口设置为: 车身: 整个模板为: 谢谢你的建议。

  • 我有两个checkstyle文件用于目标源,另一个用于测试源。使用intellij的Checkstyle-Idea插件,我只能为整个项目配置一组规则。 是否可以为不同的作用域配置不同的CheckStyle?

  • 请考虑这个非常简化的示例,其中应该匹配以下形式的输入 如果您需要一个简单的实际应用程序,那么您可以考虑Java中的字符串。其中一些可能是需要用完全不同的解析器解析的regex。它类似于您可以在IDEA内部使用的注入语言。 问:在ANTRL4中是否有一种惯用的方法来用不同的语法解析特定的规则?最好的情况是,我可以在语法级别上指定它,以便生成的AST是包含注入语言的子树的外部语言的组合。