]> granicus.if.org Git - postgresql/commitdiff
Distinguish between C and SQL mode for C-style comments.
authorMichael Meskes <meskes@postgresql.org>
Sun, 24 Nov 2013 11:26:00 +0000 (12:26 +0100)
committerMichael Meskes <meskes@postgresql.org>
Sun, 24 Nov 2013 11:26:00 +0000 (12:26 +0100)
SQL standard asks for allowing nested comments, while C does not. Therefore the
two comments, while mostly similar, have to be parsed seperately.

src/interfaces/ecpg/preproc/pgc.l

index 24936ea935d698588b128da8aff747605a00a0dd..6deef59d53faa88d213c5815beaca380a3e2dde1 100644 (file)
@@ -102,7 +102,8 @@ static struct _if_value
  * and to eliminate parsing troubles for numeric strings.
  * Exclusive states:
  *     <xb> bit string literal
- *     <xc> extended C-style comments - thomas 1997-07-12
+ *     <xcc> extended C-style comments in C
+ *     <xcsql> extended C-style comments in SQL
  *     <xd> delimited identifiers (double-quoted identifiers) - thomas 1997-10-27
  *     <xh> hexadecimal numeric string - thomas 1997-11-16
  *     <xq> standard quoted strings - thomas 1997-07-30
@@ -115,7 +116,8 @@ static struct _if_value
  */
 
 %x xb
-%x xc
+%x xcc
+%x xcsql
 %x xd
 %x xdc
 %x xh
@@ -369,23 +371,32 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
 
 <SQL>{whitespace}      { /* ignore */ }
 
-<C,SQL>{xcstart}               {
+<C>{xcstart}           {
                                        token_start = yytext;
                                        state_before = YYSTATE;
                                        xcdepth = 0;
-                                       BEGIN(xc);
+                                       BEGIN(xcc);
                                        /* Put back any characters past slash-star; see above */
                                        yyless(2);
                                        fputs("/*", yyout);
                                }
-<xc>{xcstart}  {
+<SQL>{xcstart}         {
+                                       token_start = yytext;
+                                       state_before = YYSTATE;
+                                       xcdepth = 0;
+                                       BEGIN(xcsql);
+                                       /* Put back any characters past slash-star; see above */
+                                       yyless(2);
+                                       fputs("/*", yyout);
+                               }
+<xcc>{xcstart} { ECHO; }
+<xcsql>{xcstart}       {
                                        xcdepth++;
                                        /* Put back any characters past slash-star; see above */
                                        yyless(2);
                                        fputs("/*", yyout);
                                }
-
-<xc>{xcstop}   {
+<xcsql>{xcstop}        {
                                        ECHO;
                                        if (xcdepth <= 0)
                                        {
@@ -395,12 +406,16 @@ cppline                   {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                                        else
                                                xcdepth--;
                                }
+<xcc>{xcstop}  {
+                                       ECHO;
+                                       BEGIN(state_before);
+                                       token_start = NULL;
+                               }
+<xcc,xcsql>{xcinside}  { ECHO; }
+<xcc,xcsql>{op_chars}  { ECHO; }
+<xcc,xcsql>\*+         { ECHO; }
 
-<xc>{xcinside} { ECHO; }
-<xc>{op_chars} { ECHO; }
-<xc>\*+                        { ECHO; }
-
-<xc><<EOF>>            { mmfatal(PARSE_ERROR, "unterminated /* comment"); }
+<xcc,xcsql><<EOF>>             { mmfatal(PARSE_ERROR, "unterminated /* comment"); }
 
 <SQL>{xbstart} {
                                        token_start = yytext;