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