[英]ANTLR4: How to parse a WKT polygon string?
我在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可以解析多邊形((),(),(),...)?
我認為你不應該只用詞法分析器來做。 您應該使用詞法分析器分成符號; 例如'polygon'
, '('
, ')'
, ','
, <number>
, <date>
等等。 然后實現語法來處理大規模語法; 例如
<polygon> ::= 'polygon' '(' <list> ')'
<list> ::= '(' ')' |
'(' <element> ( ',' <element> ) * ')'
<element> ::= <number> | <date>
(我正在使用的元語法是某種EBNF ....)
使用沒有語法的基於正則表達式的詞法分析器的問題是:
詞法分析者應該只定義語言的基本構建塊。 應將多邊形,列表等定義為解析器規則。
這樣的事情應該讓你開始:
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))
將被解析如下:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.