| 1 | /* Scan Bison Skeletons. -*- C -*- |
| 2 | |
| 3 | Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. |
| 4 | |
| 5 | This file is part of Bison, the GNU Compiler Compiler. |
| 6 | |
| 7 | Bison is free software; you can redistribute it and/or modify it |
| 8 | under the terms of the GNU General Public License as published by |
| 9 | the Free Software Foundation; either version 2, or (at your option) |
| 10 | any later version. |
| 11 | |
| 12 | Bison is distributed in the hope that it will be useful, but |
| 13 | WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | General Public License for more details. |
| 16 | |
| 17 | You should have received a copy of the GNU General Public License |
| 18 | along with Bison; see the file COPYING. If not, write to the Free |
| 19 | Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 20 | 02110-1301, USA. */ |
| 21 | |
| 22 | %option nodefault noyywrap nounput never-interactive debug |
| 23 | %option prefix="skel_" outfile="lex.yy.c" |
| 24 | |
| 25 | %{ |
| 26 | #include "system.h" |
| 27 | |
| 28 | #include <error.h> |
| 29 | #include <quotearg.h> |
| 30 | |
| 31 | #include "complain.h" |
| 32 | #include "getargs.h" |
| 33 | #include "files.h" |
| 34 | #include "scan-skel.h" |
| 35 | |
| 36 | #define QPUTS(String) \ |
| 37 | fputs (quotearg_style (c_quoting_style, (String)), yyout) |
| 38 | |
| 39 | %} |
| 40 | %% |
| 41 | |
| 42 | %{ |
| 43 | int lineno IF_LINT (= 0); |
| 44 | char *outname = NULL; |
| 45 | %} |
| 46 | |
| 47 | "@output ".*\n { |
| 48 | char const *file_name = yytext + sizeof "@output " - 1; |
| 49 | yytext[yyleng - 1] = '\0'; |
| 50 | |
| 51 | if (*file_name == '@') |
| 52 | { |
| 53 | if (strcmp (file_name, "@output_header_name@") == 0) |
| 54 | file_name = spec_defines_file; |
| 55 | else if (strcmp (file_name, "@output_parser_name@") == 0) |
| 56 | file_name = parser_file_name; |
| 57 | else |
| 58 | fatal ("invalid token in skeleton: %s", yytext); |
| 59 | } |
| 60 | |
| 61 | if (outname) |
| 62 | { |
| 63 | free (outname); |
| 64 | xfclose (yyout); |
| 65 | } |
| 66 | outname = xstrdup (file_name); |
| 67 | yyout = xfopen (outname, "w"); |
| 68 | lineno = 1; |
| 69 | } |
| 70 | |
| 71 | "@@" fputc ('@', yyout); |
| 72 | "@{" fputc ('[', yyout); |
| 73 | "@}" fputc (']', yyout); |
| 74 | |
| 75 | "@oline@" fprintf (yyout, "%d", lineno + 1); |
| 76 | "@ofile@" QPUTS (outname); |
| 77 | "@output_parser_name@" QPUTS (parser_file_name); |
| 78 | "@output_header_name@" QPUTS (spec_defines_file); |
| 79 | |
| 80 | /* This pattern must not match more than the previous @ patterns. */ |
| 81 | @[^{}@\n]* fatal ("invalid @ in skeleton: %s", yytext); |
| 82 | \n lineno++; ECHO; |
| 83 | [^@\n]+ ECHO; |
| 84 | |
| 85 | <<EOF>> { |
| 86 | if (outname) |
| 87 | { |
| 88 | free (outname); |
| 89 | xfclose (yyout); |
| 90 | } |
| 91 | return EOF; |
| 92 | } |
| 93 | %% |
| 94 | |
| 95 | /*------------------------. |
| 96 | | Scan a Bison skeleton. | |
| 97 | `------------------------*/ |
| 98 | |
| 99 | void |
| 100 | scan_skel (FILE *in) |
| 101 | { |
| 102 | skel_in = in; |
| 103 | skel__flex_debug = trace_flag & trace_skeleton; |
| 104 | skel_lex (); |
| 105 | /* Reclaim Flex's buffers. */ |
| 106 | yy_delete_buffer (YY_CURRENT_BUFFER); |
| 107 | } |