*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.54 1999/09/11 22:26:35 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.55 1999/09/27 19:40:40 momjian Exp $
*
*-------------------------------------------------------------------------
*/
* extended C-style comments - tgl 1997-07-12
* delimited identifiers (double-quoted identifiers) - tgl 1997-10-27
* hexadecimal numeric string - thomas 1997-11-16
- * numeric strings with embedded minus sign - tgl 1997-09-05
* quoted strings - tgl 1997-07-30
*
* The "extended comment" syntax closely resembles allowable operator syntax.
%x xc
%x xd
%x xh
-%x xm
%x xq
/* Binary number
xcstar [^/]
digit [0-9]
-number [-+.0-9Ee]
letter [\200-\377_A-Za-z]
letter_or_digit [\200-\377_A-Za-z0-9]
op_and_self [\~\!\@\#\^\&\|\`\?\$\:\+\-\*\/\%\<\>\=]
operator {op_and_self}+
-xmstop -
+/* we do not allow unary minus in numbers.
+ * instead we pass it verbatim to parser. there it gets
+ * coerced via doNegate() -- Leon aug 20 1999
+ */
-integer [\-]?{digit}+
-decimal [\-]?(({digit}*\.{digit}+)|({digit}+\.{digit}*))
-real [\-]?((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
+integer {digit}+
+decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*))
+real ((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
/*
-real [\-]?(((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
+real (((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
*/
param \${integer}
llen += yyleng;
}
-
-{space}* { /* ignore */ }
-{xmstop} {
- BEGIN(INITIAL);
- return yytext[0];
- }
-
-
{typecast} { return TYPECAST; }
-{self}/{space}*-[\.0-9] {
- BEGIN(xm);
- return yytext[0];
- }
{self} { return yytext[0]; }
-{self} { return yytext[0]; }
-{operator}/-[\.0-9] {
- yylval.str = pstrdup((char*)yytext);
- return Op;
- }
+
{operator} {
if (strcmp((char*)yytext,"!=") == 0)
yylval.str = pstrdup("<>"); /* compatability */
}
-{identifier}/{space}*-{number} {
- int i;
- ScanKeyword *keyword;
-
- BEGIN(xm);
- for(i = 0; yytext[i]; i++)
- if (isascii((unsigned char)yytext[i]) &&
- isupper(yytext[i]))
- yytext[i] = tolower(yytext[i]);
- if (i >= NAMEDATALEN)
- yytext[NAMEDATALEN-1] = '\0';
-
- keyword = ScanKeywordLookup((char*)yytext);
- if (keyword != NULL) {
- return keyword->value;
- }
- else
- {
- yylval.str = pstrdup((char*)yytext);
- return IDENT;
- }
- }
-{integer}/{space}*-{number} {
- char* endptr;
-
- BEGIN(xm);
- errno = 0;
- yylval.ival = strtol((char *)yytext,&endptr,10);
- if (*endptr != '\0' || errno == ERANGE)
- {
- errno = 0;
-#if 0
- yylval.dval = strtod(((char *)yytext),&endptr);
- if (*endptr != '\0' || errno == ERANGE)
- elog(ERROR,"Bad integer input '%s'",yytext);
- CheckFloat8Val(yylval.dval);
- elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext);
- return FCONST;
-#endif
- yylval.str = pstrdup((char*)yytext);
- return SCONST;
- }
- return ICONST;
- }
-{decimal}/{space}*-{number} {
- char* endptr;
-
- BEGIN(xm);
- if (strlen((char *)yytext) <= 17)
- {
- errno = 0;
- yylval.dval = strtod(((char *)yytext),&endptr);
- if (*endptr != '\0' || errno == ERANGE)
- elog(ERROR,"Bad float8 input '%s'",yytext);
- CheckFloat8Val(yylval.dval);
- return FCONST;
- }
- yylval.str = pstrdup((char*)yytext);
- return SCONST;
- }
-{real}/{space}*-{number} {
- char* endptr;
-
- BEGIN(xm);
- errno = 0;
- yylval.dval = strtod(((char *)yytext),&endptr);
- if (*endptr != '\0' || errno == ERANGE)
- elog(ERROR,"Bad float8 input '%s'",yytext);
- CheckFloat8Val(yylval.dval);
- return FCONST;
- }
{integer} {
char* endptr;