ANTLR4:如何禁用/启用规则中的空格跳过?

时间:2019-05-30 00:12:44

标签: parsing antlr antlr4

我有这样的语法:

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)))

我会这样在访问者中获取polygonType的值

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

您可以看到所有点都没有空格...

感谢将来的回答。

1 个答案:

答案 0 :(得分:0)

如rici所评论:数字没有粘在一起。如果您在解析器上下文中调用toString()getText()(或类似名称),它将仅返回其自身的字符串表示形式。该字符串表示形式将不包含空格,因为词法分析器会跳过这些空格。

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

在访问者中设置一个断点,然后亲自看看。