void scan_init(const int case_insensitive, const int newline_visible, const int show_skips, const int symbol_echo, char * token_names) { scan_case_insensitive = case_insensitive; scan_show_skips = show_skips; scan_newline_visible = newline_visible; scan_symbol_echo = symbol_echo; scan_token_names = token_names; scan_comment_list = (scan_comment_block*) mem_calloc(1, sizeof(scan_comment_block)); scan_comment_list_end = scan_comment_list; text_scan_data = mem_calloc(1, sizeof(scan_data)); scan_table = symbol_new_table("scan table", 101, 31, symbol_compare_string, symbol_hash_string, symbol_print_string); scan_insert_comment_block("",0,0); }
int main(int argc, char *argv[]) { clock_t rdp_finish_time, rdp_start_time = clock(); int rdp_symbol_statistics = 0, /* show symbol_ table statistics flag */ rdp_line_echo_all = 0, /* make a listing on all passes flag */ rdp_filter = 0, /* filter flag */ rdp_line_echo = 0, /* make listing flag */ rdp_lexicalise = 0; /* print lexicalised output flag */ unsigned long rdp_textsize = 35000l; /* size of scanner text array */ unsigned long rdp_tabwidth = 8l; /* tab expansion width */ char* rdp_vcg_filename = NULL; /* filename for -V option */ rdp_tree_node_data* rdp_tree = (rdp_tree_node_data*) graph_insert_graph("RDP derivation tree"); /* hook for derivation tree */ rdp_tree_node_data* rdp_tree_root; arg_message("Minitree compiler V1.50 (c) Adrian Johnstone 1997\n" RDP_STAMP "\n\n""Usage: minitree [options] source[.m]"); arg_message(""); arg_boolean('f', "Filter mode (read from stdin and write to stdout)", &rdp_filter); arg_boolean('l', "Make a listing", &rdp_line_echo); arg_boolean('L', "Print lexicalised source file", &rdp_lexicalise); arg_string ('o', "Write output to filename", &rdp_outputfilename); arg_boolean('s', "Echo each scanner symbol as it is read", &rdp_symbol_echo); arg_boolean('S', "Print summary symbol table statistics", &rdp_symbol_statistics); arg_numeric('t', "Tab expansion width (default 8)", &rdp_tabwidth); arg_numeric('T', "Text buffer size in bytes for scanner (default 20000)", &rdp_textsize); arg_boolean('v', "Set verbose mode", &rdp_verbose); arg_string ('V', "Write derivation tree to filename in VCG format", &rdp_vcg_filename); rdp_sourcefilenames = arg_process(argc, argv); /* Fix up filetypes */ for (rdp_sourcefilenumber = 0; rdp_sourcefilenames[rdp_sourcefilenumber] != NULL; rdp_sourcefilenumber++) rdp_sourcefilenames[rdp_sourcefilenumber] = text_default_filetype(rdp_sourcefilenames[rdp_sourcefilenumber], "m"); if (rdp_filter) { rdp_sourcefilenames[0] = "-"; rdp_outputfilename = "-"; rdp_sourcefilenames[1] = NULL; /* make sure no further filenames are taken from the array */ } if ((rdp_sourcefilename = rdp_sourcefilenames[0]) == NULL) arg_help("no source files specified"); if (rdp_sourcefilenames[1] != NULL) text_message(TEXT_FATAL, "multiple source files not allowed\n"); text_init(rdp_textsize, 25, 100, (int) rdp_tabwidth); scan_init(0, 0, 0, rdp_symbol_echo, rdp_tokens); if (rdp_lexicalise) scan_lexicalise(); mini = symbol_new_table("mini", 101, 31, symbol_compare_string, symbol_hash_string, symbol_print_string); rdp_set_initialise(); rdp_load_keywords(); if (rdp_verbose) text_printf("\nMinitree compiler V1.50 (c) Adrian Johnstone 1997\n" RDP_STAMP "\n\n"); for (rdp_pass = 1; rdp_pass <= RDP_PASSES; rdp_pass++) { rdp_tree_update = rdp_pass == RDP_PASSES; text_echo(rdp_line_echo_all || (rdp_line_echo && rdp_pass == RDP_PASSES)); for (rdp_sourcefilenumber = 0; (rdp_sourcefilename = rdp_sourcefilenames[rdp_sourcefilenumber]) != NULL; rdp_sourcefilenumber++) { if (text_open(rdp_sourcefilename) == NULL) arg_help("unable to open source file"); text_get_char(); scan_(); program(rdp_tree_root = rdp_add_node("program", rdp_tree)); /* call parser at top level */ if (text_total_errors() != 0) text_message(TEXT_FATAL, "error%s detected in source file ''\n", text_total_errors() == 1 ? "" : "s", rdp_sourcefilename); /* crash quietly */ graph_epsilon_prune_rdp_tree(rdp_tree_root, sizeof(rdp_tree_edge_data)); } } rdp_sourcefilename = rdp_sourcefilenames[0]; /* Reset filename to first file in the list */ graph_set_root(rdp_tree, rdp_tree_root); if (rdp_vcg_filename != NULL) { FILE *rdp_vcg_file; if (*rdp_vcg_filename == '\0') /* No filename supplied */ rdp_vcg_filename = "rdparser"; rdp_vcg_file = fopen((rdp_vcg_filename = text_default_filetype(rdp_vcg_filename, "vcg")), "w"); if (rdp_vcg_file == NULL) text_message(TEXT_FATAL, "unable to open VCG file '%s' for write\n", rdp_vcg_filename); if (rdp_verbose) text_message(TEXT_INFO, "Dumping derivation tree to VCG file '%s'\n", rdp_vcg_filename); text_redirect(rdp_vcg_file); graph_vcg(rdp_tree, NULL, scan_vcg_print_node, scan_vcg_print_edge); text_redirect(stdout); fclose(rdp_vcg_file); } code_generate(rdp_sourcefilename, rdp_outputfilename, rdp_tree); if (rdp_symbol_statistics) { symbol_print_all_table_statistics(11); symbol_print_all_table(); } text_print_total_errors(); if (rdp_verbose) { rdp_finish_time = clock(); text_message(TEXT_INFO, "%.3f CPU seconds used\n", ((double) (rdp_finish_time-rdp_start_time)) / CLOCKS_PER_SEC); } return rdp_error_return; }