]> git.saurik.com Git - bison.git/blame - src/scan-skel.l
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / scan-skel.l
CommitLineData
be2a1a68 1/* Scan Bison Skeletons. -*- C -*-
353d3eb6 2
139c548a 3 Copyright (C) 2001-2012 Free Software Foundation, Inc.
1239777d
AD
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819
PE
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
1239777d 11
f16b0819
PE
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
9b3add5b 16
1239777d 17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
9b3add5b 19
8d90395d 20%option nodefault noyywrap noinput nounput never-interactive debug
aed7fd9b 21%option prefix="skel_" outfile="lex.yy.c"
9b3add5b 22
aed7fd9b 23%{
4f6e011e
PE
24/* Work around a bug in flex 2.5.31. See Debian bug 333231
25 <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
26#undef skel_wrap
27#define skel_wrap() 1
28
f9bfc42a 29#define FLEX_PREFIX(Id) skel_ ## Id
0305d25e 30#include <src/flex-scanner.h>
353d3eb6 31
cb48f191 32#include <dirname.h>
353d3eb6
PE
33#include <error.h>
34#include <quotearg.h>
35
0305d25e
AD
36#include <src/complain.h>
37#include <src/getargs.h>
38#include <src/files.h>
39#include <src/scan-skel.h>
dc9701e8 40
08af01c2
JD
41#define YY_DECL static int skel_lex (void)
42YY_DECL;
06f01bc4 43
c5e3e510 44#define QPUTS(String) \
68cae94e 45 fputs (quotearg_style (c_quoting_style, String), yyout)
c5e3e510 46
3eb82471
JD
47static void at_directive_perform (int at_directive_argc,
48 char *at_directive_argv[],
49 char **outnamep, int *out_linenop);
50static void fail_for_at_directive_too_many_args (char const *at_directive_name);
51static void fail_for_at_directive_too_few_args (char const *at_directive_name);
08af01c2 52static void fail_for_invalid_at (char const *at);
aed7fd9b 53%}
08af01c2 54
3eb82471 55%x SC_AT_DIRECTIVE_ARGS
08af01c2
JD
56%x SC_AT_DIRECTIVE_SKIP_WS
57
9b3add5b 58%%
e9683cfd
PE
59
60%{
84f6a6ca 61 int out_lineno PACIFY_CC (= 0);
e9683cfd 62 char *outname = NULL;
3eb82471
JD
63
64 /* Currently, only the @warn, @complain, @fatal, @warn_at, @complain_at, and
65 @fatal_at directives take multiple arguments, and the last three already
66 can't take more than 7. at_directive_argv[0] is the directive name. */
67 #define AT_DIRECTIVE_ARGC_MAX 8
68 int at_directive_argc = 0;
69 char *at_directive_argv[AT_DIRECTIVE_ARGC_MAX];
e9683cfd
PE
70%}
71
7dc4a694
JD
72"@@" fputc ('@', yyout);
73"@{" fputc ('[', yyout);
74"@}" fputc (']', yyout);
4d24ffb7
AD
75"@`" continue; /* Used by b4_cat in ../data/bison.m4. */
76@\n continue;
e9683cfd 77
3fc65ead 78"@oline@" fprintf (yyout, "%d", out_lineno + 1);
c5e3e510 79"@ofile@" QPUTS (outname);
bd9d212b 80
08af01c2
JD
81@[a-z_]+"(" {
82 yytext[yyleng-1] = '\0';
3eb82471
JD
83 obstack_grow (&obstack_for_string, yytext, yyleng);
84 at_directive_argv[at_directive_argc++] =
85 obstack_finish (&obstack_for_string);
86 BEGIN SC_AT_DIRECTIVE_ARGS;
bd9d212b 87}
e9683cfd 88
3fc16193 89 /* This pattern must not match more than the previous @ patterns. */
7dc4a694 90@[^@{}`(\n]* fail_for_invalid_at (yytext);
e9690142
JD
91\n out_lineno++; ECHO;
92[^@\n]+ ECHO;
e9683cfd 93
4d24ffb7 94<<EOF>> {
7ec5ab2e
PE
95 if (outname)
96 {
97 free (outname);
98 xfclose (yyout);
99 }
100 return EOF;
101}
08af01c2 102
4d24ffb7
AD
103<SC_AT_DIRECTIVE_ARGS>
104{
105 [^@]+ STRING_GROW;
08af01c2 106
4d24ffb7
AD
107 "@@" obstack_1grow (&obstack_for_string, '@');
108 "@{" obstack_1grow (&obstack_for_string, '[');
109 "@}" obstack_1grow (&obstack_for_string, ']');
110 "@`" continue; /* For starting an argument that begins with whitespace. */
111 @\n continue;
08af01c2
JD
112
113 @[,)] {
114 if (at_directive_argc >= AT_DIRECTIVE_ARGC_MAX)
3eb82471 115 fail_for_at_directive_too_many_args (at_directive_argv[0]);
08af01c2
JD
116
117 obstack_1grow (&obstack_for_string, '\0');
118 at_directive_argv[at_directive_argc++] =
119 obstack_finish (&obstack_for_string);
120
121 /* Like M4, skip whitespace after a comma. */
122 if (yytext[1] == ',')
123 BEGIN SC_AT_DIRECTIVE_SKIP_WS;
124 else
125 {
3eb82471
JD
126 at_directive_perform (at_directive_argc, at_directive_argv,
127 &outname, &out_lineno);
08af01c2
JD
128 obstack_free (&obstack_for_string, at_directive_argv[0]);
129 at_directive_argc = 0;
08af01c2
JD
130 BEGIN INITIAL;
131 }
132 }
133
4d24ffb7 134 @.? fail_for_invalid_at (yytext);
08af01c2
JD
135}
136
4d24ffb7
AD
137<SC_AT_DIRECTIVE_SKIP_WS>
138{
139 [ \t\r\n] continue;
3eb82471 140 . { yyless (0); BEGIN SC_AT_DIRECTIVE_ARGS; }
08af01c2
JD
141}
142
4d24ffb7
AD
143<SC_AT_DIRECTIVE_ARGS,SC_AT_DIRECTIVE_SKIP_WS>
144{
08af01c2 145 <<EOF>> {
6fb8b256
VS
146 complain (fatal, _("unclosed %s directive in skeleton"),
147 at_directive_argv[0]);
08af01c2
JD
148 }
149}
150
9b3add5b 151%%
536545f3 152
2cdb2a7b
PE
153/*------------------------.
154| Scan a Bison skeleton. |
155`------------------------*/
536545f3 156
536545f3 157void
2cdb2a7b 158scan_skel (FILE *in)
536545f3 159{
08af01c2
JD
160 static bool initialized = false;
161 if (!initialized)
162 {
163 initialized = true;
164 obstack_init (&obstack_for_string);
165 }
2cdb2a7b 166 skel_in = in;
c5e3e510 167 skel__flex_debug = trace_flag & trace_skeleton;
536545f3 168 skel_lex ();
536545f3 169}
bd9d212b 170
3fc65ead
JD
171void
172skel_scanner_free (void)
173{
174 obstack_free (&obstack_for_string, 0);
3eb82471
JD
175 /* Reclaim Flex's buffers. */
176 yylex_destroy ();
3fc65ead
JD
177}
178
f39ab286
JD
179static void
180at_directive_perform (int at_directive_argc,
181 char *at_directive_argv[],
182 char **outnamep, int *out_linenop)
3fc65ead 183{
f518dbaf 184 if (STREQ (at_directive_argv[0], "@basename"))
3fc65ead 185 {
3eb82471
JD
186 if (at_directive_argc > 2)
187 fail_for_at_directive_too_many_args (at_directive_argv[0]);
188 fputs (last_component (at_directive_argv[1]), yyout);
3fc65ead 189 }
f518dbaf
AD
190 else if (STREQ (at_directive_argv[0], "@warn")
191 || STREQ (at_directive_argv[0], "@complain")
192 || STREQ (at_directive_argv[0], "@fatal"))
3fc65ead 193 {
6fb8b256 194 warnings complaint_flag;
3eb82471 195 switch (at_directive_argv[0][1])
3fc65ead 196 {
6fb8b256
VS
197 case 'w': complaint_flag = Wother; break;
198 case 'c': complaint_flag = complaint; break;
199 case 'f': complaint_flag = fatal; break;
200 default: aver (false); break;
3fc65ead
JD
201 }
202 switch (at_directive_argc)
203 {
87b0a375 204 case 2:
6fb8b256 205 complain (complaint_flag, "%s", _(at_directive_argv[1]));
3fc65ead 206 break;
87b0a375 207 case 3:
6fb8b256
VS
208 complain (complaint_flag, _(at_directive_argv[1]),
209 at_directive_argv[2]);
3fc65ead 210 break;
87b0a375 211 case 4:
6fb8b256
VS
212 complain (complaint_flag, _(at_directive_argv[1]),
213 at_directive_argv[2], at_directive_argv[3]);
3fc65ead 214 break;
87b0a375 215 case 5:
6fb8b256
VS
216 complain (complaint_flag, _(at_directive_argv[1]),
217 at_directive_argv[2], at_directive_argv[3],
218 at_directive_argv[4]);
3fc65ead 219 break;
87b0a375 220 case 6:
6fb8b256
VS
221 complain (complaint_flag, _(at_directive_argv[1]),
222 at_directive_argv[2], at_directive_argv[3],
223 at_directive_argv[4], at_directive_argv[5]);
3fc65ead
JD
224 break;
225 default:
3eb82471 226 fail_for_at_directive_too_many_args (at_directive_argv[0]);
3fc65ead
JD
227 break;
228 }
229 }
f518dbaf
AD
230 else if (STREQ (at_directive_argv[0], "@warn_at")
231 || STREQ (at_directive_argv[0], "@complain_at")
232 || STREQ (at_directive_argv[0], "@fatal_at"))
3fc65ead 233 {
6fb8b256 234 warnings complaint_flag;
3fc65ead 235 location loc;
3eb82471
JD
236 if (at_directive_argc < 4)
237 fail_for_at_directive_too_few_args (at_directive_argv[0]);
238 switch (at_directive_argv[0][1])
3fc65ead 239 {
6fb8b256
VS
240 case 'w': complaint_flag = Wother; break;
241 case 'c': complaint_flag = complaint; break;
242 case 'f': complaint_flag = fatal; break;
243 default: aver (false); break;
3fc65ead 244 }
3eb82471
JD
245 boundary_set_from_string (&loc.start, at_directive_argv[1]);
246 boundary_set_from_string (&loc.end, at_directive_argv[2]);
3fc65ead
JD
247 switch (at_directive_argc)
248 {
87b0a375 249 case 4:
6fb8b256 250 complain_at (loc, complaint_flag, "%s", _(at_directive_argv[3]));
3fc65ead 251 break;
87b0a375 252 case 5:
6fb8b256
VS
253 complain_at (loc, complaint_flag, _(at_directive_argv[3]),
254 at_directive_argv[4]);
3fc65ead 255 break;
87b0a375 256 case 6:
6fb8b256
VS
257 complain_at (loc, complaint_flag, _(at_directive_argv[3]),
258 at_directive_argv[4], at_directive_argv[5]);
3fc65ead 259 break;
87b0a375 260 case 7:
6fb8b256
VS
261 complain_at (loc, complaint_flag, _(at_directive_argv[3]),
262 at_directive_argv[4], at_directive_argv[5],
263 at_directive_argv[6]);
3fc65ead 264 break;
87b0a375 265 case 8:
6fb8b256
VS
266 complain_at (loc, complaint_flag, _(at_directive_argv[3]),
267 at_directive_argv[4], at_directive_argv[5],
268 at_directive_argv[6], at_directive_argv[7]);
3fc65ead
JD
269 break;
270 default:
3eb82471 271 fail_for_at_directive_too_many_args (at_directive_argv[0]);
3fc65ead
JD
272 break;
273 }
274 }
f518dbaf 275 else if (STREQ (at_directive_argv[0], "@output"))
3fc65ead 276 {
3eb82471
JD
277 if (at_directive_argc > 2)
278 fail_for_at_directive_too_many_args (at_directive_argv[0]);
3fc65ead
JD
279 if (*outnamep)
280 {
281 free (*outnamep);
282 xfclose (yyout);
283 }
3eb82471 284 *outnamep = xstrdup (at_directive_argv[1]);
f39ab286 285 output_file_name_check (outnamep);
3fc65ead
JD
286 yyout = xfopen (*outnamep, "w");
287 *out_linenop = 1;
288 }
289 else
3eb82471 290 fail_for_invalid_at (at_directive_argv[0]);
3fc65ead
JD
291}
292
293static void
3eb82471 294fail_for_at_directive_too_few_args (char const *at_directive_name)
3fc65ead 295{
6fb8b256 296 complain (fatal, _("too few arguments for %s directive in skeleton"),
3fc65ead
JD
297 at_directive_name);
298}
299
08af01c2 300static void
3eb82471 301fail_for_at_directive_too_many_args (char const *at_directive_name)
bd9d212b 302{
6fb8b256
VS
303 complain (fatal, _("too many arguments for %s directive in skeleton"),
304 at_directive_name);
08af01c2
JD
305}
306
307static void
308fail_for_invalid_at (char const *at)
309{
6fb8b256 310 complain (fatal, "invalid @ in skeleton: %s", at);
08af01c2 311}