+%{
+ int lineno IF_LINT (= 0);
+ char *outname = NULL;
+%}
+
+"@output ".*\n {
+ char const *filename = yytext + sizeof "@output " - 1;
+ yytext[yyleng - 1] = '\0';
+
+ if (*filename == '@')
+ {
+ if (strcmp (filename, "@output_header_name@") == 0)
+ filename = spec_defines_file;
+ else if (strcmp (filename, "@output_parser_name@") == 0)
+ filename = parser_file_name;
+ else
+ abort ();
+ }
+
+ XFREE (outname);
+ outname = xstrdup (filename);
+ xfclose (yyout);
+ yyout = xfopen (outname, "w");
+ lineno = 1;
+}