【问题标题】:ANTLR4: How to disable/enable skip of the whitespaces in the rule?ANTLR4:如何禁用/启用跳过规则中的空格?
【发布时间】:2019-05-30 00:12:43
【问题描述】:

我有这样的语法:

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] ;

问题是我需要禁用点规则中空格的全局跳过,因为我什么时候会用这样的值测试这样的语法

(Location: POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10)))

我会像这样在访问者中获取多边形类型的值

POLYGON((3010,4040,2040,1020,3010))

如您所见,所有点都没有空格...

感谢您以后的回答。

【问题讨论】:

  • 我想你会发现你的访问者正确地看到了每个点的两个整数。它会将它们打印出来,它们之间没有空格,但这应该很容易在必要时修复。

标签: parsing antlr antlr4


【解决方案1】:

正如 rici 已经评论的那样:数字没有粘在一起。如果您在解析器上下文中调用toString()getText()(或类似的),它将简单地返回其自身的字符串表示。此字符串表示将不包含空格,因为词法分析器会跳过这些空格。

上下文将有单独的数字标记。它不会有一个包含输入 3010 的标记,但会包含 2 个标记:3010

在访问者中设置断点并亲自查看。

【讨论】:

  • 非常感谢@rici 和 Bart Kiers。我认为有一些解决方案可以在语法中解决这种情况,而无需在访问者中进行编码。看起来我别无选择,应该修复访客:(
猜你喜欢
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多