ANTLR4:如何 disable/enable 跳过规则中的空格?
ANTLR4: How to disable/enable skip of the whitespaces in the rule?
我有这样的语法:
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)))
我会这样获取visitor中polygonType的值
POLYGON((3010,4040,2040,1020,3010))
如您所见,所有点都没有空格...
感谢未来的回答。
正如 rici 已经评论的那样:数字没有粘在一起。如果您在解析器上下文中调用 toString()
或 getText()
(或类似的),它将只是 return 自身的字符串表示形式。此字符串表示将不包含空格,因为词法分析器会跳过这些空格。
上下文将有单独的数字标记。它不会有包含输入 3010
的标记,但会包含 2 个标记:30
和 10
。
在您的访问者中设置断点并亲自查看。
我有这样的语法:
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)))
我会这样获取visitor中polygonType的值
POLYGON((3010,4040,2040,1020,3010))
如您所见,所有点都没有空格...
感谢未来的回答。
正如 rici 已经评论的那样:数字没有粘在一起。如果您在解析器上下文中调用 toString()
或 getText()
(或类似的),它将只是 return 自身的字符串表示形式。此字符串表示将不包含空格,因为词法分析器会跳过这些空格。
上下文将有单独的数字标记。它不会有包含输入 3010
的标记,但会包含 2 个标记:30
和 10
。
在您的访问者中设置断点并亲自查看。