%{ /* WKT Parser */ #include #include #include #include "crs_internal.h" CRS *globalcrs = NULL; char *wkt_yyerror_str = NULL; int wkt_yydebug = 1; void wkt_yyerror(const char *str) { if ( wkt_yyerror_str ) free(wkt_yyerror_str); asprintf(&wkt_yyerror_str,"Parse error: %s",str); } int wkt_yywrap() { return 1; } extern int crs_from_wkt_string(char *str, CRS **crs, char **errstr) { int rv = 0; *crs = NULL; *errstr = NULL; wkt_lexer_init(str); rv = wkt_yyparse(); CRSDEBUGF(4,"wkt_yyparse returned %d", rv); wkt_lexer_close(); if ( rv ) { *errstr = wkt_yyerror_str; return CRS_FAILURE; } *crs = globalcrs; globalcrs = NULL; return CRS_SUCCESS; } %} %error-verbose %name-prefix="wkt_yy" %union { double doublevalue; char *stringvalue; AUTHORITY *authorityvalue; AXIS *axisvalue; CRS *crsvalue; DATUM *datumvalue; GEOGCS *geogcsvalue; PARAMETER *parametervalue; PART *partvalue; PARTLIST *partlistvalue; PRIMEM *primemvalue; PROJCS *projcsvalue; PROJECTION *projectionvalue; SPHEROID *spheroidvalue; TOWGS84 *towgs84value; UNIT *unitvalue; } %token PROJCS_TOK GEOGCS_TOK PARAMETER_TOK AUTHORITY_TOK DATUM_TOK %token SPHEROID_TOK PRIMEM_TOK UNIT_TOK PROJECTION_TOK TOWGS84_TOK AXIS_TOK %token RBRACKET_TOK LBRACKET_TOK COMMA_TOK %token FLOAT_TOK %token STRING_TOK %type authority %type axis %type crs %type datum %type geogcs %type parameter %type primem %type projcs %type projection %type spheroid %type towgs84 %type unit %type datum_partlist %type datum_part %type geogcs_partlist %type geogcs_part %type projcs_partlist %type projcs_part %% crs : projcs { globalcrs = (CRS*)$1;} | geogcs { globalcrs = (CRS*)$1;} ; geogcs : GEOGCS_TOK LBRACKET_TOK STRING_TOK COMMA_TOK geogcs_partlist RBRACKET_TOK { $$ = crs_geogcs_make_from_partlist(crs_string_make($3), $5);} ; geogcs_partlist : geogcs_partlist COMMA_TOK geogcs_part { crs_partlist_add_part($$,$3);} | geogcs_part {$$ = crs_partlist_make(); crs_partlist_add_part($$, $1);}; geogcs_part : authority { $$ = (PART*)$1; } | primem { $$ = (PART*)$1; } | datum { $$ = (PART*)$1; } | unit { $$ = (PART*)$1; } | axis { $$ = (PART*)$1; } ; primem : PRIMEM_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK {$$ = crs_primem_make(crs_string_make($3), $5, NULL);} | PRIMEM_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK COMMA_TOK authority RBRACKET_TOK {$$ = crs_primem_make(crs_string_make($3), $5, $7);} ; datum : DATUM_TOK LBRACKET_TOK STRING_TOK COMMA_TOK datum_partlist RBRACKET_TOK { $$ = crs_datum_make_from_partlist(crs_string_make($3), $5);} ; datum_partlist : datum_partlist COMMA_TOK datum_part { crs_partlist_add_part($$,$3);} | datum_part {$$ = crs_partlist_make(); crs_partlist_add_part($$, $1);} ; datum_part : spheroid { $$ = (PART*)$1; } | towgs84 { $$ = (PART*)$1; } | authority { $$ = (PART*)$1; }; spheroid : SPHEROID_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK {$$ = crs_spheroid_make(crs_string_make($3), $5, $7, NULL);} | SPHEROID_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK authority RBRACKET_TOK {$$ = crs_spheroid_make(crs_string_make($3), $5, $7, $9);} ; towgs84 : TOWGS84_TOK LBRACKET_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK { double d[3]; d[0] = $3; d[1] = $5; d[2] = $7; $$ = crs_towgs84_make(3, d);} | TOWGS84_TOK LBRACKET_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK { double d[5]; d[0] = $3; d[1] = $5; d[2] = $7; d[3] = $9; d[4] = $11; $$ = crs_towgs84_make(5, d);} | TOWGS84_TOK LBRACKET_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK { double d[7]; d[0] = $3; d[1] = $5; d[2] = $7; d[3] = $9; d[4] = $11; d[5] = $13; d[6] = $15; $$ = crs_towgs84_make(7, d);} ; unit : UNIT_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK {$$ = crs_unit_make(crs_string_make($3), $5, NULL);} | UNIT_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK COMMA_TOK authority RBRACKET_TOK {$$ = crs_unit_make(crs_string_make($3), $5, $7);} ; axis : AXIS_TOK LBRACKET_TOK STRING_TOK COMMA_TOK STRING_TOK RBRACKET_TOK {$$ = crs_axis_make(crs_string_make($3), crs_string_make($5));} ; projcs : PROJCS_TOK LBRACKET_TOK STRING_TOK COMMA_TOK projcs_partlist RBRACKET_TOK { $$ = crs_projcs_make_from_partlist(crs_string_make($3), $5);} ; projcs_partlist : projcs_partlist COMMA_TOK projcs_part { crs_partlist_add_part($$,$3);} | projcs_part {$$ = crs_partlist_make(); crs_partlist_add_part($$, $1);}; projcs_part : geogcs { $$ = (PART*)$1; } | projection { $$ = (PART*)$1; } | parameter { $$ = (PART*)$1; } | unit { $$ = (PART*)$1; } | axis { $$ = (PART*)$1; } | authority{ $$ = (PART*)$1; } ; projection : PROJECTION_TOK LBRACKET_TOK STRING_TOK RBRACKET_TOK {$$ = crs_projection_make(crs_string_make($3),NULL); } | PROJECTION_TOK LBRACKET_TOK STRING_TOK COMMA_TOK authority RBRACKET_TOK {$$ = crs_projection_make(crs_string_make($3),$5);} ; parameter : PARAMETER_TOK LBRACKET_TOK STRING_TOK COMMA_TOK FLOAT_TOK RBRACKET_TOK {$$ = crs_parameter_make(crs_string_make($3),$5);} | PARAMETER_TOK LBRACKET_TOK STRING_TOK COMMA_TOK STRING_TOK RBRACKET_TOK { /* ERROR UNSUPPORTED */ }; authority : AUTHORITY_TOK LBRACKET_TOK STRING_TOK COMMA_TOK STRING_TOK RBRACKET_TOK {$$ = crs_authority_make(crs_string_make($3),crs_string_make($5),NULL);} ; %%