options { STATIC = false; // 成员与方法不生成为静态 UNICODE_INPUT = true; // 支持中文解析 JDK_VERSION = "1.8"; // JDK版本为1.8 IGNORE_CASE = true; // 不区分大小写 } PARSER_BEGIN(SGisWktParser) package com.persagy.gis.parser; import com.persagy.gis.entity.*; import com.persagy.gis.enums.SGisGeometryType; import java.util.*; /** * wkt 格式语法解析器 * * @author 张维新 */ public class SGisWktParser { public SAbstractGisGeometry parser() throws ParseException { return passerGeometry(); } } PARSER_END(SGisWktParser) SKIP: { <[" ", "\t", "\r", "\n"]> } TOKEN: /* 符号 */ { < LPAREN : "(" > | < RPAREN : ")" > | < COMMA : "," > } TOKEN: /* 关键字 */ { < POINT : "POINT" > | < MULTIPOINT : "MULTIPOINT" > | < LINESTRING : "LINESTRING" > | < MULTILINESTRING : "MULTILINESTRING" > | < POLYGON : "POLYGON" > | < MULTIPOLYGON : "MULTIPOLYGON" > } TOKEN: /* 标识符 */ { < NUM : ("+"|"-")?(["1"-"9"]()*("."()+)?)|"0" > | < #DIGIT : ["0"-"9"] > } /** 解析几何对象 */ SAbstractGisGeometry passerGeometry(): { SAbstractGisGeometry geometry; } { ( "Z"? { geometry = passerPointArgs(); } | "Z"? { geometry = passerMultiPointArgs(); } | "Z"? { geometry = passerLineStringArgs(); } | "Z"? { geometry = passerMultiLineStringArgs(); } | "Z"? { geometry = passerPolygonArgs(); } | "Z"? { geometry = passerMultiPolygonArgs(); } ) { return geometry; } } /** 解析 Point 参数 */ SGisPoint passerPointArgs(): { SGisPoint point; SGisPosition pos; } { { point = new SGisPoint(); } ( pos = passerPosition() { point.setCoordinates(pos); } )? { return point; } } /** 解析 MultiPoint 参数 */ SGisMultiPoint passerMultiPointArgs(): { SGisMultiPoint multiPoint; ArrayList posArr; } { { multiPoint = new SGisMultiPoint(); } ( posArr = passerPositionArray() { multiPoint.setCoordinates(posArr); } )? { return multiPoint; } } /** 解析 LineString 参数 */ SGisLineString passerLineStringArgs(): { SGisLineString line; ArrayList posArr; } { { line = new SGisLineString(); } ( posArr = passerPositionArray() { line.setCoordinates(posArr); } )? { return line; } } /** 解析 MultiLineString 参数 */ SGisMultiLineString passerMultiLineStringArgs(): { SGisMultiLineString multiLine; ArrayList> posArr2; } { { multiLine = new SGisMultiLineString(); } ( posArr2 = passerPositionArray2() { multiLine.setCoordinates(posArr2); } )? { return multiLine; } } /** 解析 Polygon 参数 */ SGisPolygon passerPolygonArgs(): { SGisPolygon polygon; ArrayList> posArr2; } { { polygon = new SGisPolygon(); } ( posArr2 = passerPositionArray2() { polygon.setCoordinates(posArr2); } )? { return polygon; } } /** 解析 MultiPolygon 参数 */ SGisMultiPolygon passerMultiPolygonArgs(): { SGisMultiPolygon multiPolygon; ArrayList>> posArr3; } { { multiPolygon = new SGisMultiPolygon(); } ( posArr3 = passerPositionArray3() { multiPolygon.setCoordinates(posArr3); } )? { return multiPolygon; } } /** 解析二维 Position 对象数组 */ ArrayList>> passerPositionArray3(): { ArrayList> posArray; ArrayList>> positionList = new ArrayList>>(); } { posArray = passerPositionArray2() { positionList.add(posArray); } ( posArray = passerPositionArray2() { positionList.add(posArray); } )* { return positionList; } } /** 解析二维 Position 对象数组 */ ArrayList> passerPositionArray2(): { ArrayList posArray; ArrayList> positionList = new ArrayList>(); } { posArray = passerPositionArray() { positionList.add(posArray); } ( posArray = passerPositionArray() { positionList.add(posArray); } )* { return positionList; } } /** 解析 Position 对象数组 */ ArrayList passerPositionArray(): { SGisPosition pos; ArrayList positionList = new ArrayList(); } { pos = passerPosition() { positionList.add(pos); } ( pos = passerPosition() { positionList.add(pos); } )* { return positionList; } } /** 解析 Position 对象 */ SGisPosition passerPosition(): { Double pos; ArrayList valList = new ArrayList(); } { pos = parserNum() { valList.add(pos); } ( pos = parserNum() { valList.add(pos); } )* { if (valList.size() >= 3) { return new SGisPosition(valList.get(0), valList.get(1), valList.get(2)); } if (valList.size() >= 2) { return new SGisPosition(valList.get(0), valList.get(1), 0.0); } if (valList.size() >= 1) { return new SGisPosition(valList.get(0), 0.0, 0.0); } return new SGisPosition(); } } /** 解析数 */ Double parserNum(): { Token t; } { t = { return Double.parseDouble(t.image); } }