ANTLR4: Как отключить / включить пропуск пропусков в правиле? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть такая грамматика:

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 голосов
/ 30 мая 2019

Как уже прокомментировал rici: числа не склеены. Если вы вызовете toString() или getText() (или подобное) в контексте синтаксического анализатора, он просто вернет строковое представление самого себя. Это строковое представление не будет включать пробелы, потому что они пропускаются лексером.

Контекст будет иметь отдельные токены для чисел. У него не будет токена, содержащего входные данные 3010, но он будет содержать 2 токена для него: 30 и 10.

Установите точку останова у своего посетителя и убедитесь сами.

...