ANTLR4:如何解析WKT多边形字符串?

时间:2018-01-25 11:28:31

标签: java regex parsing antlr antlr4

我在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解析多边形((),(),(),...)?

2 个答案:

答案 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))将按以下方式解析:

enter image description here