1*38fd1498Szrj /* -*- indented-text -*- */
2*38fd1498Szrj /* Process source files and output type information.
3*38fd1498Szrj    Copyright (C) 2002-2018 Free Software Foundation, Inc.
4*38fd1498Szrj 
5*38fd1498Szrj This file is part of GCC.
6*38fd1498Szrj 
7*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
8*38fd1498Szrj the terms of the GNU General Public License as published by the Free
9*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
10*38fd1498Szrj version.
11*38fd1498Szrj 
12*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*38fd1498Szrj for more details.
16*38fd1498Szrj 
17*38fd1498Szrj You should have received a copy of the GNU General Public License
18*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
19*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
20*38fd1498Szrj 
21*38fd1498Szrj %option noinput
22*38fd1498Szrj 
23*38fd1498Szrj %{
24*38fd1498Szrj #ifdef HOST_GENERATOR_FILE
25*38fd1498Szrj #include "config.h"
26*38fd1498Szrj #define GENERATOR_FILE 1
27*38fd1498Szrj #else
28*38fd1498Szrj #include "bconfig.h"
29*38fd1498Szrj #endif
30*38fd1498Szrj #include "system.h"
31*38fd1498Szrj 
32*38fd1498Szrj #define malloc xmalloc
33*38fd1498Szrj #define realloc xrealloc
34*38fd1498Szrj 
35*38fd1498Szrj #include "gengtype.h"
36*38fd1498Szrj 
37*38fd1498Szrj #define YY_DECL int yylex (const char **yylval)
38*38fd1498Szrj #define yyterminate() return EOF_TOKEN
39*38fd1498Szrj 
40*38fd1498Szrj struct fileloc lexer_line;
41*38fd1498Szrj int lexer_toplevel_done;
42*38fd1498Szrj 
43*38fd1498Szrj static void
update_lineno(const char * l,size_t len)44*38fd1498Szrj update_lineno (const char *l, size_t len)
45*38fd1498Szrj {
46*38fd1498Szrj   while (len-- > 0)
47*38fd1498Szrj     if (*l++ == '\n')
48*38fd1498Szrj       lexer_line.line++;
49*38fd1498Szrj }
50*38fd1498Szrj 
51*38fd1498Szrj %}
52*38fd1498Szrj 
53*38fd1498Szrj CID	[[:alpha:]_][[:alnum:]_]*
54*38fd1498Szrj WS	[[:space:]]+
55*38fd1498Szrj HWS	[ \t\r\v\f]*
56*38fd1498Szrj IWORD	short|long|(un)?signed|char|int|HOST_WIDE_INT|uint64_t|int64_t|bool|size_t|BOOL_BITFIELD|CPPCHAR_SIGNED_T|ino_t|dev_t|HARD_REG_SET
57*38fd1498Szrj ITYPE	{IWORD}({WS}{IWORD})*
58*38fd1498Szrj     /* Include '::' in identifiers to capture C++ scope qualifiers.  */
59*38fd1498Szrj ID	{CID}({HWS}::{HWS}{CID})*
60*38fd1498Szrj EOID	[^[:alnum:]_]
61*38fd1498Szrj CXX_KEYWORD inline|public:|private:|protected:|template|operator|friend|static
62*38fd1498Szrj 
63*38fd1498Szrj %x in_struct in_struct_comment in_comment
64*38fd1498Szrj %option warn noyywrap nounput nodefault perf-report
65*38fd1498Szrj %option 8bit never-interactive
66*38fd1498Szrj %%
67*38fd1498Szrj   /* Do this on entry to yylex():  */
68*38fd1498Szrj   *yylval = 0;
69*38fd1498Szrj   if (lexer_toplevel_done)
70*38fd1498Szrj     {
71*38fd1498Szrj       BEGIN(INITIAL);
72*38fd1498Szrj       lexer_toplevel_done = 0;
73*38fd1498Szrj     }
74*38fd1498Szrj 
75*38fd1498Szrj   /* Things we look for in skipping mode: */
76*38fd1498Szrj <INITIAL>{
77*38fd1498Szrj ^{HWS}typedef/{EOID} {
78*38fd1498Szrj   BEGIN(in_struct);
79*38fd1498Szrj   return TYPEDEF;
80*38fd1498Szrj }
81*38fd1498Szrj ^{HWS}struct/{EOID} {
82*38fd1498Szrj   BEGIN(in_struct);
83*38fd1498Szrj   return STRUCT;
84*38fd1498Szrj }
85*38fd1498Szrj ^{HWS}union/{EOID} {
86*38fd1498Szrj   BEGIN(in_struct);
87*38fd1498Szrj   return UNION;
88*38fd1498Szrj }
89*38fd1498Szrj ^{HWS}class/{EOID} {
90*38fd1498Szrj   BEGIN(in_struct);
91*38fd1498Szrj   return STRUCT;
92*38fd1498Szrj }
93*38fd1498Szrj ^{HWS}extern/{EOID} {
94*38fd1498Szrj   BEGIN(in_struct);
95*38fd1498Szrj   return EXTERN;
96*38fd1498Szrj }
97*38fd1498Szrj ^{HWS}static/{EOID} {
98*38fd1498Szrj   BEGIN(in_struct);
99*38fd1498Szrj   return STATIC;
100*38fd1498Szrj }
101*38fd1498Szrj }
102*38fd1498Szrj 
103*38fd1498Szrj     /* Parsing inside a struct, union or class declaration.  */
104*38fd1498Szrj <in_struct>{
105*38fd1498Szrj "/*"				{ BEGIN(in_struct_comment); }
106*38fd1498Szrj "//".*\n			{ lexer_line.line++; }
107*38fd1498Szrj 
108*38fd1498Szrj {WS}				{ update_lineno (yytext, yyleng); }
109*38fd1498Szrj \\\n				{ lexer_line.line++; }
110*38fd1498Szrj 
111*38fd1498Szrj "const"/{EOID}			/* don't care */
112*38fd1498Szrj {CXX_KEYWORD}/{EOID}			|
113*38fd1498Szrj "~"					|
114*38fd1498Szrj "^"					|
115*38fd1498Szrj "&"					{
116*38fd1498Szrj     *yylval = XDUPVAR (const char, yytext, yyleng, yyleng + 1);
117*38fd1498Szrj     return IGNORABLE_CXX_KEYWORD;
118*38fd1498Szrj }
119*38fd1498Szrj "GTY"/{EOID}			{ return GTY_TOKEN; }
120*38fd1498Szrj "union"/{EOID}			{ return UNION; }
121*38fd1498Szrj "struct"/{EOID}			{ return STRUCT; }
122*38fd1498Szrj "class"/{EOID}			{ return STRUCT; }
123*38fd1498Szrj "typedef"/{EOID}		{ return TYPEDEF; }
124*38fd1498Szrj "enum"/{EOID}			{ return ENUM; }
125*38fd1498Szrj "ptr_alias"/{EOID}	  	{ return PTR_ALIAS; }
126*38fd1498Szrj "nested_ptr"/{EOID}		{ return NESTED_PTR; }
127*38fd1498Szrj "user"/{EOID}			{ return USER_GTY; }
128*38fd1498Szrj [0-9]+				{ return NUM; }
129*38fd1498Szrj 
130*38fd1498Szrj {IWORD}({WS}{IWORD})*/{EOID}		|
131*38fd1498Szrj "ENUM_BITFIELD"{WS}?"("{WS}?{ID}{WS}?")"	{
132*38fd1498Szrj   size_t len;
133*38fd1498Szrj 
134*38fd1498Szrj   for (len = yyleng; ISSPACE (yytext[len-1]); len--)
135*38fd1498Szrj     ;
136*38fd1498Szrj 
137*38fd1498Szrj   *yylval = XDUPVAR (const char, yytext, len, len+1);
138*38fd1498Szrj   update_lineno (yytext, yyleng);
139*38fd1498Szrj   return SCALAR;
140*38fd1498Szrj }
141*38fd1498Szrj 
142*38fd1498Szrj {ID}/{EOID}			{
143*38fd1498Szrj   *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
144*38fd1498Szrj   return ID;
145*38fd1498Szrj }
146*38fd1498Szrj 
147*38fd1498Szrj \"([^"\\]|\\.)*\"		{
148*38fd1498Szrj   *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
149*38fd1498Szrj   return STRING;
150*38fd1498Szrj }
151*38fd1498Szrj   /* This "terminal" avoids having to parse integer constant expressions.  */
152*38fd1498Szrj "["[^\[\]]*"]"			{
153*38fd1498Szrj   *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
154*38fd1498Szrj   return ARRAY;
155*38fd1498Szrj }
156*38fd1498Szrj "'"("\\".|[^\\])"'"		{
157*38fd1498Szrj   *yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng);
158*38fd1498Szrj   return CHAR;
159*38fd1498Szrj }
160*38fd1498Szrj 
161*38fd1498Szrj "..."				{ return ELLIPSIS; }
162*38fd1498Szrj [(){},*:<>;=%/|+\!\?\.-]	{ return yytext[0]; }
163*38fd1498Szrj 
164*38fd1498Szrj    /* ignore pp-directives */
165*38fd1498Szrj ^{HWS}"#"{HWS}[a-z_]+[^\n]*\n   {lexer_line.line++;}
166*38fd1498Szrj 
167*38fd1498Szrj .				{
168*38fd1498Szrj   error_at_line (&lexer_line, "unexpected character `%s'", yytext);
169*38fd1498Szrj }
170*38fd1498Szrj }
171*38fd1498Szrj 
172*38fd1498Szrj "/*"			{ BEGIN(in_comment); }
173*38fd1498Szrj "//".*\n		{ lexer_line.line++; }
174*38fd1498Szrj \n			{ lexer_line.line++; }
175*38fd1498Szrj {ID}			|
176*38fd1498Szrj "'"("\\".|[^\\])"'"	|
177*38fd1498Szrj [^"/\n]			/* do nothing */
178*38fd1498Szrj \"([^"\\]|\\.|\\\n)*\"	{ update_lineno (yytext, yyleng); }
179*38fd1498Szrj "/"/[^*]		/* do nothing */
180*38fd1498Szrj 
181*38fd1498Szrj <in_comment,in_struct_comment>{
182*38fd1498Szrj \n		{ lexer_line.line++; }
183*38fd1498Szrj [^*\n]{16}	|
184*38fd1498Szrj [^*\n]		/* do nothing */
185*38fd1498Szrj "*"/[^/]	/* do nothing */
186*38fd1498Szrj }
187*38fd1498Szrj 
188*38fd1498Szrj <in_comment>"*/"	{ BEGIN(INITIAL); }
189*38fd1498Szrj <in_struct_comment>"*/"	{ BEGIN(in_struct); }
190*38fd1498Szrj 
191*38fd1498Szrj ["/]    		|
192*38fd1498Szrj <in_struct_comment,in_comment>"*"	{
193*38fd1498Szrj   error_at_line (&lexer_line,
194*38fd1498Szrj 		 "unterminated comment or string; unexpected EOF");
195*38fd1498Szrj }
196*38fd1498Szrj 
197*38fd1498Szrj ^{HWS}"#"{HWS}"define"{WS}"GTY(" /* do nothing */
198*38fd1498Szrj 
199*38fd1498Szrj %%
200*38fd1498Szrj 
201*38fd1498Szrj void
202*38fd1498Szrj yybegin (const char *fname)
203*38fd1498Szrj {
204*38fd1498Szrj   yyin = fopen (fname, "r");
205*38fd1498Szrj   if (yyin == NULL)
206*38fd1498Szrj     {
207*38fd1498Szrj       perror (fname);
208*38fd1498Szrj       exit (1);
209*38fd1498Szrj     }
210*38fd1498Szrj   lexer_line.file = input_file_by_name (fname);
211*38fd1498Szrj   lexer_line.line = 1;
212*38fd1498Szrj }
213*38fd1498Szrj 
214*38fd1498Szrj void
215*38fd1498Szrj yyend (void)
216*38fd1498Szrj {
217*38fd1498Szrj   fclose (yyin);
218*38fd1498Szrj }
219