我在java中使用ANLTR4,我可以解析像这样的WKT多边形字符串
polygon((20 30, 30 40, 50 60, 20 30))
有了这个Lexer:
POLYGON: ('polygon'|'POLYGON')'(('[0-9:,-.eTZ" ]+'))';
因为polygon(())中的数字可以是datetime或float,那么它包含一些字符。
但是,我无法像这样解析内部多边形的多边形
polygon((20 30, 30 40, 50 60, 20 30), (20 30, 30 40, 50 60, 20 30), (20 30, 30 40, 50 60, 20 30))
当我尝试在Lexer中添加()时,例如:
POLYGON: ('polygon'|'POLYGON')'(('[0-9:,-.eTZ" \(\)]+'))';
Java抛出异常,无法找到“)”。
如何让ANTLR4解析多边形((),(),(),...)?
答案 0 :(得分:2)
我认为你不应该只用词法分析器来做。您应该使用词法分析器分成符号;例如'polygon'
,'('
,')'
,','
,<number>
,<date>
等等。然后实现语法来处理大规模语法; e.g。
<polygon> ::= 'polygon' '(' <list> ')'
<list> ::= '(' ')' |
'(' <element> ( ',' <element> ) * ')'
<element> ::= <number> | <date>
(我正在使用的元语法是某种EBNF ....)
使用没有语法的基于正则表达式的词法分析器的问题是:
答案 1 :(得分:1)
词法分析器应该只定义语言的基本构建块。多边形,列表等应该被定义为解析器规则。
这样的事情应该让你开始:
grammar WKT;
parse
: polygon EOF
;
polygon
: POLYGON '(' ( points ( ',' points )* )? ')'
;
points
: '(' ( value value ( ',' value value )* )? ')'
;
value
: INT
| FLOAT
| DATE_TIME
;
POLYGON
: [pP] [oO] [lL] [yY] [gG] [oO] [nN]
;
INT
: DIGITS
;
FLOAT
: DIGITS '.' DIGITS
;
DATE_TIME
: D D D D '-' D D '-' D D 'T' D D ':' D D ':' D D [+-] D D ':' D D
| D D D D '-' D D '-' D D 'T' D D ':' D D ':' D D 'Z'
| D D D D D D D D 'T' D D D D D D 'Z'
;
SPACES
: [ \t\r\n]+ -> skip
;
fragment DIGITS
: D+
;
fragment D
: [0-9]
;
以下输入:POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))
将按以下方式解析: