3 * A scanner for EMP-style numeric ranges
8 * NB: include segparse.h only AFTER including segdata.h, because segdata.h
9 * contains the definition for SEG.
18 /* No reason to constrain amount of data slurped */
19 #define YY_READ_BUF_SIZE 16777216
21 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
23 #define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
26 fprintf_to_ereport(const char *fmt, const char *msg)
28 ereport(ERROR, (errmsg_internal("%s", msg)));
31 /* Handles to the buffer that the lexer uses internally */
32 static YY_BUFFER_STATE scanbufhandle;
37 %option never-interactive
43 %option prefix="seg_yy"
47 plumin (\'\+\-\')|(\(\+\-)\)
49 real [+-]?[0-9]+\.[0-9]+
50 float ({integer}|{real})([eE]{integer})?
54 {range} seg_yylval.text = yytext; return RANGE;
55 {plumin} seg_yylval.text = yytext; return PLUMIN;
56 {float} seg_yylval.text = yytext; return SEGFLOAT;
57 \< seg_yylval.text = "<"; return EXTENSION;
58 \> seg_yylval.text = ">"; return EXTENSION;
59 \~ seg_yylval.text = "~"; return EXTENSION;
60 [ \t\n\r\f]+ /* discard spaces */
61 . return yytext[0]; /* alert parser of the garbage */
68 seg_yyerror(SEG *result, const char *message)
70 if (*yytext == YY_END_OF_BUFFER_CHAR)
73 (errcode(ERRCODE_SYNTAX_ERROR),
74 errmsg("bad seg representation"),
75 /* translator: %s is typically "syntax error" */
76 errdetail("%s at end of input", message)));
81 (errcode(ERRCODE_SYNTAX_ERROR),
82 errmsg("bad seg representation"),
83 /* translator: first %s is typically "syntax error" */
84 errdetail("%s at or near \"%s\"", message, yytext)));
90 * Called before any actual parsing is done
93 seg_scanner_init(const char *str)
95 Size slen = strlen(str);
98 * Might be left over after ereport()
100 if (YY_CURRENT_BUFFER)
101 yy_delete_buffer(YY_CURRENT_BUFFER);
104 * Make a scan buffer with special termination needed by flex.
106 scanbuf = palloc(slen + 2);
107 memcpy(scanbuf, str, slen);
108 scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
109 scanbufhandle = yy_scan_buffer(scanbuf, slen + 2);
116 * Called after parsing is done to clean up after seg_scanner_init()
119 seg_scanner_finish(void)
121 yy_delete_buffer(scanbufhandle);