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