static void output_pure_parser(FILE * fp) { putc_code(fp, '\n'); if (fp == code_file) outline += 1; fprintf(fp, "#define YYPURE %d\n", pure_parser); putc_code(fp, '\n'); }
static void output_prefix(FILE * fp) { if (symbol_prefix == NULL) { symbol_prefix = "yy"; } else { define_prefixed(fp, "yyparse"); define_prefixed(fp, "yylex"); define_prefixed(fp, "yyerror"); define_prefixed(fp, "yychar"); define_prefixed(fp, "yyval"); define_prefixed(fp, "yylval"); define_prefixed(fp, "yydebug"); define_prefixed(fp, "yynerrs"); define_prefixed(fp, "yyerrflag"); define_prefixed(fp, "yylhs"); define_prefixed(fp, "yylen"); define_prefixed(fp, "yydefred"); #if defined(YYBTYACC) define_prefixed(fp, "yystos"); #endif define_prefixed(fp, "yydgoto"); define_prefixed(fp, "yysindex"); define_prefixed(fp, "yyrindex"); define_prefixed(fp, "yygindex"); define_prefixed(fp, "yytable"); define_prefixed(fp, "yycheck"); define_prefixed(fp, "yyname"); define_prefixed(fp, "yyrule"); #if defined(YYBTYACC) if (locations) { define_prefixed(fp, "yyloc"); define_prefixed(fp, "yylloc"); } putc_code(fp, '\n'); putl_code(fp, "#if YYBTYACC\n"); define_prefixed(fp, "yycindex"); define_prefixed(fp, "yyctable"); putc_code(fp, '\n'); putl_code(fp, "#endif /* YYBTYACC */\n"); putc_code(fp, '\n'); #endif } if (CountLine(fp)) ++outline; fprintf(fp, "#define YYPREFIX \"%s\"\n", symbol_prefix); }
static void output_trailing_text(void) { int c, last; FILE *in; if (line == 0) return; in = input_file; c = *cptr; if (c == '\n') { ++lineno; if ((c = getc(in)) == EOF) return; write_input_lineno(); putc_code(code_file, c); last = c; } else { write_input_lineno(); do { putc_code(code_file, c); } while ((c = *++cptr) != '\n'); putc_code(code_file, c); last = '\n'; } while ((c = getc(in)) != EOF) { putc_code(code_file, c); last = c; } if (last != '\n') { putc_code(code_file, '\n'); } write_code_lineno(code_file); }
static void output_stored_text(FILE * fp) { int c; FILE *in; rewind(text_file); if (text_file == NULL) open_error("text_file"); in = text_file; if ((c = getc(in)) == EOF) return; putc_code(fp, c); while ((c = getc(in)) != EOF) { putc_code(fp, c); } write_code_lineno(fp); }
static void output_stype(FILE * fp) { if (!unionized && ntags == 0) { putc_code(fp, '\n'); putl_code(fp, "#ifndef YYSTYPE\n"); putl_code(fp, "typedef int YYSTYPE;\n"); putl_code(fp, "#endif\n"); } }
static void output_semantic_actions(void) { int c, last; rewind(action_file); if ((c = getc(action_file)) == EOF) return; last = c; putc_code(code_file, c); while ((c = getc(action_file)) != EOF) { putc_code(code_file, c); last = c; } if (last != '\n') { putc_code(code_file, '\n'); } write_code_lineno(code_file); }
static void output_stype(FILE * fp) { if (!unionized && ntags == 0) { putc_code(fp, '\n'); putl_code(fp, "#if " "! defined(YYSTYPE) && " "! defined(YYSTYPE_IS_DECLARED)\n"); putl_code(fp, "/* Default: YYSTYPE is the semantic value type. */\n"); putl_code(fp, "typedef int YYSTYPE;\n"); putl_code(fp, "# define YYSTYPE_IS_DECLARED 1\n"); putl_code(fp, "#endif\n"); } }
static void output_ltype(FILE * fp) { putc_code(fp, '\n'); putl_code(fp, "#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED\n"); putl_code(fp, "/* Default: YYLTYPE is the text position type. */\n"); putl_code(fp, "typedef struct YYLTYPE\n"); putl_code(fp, "{\n"); putl_code(fp, " int first_line;\n"); putl_code(fp, " int first_column;\n"); putl_code(fp, " int last_line;\n"); putl_code(fp, " int last_column;\n"); putl_code(fp, " unsigned source;\n"); putl_code(fp, "} YYLTYPE;\n"); putl_code(fp, "#define YYLTYPE_IS_DECLARED 1\n"); putl_code(fp, "#endif\n"); putl_code(fp, "#define YYRHSLOC(rhs, k) ((rhs)[k])\n"); }
void output(void) { FILE *fp; free_itemsets(); free_shifts(); free_reductions(); if (iflag) { ++outline; fprintf(code_file, "#include \"%s\"\n", externs_file_name); fp = externs_file; } else fp = code_file; output_prefix(iflag ? externs_file : output_file); output_pure_parser(fp); output_stored_text(fp); output_stype(fp); output_parse_decl(fp); output_lex_decl(fp); output_error_decl(fp); write_section(fp, xdecls); if (iflag) { output_externs(externs_file, global_vars); if (!pure_parser) output_externs(externs_file, impure_vars); } if (iflag) { ++outline; fprintf(code_file, "#include \"%s\"\n", defines_file_name); if (!dflag) output_defines(externs_file); } else { putc_code(code_file, '\n'); output_defines(code_file); } if (dflag) output_defines(defines_file); output_rule_data(); output_yydefred(); output_actions(); free_parser(); output_debug(); if (rflag) { output_prefix(code_file); write_section(code_file, xdecls); write_section(code_file, tables); } write_section(code_file, global_vars); if (!pure_parser) { write_section(code_file, impure_vars); } write_section(code_file, hdr_defs); if (!pure_parser) { write_section(code_file, hdr_vars); } output_trailing_text(); write_section(code_file, body_1); if (pure_parser) { write_section(code_file, body_vars); } write_section(code_file, body_2); output_yyerror_call("syntax error"); write_section(code_file, body_3); output_semantic_actions(); write_section(code_file, trailer); output_yyerror_call("yacc stack overflow"); write_section(code_file, trailer_2); }