Reject non-ON-SELECT rules that are named "_RETURN".
[pgsql.git] / contrib / seg / segscan.l
blob4744fd5e9e84592520b374a400da71ca1b4f90a0
1 %top{
2 /*
3  * A scanner for EMP-style numeric ranges
4  */
5 #include "postgres.h"
7 /*
8  * NB: include segparse.h only AFTER including segdata.h, because segdata.h
9  * contains the definition for SEG.
10  */
11 #include "segdata.h"
12 #include "segparse.h"
16 /* LCOV_EXCL_START */
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) */
22 #undef fprintf
23 #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
25 static void
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;
33 static char *scanbuf;
36 %option 8bit
37 %option never-interactive
38 %option nodefault
39 %option noinput
40 %option nounput
41 %option noyywrap
42 %option warn
43 %option prefix="seg_yy"
46 range        (\.\.)(\.)?
47 plumin       (\'\+\-\')|(\(\+\-)\)
48 integer      [+-]?[0-9]+
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 */
65 /* LCOV_EXCL_STOP */
67 void
68 seg_yyerror(SEG *result, const char *message)
70         if (*yytext == YY_END_OF_BUFFER_CHAR)
71         {
72                 ereport(ERROR,
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)));
77         }
78         else
79         {
80                 ereport(ERROR,
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)));
85         }
90  * Called before any actual parsing is done
91  */
92 void
93 seg_scanner_init(const char *str)
95         Size    slen = strlen(str);
97         /*
98          * Might be left over after ereport()
99          */
100         if (YY_CURRENT_BUFFER)
101                 yy_delete_buffer(YY_CURRENT_BUFFER);
103         /*
104          * Make a scan buffer with special termination needed by flex.
105          */
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);
111         BEGIN(INITIAL);
116  * Called after parsing is done to clean up after seg_scanner_init()
117  */
118 void
119 seg_scanner_finish(void)
121         yy_delete_buffer(scanbufhandle);
122         pfree(scanbuf);