3 * A scanner for EMP-style numeric ranges
4 * contrib/cube/cubescan.l
10#include "cubeparse.h" /* must be after cubedata.h for YYSTYPE and NDBOX */
16/* No reason to constrain amount of data slurped */
17 #define YY_READ_BUF_SIZE 16777216
19/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
21 #define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
static void fprintf_to_ereport(const char *fmt, const char *msg)
int errmsg_internal(const char *fmt,...)
#define ereport(elevel,...)
33%option never-interactive
42%option prefix="cube_yy"
47real [+-]?({n}\.{n}?|\.{n})
48float ({integer}|{real})([eE]{integer})?
49infinity [+-]?[iI][nN][fF]([iI][nN][iI][tT][yY])?
54{float} *yylval = yytext;
return CUBEFLOAT;
55{infinity} *yylval = yytext;
return CUBEFLOAT;
56{NaN} *yylval = yytext;
return CUBEFLOAT;
57\[ *yylval =
"(";
return O_BRACKET;
58\] *yylval =
")";
return C_BRACKET;
59\( *yylval =
"(";
return O_PAREN;
60\) *yylval =
")";
return C_PAREN;
61,円 *yylval =
",";
return COMMA;
62[ \t\n\r\f\v]+ /* discard spaces */
63. return yytext[0];
/* alert parser of the garbage */
69/* result and scanbuflen are not used, but Bison expects this signature */
72 struct Node *escontext,
79 if (*yytext == YY_END_OF_BUFFER_CHAR)
82 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
83 errmsg(
"invalid input syntax for cube"),
84 /* translator: %s is typically "syntax error" */
85 errdetail(
"%s at end of input", message)));
90 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
91 errmsg(
"invalid input syntax for cube"),
92 /* translator: first %s is typically "syntax error" */
93 errdetail(
"%s at or near \"%s\"", message, yytext)));
99 * Called before any actual parsing is done
107 if (yylex_init(yyscannerp) != 0)
110 yyscanner = *yyscannerp;
112 yy_scan_bytes(
str, slen, yyscanner);
118 * Called after parsing is done to clean up after cube_scanner_init()
123 yylex_destroy(yyscanner);
127 * Interface functions to make flex use palloc() instead of malloc().
128 * It'd be better to make these static, but flex insists otherwise.
void * yyrealloc(void *ptr, yy_size_t size, yyscan_t yyscanner)
void cube_yyerror(NDBOX **result, Size scanbuflen, struct Node *escontext, yyscan_t yyscanner, const char *message)
void cube_scanner_init(const char *str, Size *scanbuflen, yyscan_t *yyscannerp)
void cube_scanner_finish(yyscan_t yyscanner)
void yyfree(void *ptr, yyscan_t yyscanner)
void * yyalloc(yy_size_t size, yyscan_t yyscanner)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define errsave(context,...)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)