From 8437f8941922bf5ab1aa331272034d0da4b2c167 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Mon, 8 Sep 2008 20:16:04 +0000 Subject: [PATCH] Enhance geometry parser so that it keeps track of the current position during parsing. With a bit more work, this should allow error messages to pinpoint the exact location of an invalid geometry section or syntax error. git-svn-id: http://svn.osgeo.org/postgis/trunk@2947 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/wktparse.lex | 71 ++++++++++++++++++++++-------------------- liblwgeom/wktparse.y | 2 ++ 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/liblwgeom/wktparse.lex b/liblwgeom/wktparse.lex index 6ab7f4ebf..6db61442a 100644 --- a/liblwgeom/wktparse.lex +++ b/liblwgeom/wktparse.lex @@ -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) + %} %% -[-|\+]?[0-9]+(\.[0-9]+)?([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); return VALUE; } -[-|\+]?(\.[0-9]+)([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); return VALUE; } +[-|\+]?[0-9]+(\.[0-9]+)?([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); UPDATE_YYLLOC(); return VALUE; } +[-|\+]?(\.[0-9]+)([Ee](\+|-)?[0-9]+)? { lwg_parse_yylval.value=atof(lwg_parse_yytext); UPDATE_YYLLOC(); return VALUE; } 00[0-9A-F]* { lwg_parse_yylval.wkb=lwg_parse_yytext; return WKB;} 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]; } %% diff --git a/liblwgeom/wktparse.y b/liblwgeom/wktparse.y index d97cbcfeb..a06a83817 100644 --- a/liblwgeom/wktparse.y +++ b/liblwgeom/wktparse.y @@ -17,6 +17,8 @@ int lwg_parse_yylex(void); %start geometry +%locations + %union { double value; const char* wkb; -- 2.50.1