OSDN Git Service

2010-08-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-lex.l
index 1d13625..8159ef8 100644 (file)
@@ -1,12 +1,13 @@
 /* -*- indented-text -*- */
 /* Process source files and output type information.
 /* -*- indented-text -*- */
 /* Process source files and output type information.
-   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,9 +16,10 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+%option noinput
 
 %{
 #include "bconfig.h"
 
 %{
 #include "bconfig.h"
@@ -27,7 +29,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #define realloc xrealloc
 
 #include "gengtype.h"
 #define realloc xrealloc
 
 #include "gengtype.h"
-#include "gengtype-yacc.h"
+
+#define YY_DECL int yylex (const char **yylval)
+#define yyterminate() return EOF_TOKEN
 
 struct fileloc lexer_line;
 int lexer_toplevel_done;
 
 struct fileloc lexer_line;
 int lexer_toplevel_done;
@@ -44,199 +48,58 @@ update_lineno (const char *l, size_t len)
 
 ID     [[:alpha:]_][[:alnum:]_]*
 WS     [[:space:]]+
 
 ID     [[:alpha:]_][[:alnum:]_]*
 WS     [[:space:]]+
-IWORD  short|long|(un)?signed|char|int|HOST_WIDE_INT|HOST_WIDEST_INT|bool|size_t|BOOL_BITFIELD
+HWS    [ \t\r\v\f]*
+IWORD  short|long|(un)?signed|char|int|HOST_WIDE_INT|HOST_WIDEST_INT|bool|size_t|BOOL_BITFIELD|CPPCHAR_SIGNED_T|ino_t|dev_t|HARD_REG_SET
 ITYPE  {IWORD}({WS}{IWORD})*
 ITYPE  {IWORD}({WS}{IWORD})*
+EOID   [^[:alnum:]_]
 
 %x in_struct in_struct_comment in_comment
 %option warn noyywrap nounput nodefault perf-report
 %option 8bit never-interactive
 %%
 
 %x in_struct in_struct_comment in_comment
 %option warn noyywrap nounput nodefault perf-report
 %option 8bit never-interactive
 %%
+  /* Do this on entry to yylex():  */
+  *yylval = 0;
+  if (lexer_toplevel_done)
+    {
+      BEGIN(INITIAL);
+      lexer_toplevel_done = 0;
+    }
 
 
-[^[:alnum:]_]typedef{WS}(struct|union){WS}{ID}{WS}?[*[:space:]]{WS}?{ID}{WS}?";" {
-  char *tagstart;
-  size_t taglen;
-  char *namestart;
-  size_t namelen;
-  int is_pointer = 0;
-  struct type *t;
-  int union_p;
-
-  tagstart = yytext + strlen (" typedef ");
-  while (ISSPACE (*tagstart))
-    tagstart++;
-  union_p = tagstart[0] == 'u';
-  tagstart += strlen ("union ");
-  while (ISSPACE (*tagstart))
-    tagstart++;
-  for (taglen = 1; ISIDNUM (tagstart[taglen]); taglen++)
-    ;
-  for (namestart = tagstart + taglen; 
-       ! ISIDNUM (*namestart);
-       namestart++)
-    if (*namestart == '*')
-      is_pointer = 1;
-  for (namelen = 1; ISIDNUM (namestart[namelen]); namelen++)
-    ;
-  t = find_structure ((const char *) xmemdup (tagstart, taglen, taglen+1),
-                     union_p);
-  if (is_pointer)
-    t = create_pointer (t);
-  namestart = (char *) xmemdup (namestart, namelen, namelen+1);
-#ifdef USE_MAPPED_LOCATION
-  /* temporary kludge - gentype doesn't handle cpp conditionals */
-  if (strcmp (namestart, "location_t") != 0
-      && strcmp (namestart, "expanded_location") != 0)
-#endif
-  do_typedef (namestart, t, &lexer_line);
-  update_lineno (yytext, yyleng);
+  /* Things we look for in skipping mode: */
+<INITIAL>{
+^{HWS}typedef/{EOID} {
+  BEGIN(in_struct);
+  return TYPEDEF;
 }
 }
-
-[^[:alnum:]_]typedef{WS}{ITYPE}{WS}{ID}{WS}?";" {
-
-  char *namestart;
-  size_t namelen;
-  char *typestart;
-  size_t typelen;
-
-  for (namestart = yytext + yyleng - 2; ISSPACE (*namestart); namestart--)
-    ;
-  for (namelen = 1; !ISSPACE (namestart[-namelen]); namelen++)
-    ;
-  namestart -= namelen - 1;
-  for (typestart = yytext + strlen (" typedef "); 
-       ISSPACE(*typestart);
-       typestart++)
-    ;
-  for (typelen = namestart - typestart;
-       ISSPACE (typestart[typelen-1]);
-       typelen--)
-    ;
-  typestart[typelen] = '\0';
-
-  do_typedef ((const char *) xmemdup (namestart, namelen, namelen+1),
-             create_scalar_type (typestart),
-             &lexer_line);
-  update_lineno (yytext, yyleng);
+^{HWS}struct/{EOID} {
+  BEGIN(in_struct);
+  return STRUCT;
 }
 }
-
-[^[:alnum:]_]typedef{WS}{ID}{WS}{ID}{WS}"(" {
-  char *namestart;
-  size_t namelen;
-
-  for (namestart = yytext + yyleng - 2; ISSPACE (*namestart); namestart--)
-    ;
-  for (namelen = 1; !ISSPACE (namestart[-namelen]); namelen++)
-    ;
-  namestart -= namelen - 1;
-
-  do_scalar_typedef ((const char *) xmemdup (namestart, namelen, namelen+1),
-                    &lexer_line);
-  update_lineno (yytext, yyleng);
+^{HWS}union/{EOID} {
+  BEGIN(in_struct);
+  return UNION;
 }
 }
-
-[^[:alnum:]_]typedef{WS}{ID}{WS}?"*"?{WS}?"("{WS}?"*"{WS}?{ID}{WS}?")"{WS}?"(" {
-  char *namestart;
-  size_t namelen;
-
-  for (namestart = yytext + yyleng - 2; !ISIDNUM (*namestart); namestart--)
-    ;
-  for (namelen = 1; ISIDNUM (namestart[-namelen]); namelen++)
-    ;
-  namestart -= namelen - 1;
-
-  do_scalar_typedef ((const char *) xmemdup (namestart, namelen, namelen+1),
-                    &lexer_line);
-  update_lineno (yytext, yyleng);
+^{HWS}extern/{EOID} {
+  BEGIN(in_struct);
+  return EXTERN;
 }
 }
-
-[^[:alnum:]_](typedef{WS})?(struct|union){WS}{ID}{WS}/"GTY" {
-  char *tagstart;
-  size_t taglen;
-  int typedef_p;
-  int union_p;
-
-  typedef_p = yytext[1] == 't';
-  if (typedef_p)
-    for (tagstart = yytext + strlen (" typedef "); 
-        ISSPACE(*tagstart);
-        tagstart++)
-      ;
-  else
-    tagstart = yytext + 1;
-
-  union_p = tagstart[0] == 'u';
-  tagstart += strlen ("union ");
-  while (ISSPACE (*tagstart))
-    tagstart++;
-  for (taglen = 1; ISIDNUM (tagstart[taglen]); taglen++)
-    ;
-
-  yylval.t = find_structure ((const char *) xmemdup (tagstart, taglen,
-                                                    taglen + 1),
-                            union_p);
+^{HWS}static/{EOID} {
   BEGIN(in_struct);
   BEGIN(in_struct);
-  update_lineno (yytext, yyleng);
-  return typedef_p ? ENT_TYPEDEF_STRUCT : ENT_STRUCT;
+  return STATIC;
 }
 
 }
 
-[^[:alnum:]_](extern|static){WS}/"GTY" {
+^{HWS}DEF_VEC_[OP]/{EOID} {
   BEGIN(in_struct);
   BEGIN(in_struct);
-  update_lineno (yytext, yyleng);
-  return ENT_EXTERNSTATIC;
+  return DEFVEC_OP;
 }
 }
-
-^"DEF_VEC_"[IPO]{WS}?"("{WS}?{ID}{WS}?")" {
-  /* Definition of a generic VEC structure.  If the letter after
-     DEF_VEC_ is "I", the structure definition is slightly different
-     than if it is "P" or "O".  */
-
-  char *p = yytext + sizeof("DEF_VEC_") - 1;
-  char *q;
-  const char *type;
-  bool is_I = (*p == 'I');
-
-  /* Extract the argument to the macro.  */
-  p++;
-  while (!ISALNUM(*p) && *p != '_')
-    p++;
-  q = p;
-  while (ISALNUM(*q) || *q == '_')
-    ++;
-  type = xmemdup (p, q - p, q - p + 1);
-
-  note_def_vec (type, is_I, &lexer_line);
-  note_def_vec_alloc (type, "none", &lexer_line);
+^{HWS}DEF_VEC_I/{EOID} {
+  BEGIN(in_struct);
+  return DEFVEC_I;
+}
+^{HWS}DEF_VEC_ALLOC_[IOP]/{EOID} {
+  BEGIN(in_struct);
+  return DEFVEC_ALLOC;
 }
 }
-
-^"DEF_VEC_ALLOC_"[IPO]{WS}?"("{WS}?{ID}{WS}?","{WS}?{ID}{WS}?")" {
-  /* Definition of an allocation strategy for a VEC structure.  For
-     purposes of gengtype, this just declares a wrapper structure.  */
-
-  char *p = yytext + sizeof("DEF_VEC_ALLOC_I") - 1;
-  char *q;
-  char *type, *astrat;
-
-  /* Extract the two arguments to the macro.  */
-  while (!ISALNUM(*p) && *p != '_')
-    p++;
-  q = p;
-  while (ISALNUM(*q) || *q == '_')
-    q++;
-  type = alloca (q - p + 1);
-  memcpy (type, p, q - p);
-  type[q - p] = '\0';
-  p = q;
-
-  while (!ISALNUM(*p) && *p != '_')
-    p++;
-  q = p;
-  while (ISALNUM(*q) || *q == '_')
-    q++;
-  astrat = alloca (q - p + 1);
-  memcpy (astrat, p, q - p);
-  astrat[q - p] = '\0';
-
-  note_def_vec_alloc (type, astrat, &lexer_line);
 }
 
 <in_struct>{
 }
 
 <in_struct>{
@@ -244,64 +107,59 @@ ITYPE     {IWORD}({WS}{IWORD})*
 "/*"                           { BEGIN(in_struct_comment); }
 
 {WS}                           { update_lineno (yytext, yyleng); }
 "/*"                           { BEGIN(in_struct_comment); }
 
 {WS}                           { update_lineno (yytext, yyleng); }
-
-"const"/[^[:alnum:]_]          /* don't care */
-"GTY"/[^[:alnum:]_]            { return GTY_TOKEN; }
-"VEC"/[^[:alnum:]_]            { return VEC_TOKEN; }
-"union"/[^[:alnum:]_]          { return UNION; }
-"struct"/[^[:alnum:]_]         { return STRUCT; }
-"enum"/[^[:alnum:]_]           { return ENUM; }
-"ptr_alias"/[^[:alnum:]_]      { return ALIAS; }
-"nested_ptr"/[^[:alnum:]_]     { return NESTED_PTR; }
+\\\n                           { lexer_line.line++; }
+
+"const"/{EOID}                 /* don't care */
+"GTY"/{EOID}                   { return GTY_TOKEN; }
+"VEC"/{EOID}                   { return VEC_TOKEN; }
+"union"/{EOID}                 { return UNION; }
+"struct"/{EOID}                        { return STRUCT; }
+"enum"/{EOID}                  { return ENUM; }
+"ptr_alias"/{EOID}             { return PTR_ALIAS; }
+"nested_ptr"/{EOID}            { return NESTED_PTR; }
 [0-9]+                         { return NUM; }
 [0-9]+                         { return NUM; }
-"param"[0-9]*"_is"/[^[:alnum:]_]               {
-  yylval.s = (const char *) xmemdup (yytext, yyleng, yyleng+1);
+"param"[0-9]*"_is"/{EOID}              {
+  *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
   return PARAM_IS;
 }
 
   return PARAM_IS;
 }
 
-{IWORD}({WS}{IWORD})*/[^[:alnum:]_]            |
+{IWORD}({WS}{IWORD})*/{EOID}           |
 "ENUM_BITFIELD"{WS}?"("{WS}?{ID}{WS}?")"       {
   size_t len;
 
   for (len = yyleng; ISSPACE (yytext[len-1]); len--)
     ;
 
 "ENUM_BITFIELD"{WS}?"("{WS}?{ID}{WS}?")"       {
   size_t len;
 
   for (len = yyleng; ISSPACE (yytext[len-1]); len--)
     ;
 
-  yylval.s = (const char *) xmemdup (yytext, len, len+1);
+  *yylval = XDUPVAR (const char, yytext, len, len+1);
   update_lineno (yytext, yyleng);
   return SCALAR;
 }
 
 
   update_lineno (yytext, yyleng);
   return SCALAR;
 }
 
 
-{ID}/[^[:alnum:]_]             {
-  yylval.s = (const char *) xmemdup (yytext, yyleng, yyleng+1);
+{ID}/{EOID}                    {
+  *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
   return ID;
 }
 
 \"([^"\\]|\\.)*\"              {
   return ID;
 }
 
 \"([^"\\]|\\.)*\"              {
-  yylval.s = (const char *) xmemdup (yytext+1, yyleng-2, yyleng-1);
+  *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
   return STRING;
 }
   return STRING;
 }
+  /* This "terminal" avoids having to parse integer constant expressions.  */
 "["[^\[\]]*"]"                 {
 "["[^\[\]]*"]"                 {
-  yylval.s = (const char *) xmemdup (yytext+1, yyleng-2, yyleng-1);
+  *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
   return ARRAY;
 }
 "'"("\\".|[^\\])"'"            {
   return ARRAY;
 }
 "'"("\\".|[^\\])"'"            {
-  yylval.s = (const char *) xmemdup (yytext+1, yyleng-2, yyleng);
+  *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng);
   return CHAR;
 }
 
   return CHAR;
 }
 
-[(){},*:<>]                    { return yytext[0]; }
+"..."                          { return ELLIPSIS; }
+[(){},*:<>;=%|-]               { return yytext[0]; }
 
 
-[;=]                           {
-  if (lexer_toplevel_done)
-    {
-      BEGIN(INITIAL);
-      lexer_toplevel_done = 0;
-    }
-  return yytext[0];
-}
-
-"#define"[^\n]*\n              {lexer_line.line++;}
+   /* ignore pp-directives */
+^{HWS}"#"{HWS}[a-z_]+[^\n]*\n   {lexer_line.line++;}
 
 .                              {
   error_at_line (&lexer_line, "unexpected character `%s'", yytext);
 
 .                              {
   error_at_line (&lexer_line, "unexpected character `%s'", yytext);
@@ -331,31 +189,25 @@ ITYPE     {IWORD}({WS}{IWORD})*
                 "unterminated comment or string; unexpected EOF");
 }
 
                 "unterminated comment or string; unexpected EOF");
 }
 
-^"#define"{WS}"GTY(" /* do nothing */
-{WS}"GTY"{WS}?"("      {
-  error_at_line (&lexer_line, "stray GTY marker");
-}
+^{HWS}"#"{HWS}"define"{WS}"GTY(" /* do nothing */
 
 %%
 
 void
 
 %%
 
 void
-yyerror (const char *s)
-{
-  error_at_line (&lexer_line, s);
-}
-
-void
-parse_file (const char *fname)
+yybegin (const char *fname)
 {
   yyin = fopen (fname, "r");
 {
   yyin = fopen (fname, "r");
-  lexer_line.file = fname;
-  lexer_line.line = 1;
   if (yyin == NULL)
     {
       perror (fname);
       exit (1);
     }
   if (yyin == NULL)
     {
       perror (fname);
       exit (1);
     }
-  if (yyparse() != 0)
-    exit (1);
+  lexer_line.file = fname;
+  lexer_line.line = 1;
+}
+
+void
+yyend (void)
+{
   fclose (yyin);
 }
   fclose (yyin);
 }