Use exclusive state to help fix unary minus parsing.
authorThomas G. Lockhart
Sat, 13 Sep 1997 03:12:55 +0000 (03:12 +0000)
committerThomas G. Lockhart
Sat, 13 Sep 1997 03:12:55 +0000 (03:12 +0000)
Remove "backdoor" for DEFAULT and CHECK.

src/backend/parser/scan.l

index 2d47f273b602839131b11c25f544e0c6d85be827..4f0e239364df72811e6028f041cb2ebc9fab01fc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.20 1997/09/12 09:01:46 vadim Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.21 1997/09/13 03:12:55 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
 extern char *parseString;
 extern char *parseCh;
 
-int CurScanPosition(void);
-int DefaultStartPosition;
-int CheckStartPosition;
-
 /* some versions of lex define this as a macro */
 #if defined(yywrap)
 #undef yywrap
@@ -61,6 +57,7 @@ void unput(char);
 extern YYSTYPE yylval;
 
 int llen;
+char *ScanString;
 char literal[MAX_PARSE_BUFFER];
 
 %}
@@ -68,19 +65,26 @@ char literal[MAX_PARSE_BUFFER];
     * The longest pattern which matches an input string is always chosen.
     * For equal-length patterns, the first occurring in the rules list is chosen.
     * INITIAL is the starting condition, to which all non-conditional rules apply.
-    *  is an exclusive condition to allow embedded C-style comments.
     * When in an exclusive condition, only those rules defined for that condition apply.
-    * So, when in condition , only strings which would terminate the "extended comment"
-    *  trigger any action other than "ignore".
+    *
+    * Exclusive states change parsing rules while the state is active.
+    * There are exclusive states for quoted strings, extended comments,
+    *  and to eliminate parsing troubles for numeric strings.
+    * Exclusive states:
+    *   extended C-style comments - tgl 1997-07-12
+    *   quoted strings - tgl 1997-07-30
+    *   numeric strings with embedded minus sign - tgl 1997-09-05
+    *
     * The "extended comment" syntax closely resembles allowable operator syntax.
-    * Therefore, be sure to match _any_ candidate comment, including those with appended
+    * So, when in condition , only strings which would terminate the
+    *  "extended comment" trigger any action other than "ignore".
+    * Be sure to match _any_ candidate comment, including those with appended
     *  operator-like symbols. - thomas 1997-07-14
     */
 
-   /* define an exclusive condition to allow extended C-style comments - tgl 1997-07-12 */
 %x xc
-   /* define an exclusive condition for quoted strings - tgl 1997-07-30 */
 %x xq
+%x xm
 
    /* We used to allow double-quoted strings, but SQL doesn't so we won't either */
 quote          '
@@ -97,6 +101,7 @@ xcinside     [^*]*
 xcstar         [^/]
 
 digit          [0-9]
+number         [-+.0-9Ee]
 letter         [_A-Za-z]
 letter_or_digit [_A-Za-z0-9]
 
@@ -107,32 +112,30 @@ identifier        {letter}{letter_or_digit}*
 typecast       "::"
 
 self           [,()\[\].;$\:\+\-\*\/\<\>\=\|]
-selfm          {self}[\-][\.0-9]
-
 op_and_self        [\~\!\@\#\%\^\&\|\`\?\$\:\+\-\*\/\<\>\=]
-
 operator       {op_and_self}+
-operatorm      {op_and_self}+[\-][\.0-9]
+
+xminteger      {integer}/-
+xmreal         {real}/{space}*-{digit}
+xmstop         -
 
 integer            -?{digit}+
 real           -?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
 
 param          \${integer}
 
-comment            "--".*\n
-comment2       "//".*\n
+comment            ("--"|"//").*\n
 
 space          [ \t\n\f]
 other          .
 
-%%
-{sysfunc}      {
-                       yylval.str = pstrdup(SystemFunctionHandler((char *)yytext));
-                       return (SCONST);
-               }
+/* DO NOT PUT ANY COMMENTS IN THE FOLLOWING SECTION.
+ * AT&T lex does not properly handle C-style comments in this second lex block.
+ * So, put comments here. tgl - 1997-09-08
+ */
 
-{comment}      { /* ignore */  }
-{comment2}     { /* ignore */  }
+%%
+{comment}      { /* ignore */ }
 
 {xcline}       { /* ignore */ }
 
@@ -167,18 +170,26 @@ other         .
                    llen += yyleng-1;
                }
 
+{space}*   { /* ignore */ }
+{xmstop}   {
+                   BEGIN(INITIAL);
+                   return (yytext[0]);
+               }
+
+{sysfunc}      {
+                       yylval.str = pstrdup(SystemFunctionHandler((char *)yytext));
+                       return (SCONST);
+               }
+
 {typecast}     { return TYPECAST; }
 
-{selfm}            {
-                   yyless(yyleng-2);
+{self}/-[\.0-9]    {
                    return (yytext[0]);
                }
 {self}         {   return (yytext[0]); }
-
-{operatorm}        {
-                   yyless(yyleng-2);
+{operator}/-[\.0-9]    {
                    yylval.str = pstrdup((char*)yytext);
-                       return (Op);
+                   return (Op);
                }
 {operator}     {
                    if (strcmp((char*)yytext,"!=") == 0)
@@ -191,7 +202,26 @@ other          .
                    yylval.ival = atoi((char*)&yytext[1]);
                    return (PARAM);
                }
+
+{integer}/{space}*-{number}    {
+                   BEGIN(xm);
+                   ScanString = pstrdup((char*)yytext);
+                   yylval.ival = atoi((char*)yytext);
+                   return (ICONST);
+               }
+{real}/{space}*-{number} {
+                   char* endptr;
+                   BEGIN(xm);
+                   errno = 0;
+                   ScanString = pstrdup((char*)yytext);
+                   yylval.dval = strtod(((char *)yytext),&endptr);
+                   if (*endptr != '\0' || errno == ERANGE)
+                   elog(WARN,"\tBad float8 input format\n");
+                   CheckFloat8Val(yylval.dval);
+                   return (FCONST);
+               }
 {integer}      {
+                   ScanString = pstrdup((char*)yytext);
                    yylval.ival = atoi((char*)yytext);
                    return (ICONST);
                }
@@ -199,6 +229,7 @@ other           .
                    char* endptr;
 
                    errno = 0;
+                   ScanString = pstrdup((char*)yytext);
                    yylval.dval = strtod(((char *)yytext),&endptr);
                    if (*endptr != '\0' || errno == ERANGE)
                        elog(WARN,"\tBad float8 input format\n");
@@ -215,16 +246,6 @@ other          .
 
                    keyword = ScanKeywordLookup((char*)yytext);
                    if (keyword != NULL) {
-                       if ( keyword->value == DEFAULT )
-                       {
-                           DefaultStartPosition = CurScanPosition () + yyleng + 1;
-                           printf( "default offset is %d\n", DefaultStartPosition);
-                       }
-                       else if ( keyword->value == CHECK )
-                       {
-                           CheckStartPosition = CurScanPosition () + yyleng + 1;
-                           printf( "check offset is %d\n", CheckStartPosition);
-                       }
                        return (keyword->value);
                    }
                    else
@@ -241,7 +262,7 @@ other           .
 
 void yyerror(char message[])
 {
-   elog(WARN, "parser: %s at or near \"%s\"\n", message, yytext);
+   elog(WARN, "parser: %s at or near \"%s\"", message, yytext);
 }
 
 int yywrap()
@@ -267,8 +288,6 @@ init_io()
    BEGIN INITIAL;
 }
 
-
-
 #if !defined(FLEX_SCANNER)
 /* get lex input from a string instead of from stdin */
 int
@@ -294,16 +313,9 @@ unput(char c)
    else if (c != 0)
        *--parseCh = c;
 }
-
-int
-CurScanPosition(void)
-{
-   return (parseCh - parseString - yyleng);
-}
 #endif /* !defined(FLEX_SCANNER) */
 
 #ifdef FLEX_SCANNER
-static bool end_of_buf = false;
 /* input routine for flex to read input from a string instead of a file */
 int
 myinput(char* buf, int max)
@@ -321,29 +333,10 @@ myinput(char* buf, int max)
            memcpy(buf, parseString, copylen);
        buf[copylen] = '\0';
        parseCh = parseString;
-       end_of_buf = false;
        return copylen;
    }
    else
-   {
-       end_of_buf = true;
        return 0; /* end of string */
-   }
 }
-
-int
-CurScanPosition(void)
-{
-   int spos;
-   
-   if ( end_of_buf )
-       spos = strlen (parseString) - strlen (yytext);
-   else
-       spos = yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng;
-   
-   printf( "current position is %d\n", spos);
-   return (spos);
-}
-
 #endif /* FLEX_SCANNER */