簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM