]> granicus.if.org Git - postgis/commitdiff
Enhance geometry parser so that it keeps track of the current position during parsing...
authorMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Mon, 8 Sep 2008 20:16:04 +0000 (20:16 +0000)
committerMark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Mon, 8 Sep 2008 20:16:04 +0000 (20:16 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@2947 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/wktparse.lex
liblwgeom/wktparse.y

index 6ab7f4ebfa22906501e6615d149c063e936ceaa8..6db61442a81a3d8aebe8445e291044a382b54442 100644 (file)
@@ -22,49 +22,52 @@ static YY_BUFFER_STATE buf_state;
    void close_parser() { lwg_parse_yy_delete_buffer(buf_state); }
    int lwg_parse_yywrap(void){ return 1; }
 
+/* Macro to keep track of the current parse position */
+#define UPDATE_YYLLOC() (lwg_parse_yylloc.last_column += yyleng)
+
 %}
 
 %%
 
-<vals_ok>[-|\+]?[0-9]+(\.[0-9]+)?([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); return VALUE; }
-<vals_ok>[-|\+]?(\.[0-9]+)([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); return VALUE; }
+<vals_ok>[-|\+]?[0-9]+(\.[0-9]+)?([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); UPDATE_YYLLOC(); return VALUE; }
+<vals_ok>[-|\+]?(\.[0-9]+)([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); UPDATE_YYLLOC(); return VALUE; }
 
 <INITIAL>00[0-9A-F]* {  lwg_parse_yylval.wkb=lwg_parse_yytext; return WKB;}
 <INITIAL>01[0-9A-F]* {  lwg_parse_yylval.wkb=lwg_parse_yytext; return WKB;}
 
-<*>POINT       { return POINT; }
-<*>POINTM      { return POINTM; }
-<*>LINESTRING { return LINESTRING; }
-<*>LINESTRINGM { return LINESTRINGM; }
-<*>CIRCULARSTRING { return CIRCULARSTRING; }
-<*>CIRCULARSTRINGM { return CIRCULARSTRINGM; }
-<*>POLYGON { return POLYGON; }
-<*>POLYGONM { return POLYGONM; }
-<*>COMPOUNDCURVE { return COMPOUNDCURVE; }
-<*>COMPOUNDCURVEM { return COMPOUNDCURVEM; }
-<*>CURVEPOLYGON { return CURVEPOLYGON; }
-<*>CURVEPOLYGONM { return CURVEPOLYGONM; }
-<*>MULTIPOINT { return MULTIPOINT; }
-<*>MULTIPOINTM { return MULTIPOINTM; }
-<*>MULTILINESTRING { return MULTILINESTRING; }
-<*>MULTILINESTRINGM { return MULTILINESTRINGM; }
-<*>MULTICURVE { return MULTICURVE; }
-<*>MULTICURVEM { return MULTICURVEM; }
-<*>MULTIPOLYGON { return MULTIPOLYGON; }
-<*>MULTIPOLYGONM { return MULTIPOLYGONM; }
-<*>MULTISURFACE { return MULTISURFACE; }
-<*>MULTISURFACEM { return MULTISURFACEM; }
-<*>GEOMETRYCOLLECTION { return GEOMETRYCOLLECTION; }
-<*>GEOMETRYCOLLECTIONM { return GEOMETRYCOLLECTIONM; }
-<*>SRID { BEGIN(vals_ok); return SRID; }
-<*>EMPTY { return EMPTY; }
+<*>POINT       { UPDATE_YYLLOC(); return POINT; }
+<*>POINTM      { UPDATE_YYLLOC(); return POINTM; }
+<*>LINESTRING { UPDATE_YYLLOC(); return LINESTRING; }
+<*>LINESTRINGM { UPDATE_YYLLOC(); return LINESTRINGM; }
+<*>CIRCULARSTRING { UPDATE_YYLLOC(); return CIRCULARSTRING; }
+<*>CIRCULARSTRINGM { UPDATE_YYLLOC(); return CIRCULARSTRINGM; }
+<*>POLYGON { UPDATE_YYLLOC(); return POLYGON; }
+<*>POLYGONM { UPDATE_YYLLOC(); return POLYGONM; }
+<*>COMPOUNDCURVE { UPDATE_YYLLOC(); return COMPOUNDCURVE; }
+<*>COMPOUNDCURVEM { UPDATE_YYLLOC(); return COMPOUNDCURVEM; }
+<*>CURVEPOLYGON { UPDATE_YYLLOC(); return CURVEPOLYGON; }
+<*>CURVEPOLYGONM { UPDATE_YYLLOC(); return CURVEPOLYGONM; }
+<*>MULTIPOINT { UPDATE_YYLLOC(); return MULTIPOINT; }
+<*>MULTIPOINTM { UPDATE_YYLLOC(); return MULTIPOINTM; }
+<*>MULTILINESTRING { UPDATE_YYLLOC(); return MULTILINESTRING; }
+<*>MULTILINESTRINGM { UPDATE_YYLLOC(); return MULTILINESTRINGM; }
+<*>MULTICURVE { UPDATE_YYLLOC(); return MULTICURVE; }
+<*>MULTICURVEM { UPDATE_YYLLOC(); return MULTICURVEM; }
+<*>MULTIPOLYGON { UPDATE_YYLLOC(); return MULTIPOLYGON; }
+<*>MULTIPOLYGONM { UPDATE_YYLLOC(); return MULTIPOLYGONM; }
+<*>MULTISURFACE { UPDATE_YYLLOC(); return MULTISURFACE; }
+<*>MULTISURFACEM { UPDATE_YYLLOC(); return MULTISURFACEM; }
+<*>GEOMETRYCOLLECTION { UPDATE_YYLLOC(); return GEOMETRYCOLLECTION; }
+<*>GEOMETRYCOLLECTIONM { UPDATE_YYLLOC(); return GEOMETRYCOLLECTIONM; }
+<*>SRID { BEGIN(vals_ok); UPDATE_YYLLOC(); return SRID; }
+<*>EMPTY { UPDATE_YYLLOC(); return EMPTY; }
 
-<*>\(  { BEGIN(vals_ok); return LPAREN; }
-<*>\)  { return RPAREN; }
-<*>,   { return COMMA ; }
-<*>=   { return EQUALS ; }
-<*>;   { BEGIN(0); return SEMICOLON; }
-<*>[ \t\n\r]+ /*eat whitespace*/
+<*>\(  { BEGIN(vals_ok); UPDATE_YYLLOC(); return LPAREN; }
+<*>\)  { UPDATE_YYLLOC(); return RPAREN; }
+<*>,   { UPDATE_YYLLOC(); return COMMA ; }
+<*>=   { UPDATE_YYLLOC(); return EQUALS ; }
+<*>;   { BEGIN(0); UPDATE_YYLLOC(); return SEMICOLON; }
+<*>[ \t\n\r]+ /*eat whitespace*/ { UPDATE_YYLLOC(); }
 <*>.   { return lwg_parse_yytext[0]; }
 
 %%
index d97cbcfeb60fb78ca28e61931e6a49aecbc0a6fc..a06a83817266c32c183eab599b54c649cec9739d 100644 (file)
@@ -17,6 +17,8 @@ int lwg_parse_yylex(void);
 
 %start geometry
 
+%locations
+
 %union {
        double value;
        const char* wkb;