我有这样的语法:
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))
您可以看到所有点都没有空格...
感谢将来的回答。
答案 0 :(得分:0)
如rici所评论:数字没有粘在一起。如果您在解析器上下文中调用toString()
或getText()
(或类似名称),它将仅返回其自身的字符串表示形式。该字符串表示形式将不包含空格,因为词法分析器会跳过这些空格。
上下文将具有单独的数字标记。它不会包含包含输入3010
的令牌,但是会包含2个令牌:30
和10
。
在访问者中设置一个断点,然后亲自看看。