PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches
lwin_wkt_lex.l
Go to the documentation of this file.
1%{
2
3/* The lexer */
4
5#include <stdio.h>
6#include <string.h>
7#include "lwin_wkt.h"
8#include "lwin_wkt_parse.h"
9#include "lwgeom_log.h"
10
12
13/*
14* Handle errors due to unexpected junk in WKT strings.
15*/
23
24/*
25* This macro is magically run after a rule is found but before the main
26* action is run. We use it to update the parse location information
27* so we can report on where things fail. Also optionally to dump
28* debugging info.
29*/
30#define YY_USER_ACTION do { \
31 wkt_yylloc.first_line = wkt_yylloc.last_line = yylineno; \
32 wkt_yylloc.first_column = wkt_yylloc.last_column; \
33 wkt_yylloc.last_column += yyleng; \
34 LWDEBUGF(5,"lex: %s", wkt_yytext); \
35 } while (0);
36
37/*
38* Ensure we have a definition of NAN to use when encountering
39* NAN tokens.
40*/
41#ifndef _GNU_SOURCE
42#define _GNU_SOURCE
43#endif
44#include <math.h>
45#ifndef NAN
46#define NAN 0.0/0.0
47#endif
48
#define PARSER_ERROR_OTHER
Definition liblwgeom.h:2181
const char * parser_error_messages[]
Definition lwin_wkt.c:37
LWGEOM_PARSER_RESULT global_parser_result
static void wkt_lexer_unknown()
static YY_BUFFER_STATE wkt_yy_buf_state
YYLTYPE wkt_yylloc
49%}
50
51%option prefix="wkt_yy"
52%option nounput
53%option noinput
54%option never-interactive
55%option outfile="lwin_wkt_lex.c"
56%option noyywrap
57/* Suppress the default implementations. */
58%option noyyalloc noyyrealloc noyyfree
59
60%%
61
62-?(([0-9]+\.?)|([0-9]*\.?[0-9]+)([eE][-+]?[0-9]+)?)[ \,\‍)\t\n\r] {
63 LWDEBUG(5,"DOUBLE");
64 wkt_yylval.doublevalue = atof(wkt_yytext);
65 yyless(wkt_yyleng-1);
66 return DOUBLE_TOK;
67 }
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
#define yyless(n)
YYSTYPE wkt_yylval
@ DOUBLE_TOK
double doublevalue
68
69([Nn][Aa][Nn])[ \,\‍)\t\n\r] {
70 LWDEBUG(5,"DOUBLE NAN");
72 yyless(wkt_yyleng-1);
73 return DOUBLE_TOK;
74}
#define NAN
75
76SRID=-?[0-9]+ {
77 LWDEBUG(5,"SRID");
79 return SRID_TOK;
80 }
int wkt_lexer_read_srid(char *str)
Read the SRID number from an SRID=<> string.
Definition lwin_wkt.c:61
@ SRID_TOK
int integervalue
81
82GEOMETRYCOLLECTION { return COLLECTION_TOK; }
@ COLLECTION_TOK
83MULTISURFACE { return MSURFACE_TOK; }
@ MSURFACE_TOK
84MULTIPOLYGON { return MPOLYGON_TOK; }
@ MPOLYGON_TOK
85MULTICURVE { return MCURVE_TOK; }
@ MCURVE_TOK
86MULTILINESTRING { return MLINESTRING_TOK; }
@ MLINESTRING_TOK
87MULTIPOINT { return MPOINT_TOK; }
@ MPOINT_TOK
88CURVEPOLYGON { return CURVEPOLYGON_TOK; }
@ CURVEPOLYGON_TOK
89POLYGON { return POLYGON_TOK; }
@ POLYGON_TOK
90COMPOUNDCURVE { return COMPOUNDCURVE_TOK; }
@ COMPOUNDCURVE_TOK
91CIRCULARSTRING { return CIRCULARSTRING_TOK; }
@ CIRCULARSTRING_TOK
92LINESTRING { return LINESTRING_TOK; }
@ LINESTRING_TOK
93POLYHEDRALSURFACE { return POLYHEDRALSURFACE_TOK; }
@ POLYHEDRALSURFACE_TOK
94TRIANGLE { return TRIANGLE_TOK; }
@ TRIANGLE_TOK
95TIN { return TIN_TOK; }
@ TIN_TOK
96POINT { return POINT_TOK; }
@ POINT_TOK
97EMPTY { return EMPTY_TOK; }
@ EMPTY_TOK
98
99Z|M|ZM {
100 LWDEBUG(5,"DIMENSIONALITY");
101 wkt_yylval.stringvalue = wkt_yytext;
102 return DIMENSIONALITY_TOK;
103 }
@ DIMENSIONALITY_TOK
char * stringvalue
104
105\‍( { LWDEBUG(5,"LBRACKET"); return LBRACKET_TOK; }
@ LBRACKET_TOK
106\‍) { LWDEBUG(5,"RBRACKET"); return RBRACKET_TOK; }
@ RBRACKET_TOK
107, { LWDEBUG(5,"COMMA"); return COMMA_TOK; }
@ COMMA_TOK
108\; { LWDEBUG(5,"SEMICOLON"); return SEMICOLON_TOK; }
@ SEMICOLON_TOK
109
110[ \t\n\r]+ { /* ignore whitespace */ LWDEBUG(5,"WHITESPACE"); }
111
112. { /* Error out and stop parsing on unknown/unexpected characters */
113 LWDEBUG(5,"UNKNOWN");
115 yyterminate();
116 }
#define yyterminate()
117
118%%
119
121{
122 return (void *) lwalloc( size );
123}
124
125void *wkt_yyrealloc (void * ptr, yy_size_t size )
126{
127 return (void *) lwrealloc( (char *) ptr, size );
128}
129
130void wkt_yyfree (void * ptr )
131{
132 lwfree( (char *) ptr ); /* see wkt_yyrealloc() for (char *) cast */
133}
134
135/*
136* Set up the lexer!
137*/
138void wkt_lexer_init(char *src)
139{
141 wkt_yy_buf_state = wkt_yy_scan_string(src);
142}
143
144/*
145* Clean up the lexer!
146*/
148{
149 wkt_yy_delete_buffer(wkt_yy_buf_state);
150}
151
void * lwrealloc(void *mem, size_t size)
Definition lwutil.c:242
void * lwalloc(size_t size)
Definition lwutil.c:227
void lwfree(void *mem)
Definition lwutil.c:248
static int yy_init_globals(void)
size_t yy_size_t
void wkt_lexer_close()
void * wkt_yyrealloc(void *ptr, yy_size_t size)
void wkt_lexer_init(char *src)
void * wkt_yyalloc(yy_size_t size)
void wkt_yyfree(void *ptr)