diff options
| author | Andrei Aiordachioaie <a.aiordachioaie@jacobs-university.de> | 2009-05-25 10:18:29 +0200 |
|---|---|---|
| committer | Andrei Aiordachioaie <andrei@kahlua.eecs.jacobs-university.de> | 2009-07-07 10:48:19 +0200 |
| commit | 33d75ff4aab0f98db56874ec16ec9a4e440aab55 (patch) | |
| tree | 96ae422bc5d921ad41d53e4dfe200fe2ab47b8a5 /src/syntaxParser/java_cup/SAVE | |
| parent | 7ad3237708f4ce608376e998430191020fed019e (diff) | |
Removed old grammar source files
Diffstat (limited to 'src/syntaxParser/java_cup/SAVE')
32 files changed, 0 insertions, 10558 deletions
diff --git a/src/syntaxParser/java_cup/SAVE/Main.java b/src/syntaxParser/java_cup/SAVE/Main.java deleted file mode 100644 index 7c72b28..0000000 --- a/src/syntaxParser/java_cup/SAVE/Main.java +++ /dev/null @@ -1,872 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Enumeration; -import java.io.*; - -/** This class serves as the main driver for the JavaCup system. - * It accepts user options and coordinates overall control flow. - * The main flow of control includes the following activities: - * <ul> - * <li> Parse user supplied arguments and options. - * <li> Open output files. - * <li> Parse the specification from standard input. - * <li> Check for unused terminals, non-terminals, and productions. - * <li> Build the state machine, tables, etc. - * <li> Output the generated code. - * <li> Close output files. - * <li> Print a summary if requested. - * </ul> - * - * Options to the main program include: <dl> - * <dt> -package name - * <dd> specify package generated classes go in [default none] - * <dt> -parser name - * <dd> specify parser class name [default "parser"] - * <dt> -symbols name - * <dd> specify name for symbol constant class [default "sym"] - * <dt> -interface - * <dd> emit symbol constant <i>interface</i>, rather than class - * <dt> -nonterms - * <dd> put non terminals in symbol constant class - * <dt> -expect # - * <dd> number of conflicts expected/allowed [default 0] - * <dt> -compact_red - * <dd> compact tables by defaulting to most frequent reduce - * <dt> -nowarn - * <dd> don't warn about useless productions, etc. - * <dt> -nosummary - * <dd> don't print the usual summary of parse states, etc. - * <dt> -progress - * <dd> print messages to indicate progress of the system - * <dt> -time - * <dd> print time usage summary - * <dt> -dump_grammar - * <dd> produce a dump of the symbols and grammar - * <dt> -dump_states - * <dd> produce a dump of parse state machine - * <dt> -dump_tables - * <dd> produce a dump of the parse tables - * <dt> -dump - * <dd> produce a dump of all of the above - * <dt> -debug - * <dd> turn on debugging messages within JavaCup - * <dt> -nopositions - * <dd> don't generate the positions code - * <dt> -noscanner - * <dd> don't refer to java_cup.runtime.Scanner in the parser - * (for compatibility with old runtimes) - * <dt> -version - * <dd> print version information for JavaCUP and halt. - * </dl> - */ - -public class Main { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - /** Only constructor is private, so we do not allocate any instances of this - class. */ - private Main() { } - - /*-------------------------*/ - /* Options set by the user */ - /*-------------------------*/ - /** User option -- do we print progress messages. */ - protected static boolean print_progress = true; - /** User option -- do we produce a dump of the state machine */ - protected static boolean opt_dump_states = false; - /** User option -- do we produce a dump of the parse tables */ - protected static boolean opt_dump_tables = false; - /** User option -- do we produce a dump of the grammar */ - protected static boolean opt_dump_grammar = false; - /** User option -- do we show timing information as a part of the summary */ - protected static boolean opt_show_timing = false; - /** User option -- do we run produce extra debugging messages */ - protected static boolean opt_do_debug = false; - /** User option -- do we compact tables by making most common reduce the - default action */ - protected static boolean opt_compact_red = false; - /** User option -- should we include non terminal symbol numbers in the - symbol constant class. */ - protected static boolean include_non_terms = false; - /** User option -- do not print a summary. */ - protected static boolean no_summary = false; - /** User option -- number of conflicts to expect */ - protected static int expect_conflicts = 0; - - /* frankf added this 6/18/96 */ - /** User option -- should generator generate code for left/right values? */ - protected static boolean lr_values = true; - - /** User option -- should symbols be put in a class or an interface? [CSA]*/ - protected static boolean sym_interface = false; - - /** User option -- should generator suppress references to - * java_cup.runtime.Scanner for compatibility with old runtimes? */ - protected static boolean suppress_scanner = false; - - /*----------------------------------------------------------------------*/ - /* Timing data (not all of these time intervals are mutually exclusive) */ - /*----------------------------------------------------------------------*/ - /** Timing data -- when did we start */ - protected static long start_time = 0; - /** Timing data -- when did we end preliminaries */ - protected static long prelim_end = 0; - /** Timing data -- when did we end parsing */ - protected static long parse_end = 0; - /** Timing data -- when did we end checking */ - protected static long check_end = 0; - /** Timing data -- when did we end dumping */ - protected static long dump_end = 0; - /** Timing data -- when did we end state and table building */ - protected static long build_end = 0; - /** Timing data -- when did we end nullability calculation */ - protected static long nullability_end = 0; - /** Timing data -- when did we end first set calculation */ - protected static long first_end = 0; - /** Timing data -- when did we end state machine construction */ - protected static long machine_end = 0; - /** Timing data -- when did we end table construction */ - protected static long table_end = 0; - /** Timing data -- when did we end checking for non-reduced productions */ - protected static long reduce_check_end = 0; - /** Timing data -- when did we finish emitting code */ - protected static long emit_end = 0; - /** Timing data -- when were we completely done */ - protected static long final_time = 0; - - /* Additional timing information is also collected in emit */ - - /*-----------------------------------------------------------*/ - /*--- Main Program ------------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** The main driver for the system. - * @param argv an array of strings containing command line arguments. - */ - public static void main(String argv[]) - throws internal_error, java.io.IOException, java.lang.Exception - { - boolean did_output = false; - - start_time = System.currentTimeMillis(); - - /* process user options and arguments */ - parse_args(argv); - - /* frankf 6/18/96 - hackish, yes, but works */ - emit.set_lr_values(lr_values); - /* open output files */ - if (print_progress) System.err.println("Opening files..."); - /* use a buffered version of standard input */ - input_file = new BufferedInputStream(System.in); - - prelim_end = System.currentTimeMillis(); - - /* parse spec into internal data structures */ - if (print_progress) - System.err.println("Parsing specification from standard input..."); - parse_grammar_spec(); - - parse_end = System.currentTimeMillis(); - - /* don't proceed unless we are error free */ - if (lexer.error_count == 0) - { - /* check for unused bits */ - if (print_progress) System.err.println("Checking specification..."); - check_unused(); - - check_end = System.currentTimeMillis(); - - /* build the state machine and parse tables */ - if (print_progress) System.err.println("Building parse tables..."); - build_parser(); - - build_end = System.currentTimeMillis(); - - /* output the generated code, if # of conflicts permits */ - if (lexer.error_count != 0) { - // conflicts! don't emit code, don't dump tables. - opt_dump_tables = false; - } else { // everything's okay, emit parser. - if (print_progress) System.err.println("Writing parser..."); - open_files(); - emit_parser(); - did_output = true; - } - } - /* fix up the times to make the summary easier */ - emit_end = System.currentTimeMillis(); - - /* do requested dumps */ - if (opt_dump_grammar) dump_grammar(); - if (opt_dump_states) dump_machine(); - if (opt_dump_tables) dump_tables(); - - dump_end = System.currentTimeMillis(); - - /* close input/output files */ - if (print_progress) System.err.println("Closing files..."); - close_files(); - - /* produce a summary if desired */ - if (!no_summary) emit_summary(did_output); - - /* If there were errors during the run, - * exit with non-zero status (makefile-friendliness). --CSA */ - if (lexer.error_count != 0) - System.exit(100); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Print a "usage message" that described possible command line options, - * then exit. - * @param message a specific error message to preface the usage message by. - */ - protected static void usage(String message) - { - System.err.println(); - System.err.println(message); - System.err.println(); - System.err.println( -"Usage: " + version.program_name + " [options] [filename]\n" + -" and expects a specification file on standard input if no filename is given.\n" + -" Legal options include:\n" + -" -package name specify package generated classes go in [default none]\n" + -" -parser name specify parser class name [default \"parser\"]\n" + -" -symbols name specify name for symbol constant class [default \"sym\"]\n"+ -" -interface put symbols in an interface, rather than a class\n" + -" -nonterms put non terminals in symbol constant class\n" + -" -expect # number of conflicts expected/allowed [default 0]\n" + -" -compact_red compact tables by defaulting to most frequent reduce\n" + -" -nowarn don't warn about useless productions, etc.\n" + -" -nosummary don't print the usual summary of parse states, etc.\n" + -" -nopositions don't propagate the left and right token position values\n" + -" -noscanner don't refer to java_cup.runtime.Scanner\n" + -" -progress print messages to indicate progress of the system\n" + -" -time print time usage summary\n" + -" -dump_grammar produce a human readable dump of the symbols and grammar\n"+ -" -dump_states produce a dump of parse state machine\n"+ -" -dump_tables produce a dump of the parse tables\n"+ -" -dump produce a dump of all of the above\n"+ -" -version print the version information for CUP and exit\n" - ); - System.exit(1); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Parse command line options and arguments to set various user-option - * flags and variables. - * @param argv the command line arguments to be parsed. - */ - protected static void parse_args(String argv[]) - { - int len = argv.length; - int i; - - /* parse the options */ - for (i=0; i<len; i++) - { - /* try to get the various options */ - if (argv[i].equals("-package")) - { - /* must have an arg */ - if (++i >= len || argv[i].startsWith("-") || - argv[i].endsWith(".cup")) - usage("-package must have a name argument"); - - /* record the name */ - emit.package_name = argv[i]; - } - else if (argv[i].equals("-parser")) - { - /* must have an arg */ - if (++i >= len || argv[i].startsWith("-") || - argv[i].endsWith(".cup")) - usage("-parser must have a name argument"); - - /* record the name */ - emit.parser_class_name = argv[i]; - } - else if (argv[i].equals("-symbols")) - { - /* must have an arg */ - if (++i >= len || argv[i].startsWith("-") || - argv[i].endsWith(".cup")) - usage("-symbols must have a name argument"); - - /* record the name */ - emit.symbol_const_class_name = argv[i]; - } - else if (argv[i].equals("-nonterms")) - { - include_non_terms = true; - } - else if (argv[i].equals("-expect")) - { - /* must have an arg */ - if (++i >= len || argv[i].startsWith("-") || - argv[i].endsWith(".cup")) - usage("-expect must have a name argument"); - - /* record the number */ - try { - expect_conflicts = Integer.parseInt(argv[i]); - } catch (NumberFormatException e) { - usage("-expect must be followed by a decimal integer"); - } - } - else if (argv[i].equals("-compact_red")) opt_compact_red = true; - else if (argv[i].equals("-nosummary")) no_summary = true; - else if (argv[i].equals("-nowarn")) emit.nowarn = true; - else if (argv[i].equals("-dump_states")) opt_dump_states = true; - else if (argv[i].equals("-dump_tables")) opt_dump_tables = true; - else if (argv[i].equals("-progress")) print_progress = true; - else if (argv[i].equals("-dump_grammar")) opt_dump_grammar = true; - else if (argv[i].equals("-dump")) - opt_dump_states = opt_dump_tables = opt_dump_grammar = true; - else if (argv[i].equals("-time")) opt_show_timing = true; - else if (argv[i].equals("-debug")) opt_do_debug = true; - /* frankf 6/18/96 */ - else if (argv[i].equals("-nopositions")) lr_values = false; - /* CSA 12/21/97 */ - else if (argv[i].equals("-interface")) sym_interface = true; - /* CSA 23-Jul-1999 */ - else if (argv[i].equals("-noscanner")) suppress_scanner = true; - /* CSA 23-Jul-1999 */ - else if (argv[i].equals("-version")) { - System.out.println(version.title_str); - System.exit(1); - } - /* CSA 24-Jul-1999; suggestion by Jean Vaucher */ - else if (!argv[i].startsWith("-") && i==len-1) { - /* use input from file. */ - try { - System.setIn(new FileInputStream(argv[i])); - } catch (java.io.FileNotFoundException e) { - usage("Unable to open \"" + argv[i] +"\" for input"); - } - } - else - { - usage("Unrecognized option \"" + argv[i] + "\""); - } - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /*-------*/ - /* Files */ - /*-------*/ - - /** Input file. This is a buffered version of System.in. */ - protected static BufferedInputStream input_file; - - /** Output file for the parser class. */ - protected static PrintWriter parser_class_file; - - /** Output file for the symbol constant class. */ - protected static PrintWriter symbol_class_file; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Open various files used by the system. */ - protected static void open_files() - { - File fil; - String out_name; - - /* open each of the output files */ - - /* parser class */ - out_name = emit.parser_class_name + ".java"; - fil = new File(out_name); - try { - parser_class_file = new PrintWriter( - new BufferedOutputStream(new FileOutputStream(fil), 4096)); - } catch(Exception e) { - System.err.println("Can't open \"" + out_name + "\" for output"); - System.exit(3); - } - - /* symbol constants class */ - out_name = emit.symbol_const_class_name + ".java"; - fil = new File(out_name); - try { - symbol_class_file = new PrintWriter( - new BufferedOutputStream(new FileOutputStream(fil), 4096)); - } catch(Exception e) { - System.err.println("Can't open \"" + out_name + "\" for output"); - System.exit(4); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Close various files used by the system. */ - protected static void close_files() throws java.io.IOException - { - if (input_file != null) input_file.close(); - if (parser_class_file != null) parser_class_file.close(); - if (symbol_class_file != null) symbol_class_file.close(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Parse the grammar specification from standard input. This produces - * sets of terminal, non-terminals, and productions which can be accessed - * via static variables of the respective classes, as well as the setting - * of various variables (mostly in the emit class) for small user supplied - * items such as the code to scan with. - */ - protected static void parse_grammar_spec() throws java.lang.Exception - { - parser parser_obj; - - /* create a parser and parse with it */ - parser_obj = new parser(); - try { - if (opt_do_debug) - parser_obj.debug_parse(); - else - parser_obj.parse(); - } catch (Exception e) - { - /* something threw an exception. catch it and emit a message so we - have a line number to work with, then re-throw it */ - lexer.emit_error("Internal error: Unexpected exception"); - throw e; - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Check for unused symbols. Unreduced productions get checked when - * tables are created. - */ - protected static void check_unused() - { - terminal term; - non_terminal nt; - - /* check for unused terminals */ - for (Enumeration t = terminal.all(); t.hasMoreElements(); ) - { - term = (terminal)t.nextElement(); - - /* don't issue a message for EOF */ - if (term == terminal.EOF) continue; - - /* or error */ - if (term == terminal.error) continue; - - /* is this one unused */ - if (term.use_count() == 0) - { - /* count it and warn if we are doing warnings */ - emit.unused_term++; - if (!emit.nowarn) - { - System.err.println("Warning: Terminal \"" + term.name() + - "\" was declared but never used"); - lexer.warning_count++; - } - } - } - - /* check for unused non terminals */ - for (Enumeration n = non_terminal.all(); n.hasMoreElements(); ) - { - nt = (non_terminal)n.nextElement(); - - /* is this one unused */ - if (nt.use_count() == 0) - { - /* count and warn if we are doing warnings */ - emit.unused_term++; - if (!emit.nowarn) - { - System.err.println("Warning: Non terminal \"" + nt.name() + - "\" was declared but never used"); - lexer.warning_count++; - } - } - } - - } - - /* . . . . . . . . . . . . . . . . . . . . . . . . .*/ - /* . . Internal Results of Generating the Parser . .*/ - /* . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Start state in the overall state machine. */ - protected static lalr_state start_state; - - /** Resulting parse action table. */ - protected static parse_action_table action_table; - - /** Resulting reduce-goto table. */ - protected static parse_reduce_table reduce_table; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Build the (internal) parser from the previously parsed specification. - * This includes:<ul> - * <li> Computing nullability of non-terminals. - * <li> Computing first sets of non-terminals and productions. - * <li> Building the viable prefix recognizer machine. - * <li> Filling in the (internal) parse tables. - * <li> Checking for unreduced productions. - * </ul> - */ - protected static void build_parser() throws internal_error - { - /* compute nullability of all non terminals */ - if (opt_do_debug || print_progress) - System.err.println(" Computing non-terminal nullability..."); - non_terminal.compute_nullability(); - - nullability_end = System.currentTimeMillis(); - - /* compute first sets of all non terminals */ - if (opt_do_debug || print_progress) - System.err.println(" Computing first sets..."); - non_terminal.compute_first_sets(); - - first_end = System.currentTimeMillis(); - - /* build the LR viable prefix recognition machine */ - if (opt_do_debug || print_progress) - System.err.println(" Building state machine..."); - start_state = lalr_state.build_machine(emit.start_production); - - machine_end = System.currentTimeMillis(); - - /* build the LR parser action and reduce-goto tables */ - if (opt_do_debug || print_progress) - System.err.println(" Filling in tables..."); - action_table = new parse_action_table(); - reduce_table = new parse_reduce_table(); - for (Enumeration st = lalr_state.all(); st.hasMoreElements(); ) - { - lalr_state lst = (lalr_state)st.nextElement(); - lst.build_table_entries( - action_table, reduce_table); - } - - table_end = System.currentTimeMillis(); - - /* check and warn for non-reduced productions */ - if (opt_do_debug || print_progress) - System.err.println(" Checking for non-reduced productions..."); - action_table.check_reductions(); - - reduce_check_end = System.currentTimeMillis(); - - /* if we have more conflicts than we expected issue a message and die */ - if (emit.num_conflicts > expect_conflicts) - { - System.err.println("*** More conflicts encountered than expected " + - "-- parser generation aborted"); - lexer.error_count++; // indicate the problem. - // we'll die on return, after clean up. - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Call the emit routines necessary to write out the generated parser. */ - protected static void emit_parser() throws internal_error - { - emit.symbols(symbol_class_file, include_non_terms, sym_interface); - emit.parser(parser_class_file, action_table, reduce_table, - start_state.index(), emit.start_production, opt_compact_red, - suppress_scanner); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Helper routine to optionally return a plural or non-plural ending. - * @param val the numerical value determining plurality. - */ - protected static String plural(int val) - { - if (val == 1) - return ""; - else - return "s"; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit a long summary message to standard error (System.err) which - * summarizes what was found in the specification, how many states were - * produced, how many conflicts were found, etc. A detailed timing - * summary is also produced if it was requested by the user. - * @param output_produced did the system get far enough to generate code. - */ - protected static void emit_summary(boolean output_produced) - { - final_time = System.currentTimeMillis(); - - if (no_summary) return; - - System.err.println("------- " + version.title_str + - " Parser Generation Summary -------"); - - /* error and warning count */ - System.err.println(" " + lexer.error_count + " error" + - plural(lexer.error_count) + " and " + lexer.warning_count + - " warning" + plural(lexer.warning_count)); - - /* basic stats */ - System.err.print(" " + terminal.number() + " terminal" + - plural(terminal.number()) + ", "); - System.err.print(non_terminal.number() + " non-terminal" + - plural(non_terminal.number()) + ", and "); - System.err.println(production.number() + " production" + - plural(production.number()) + " declared, "); - System.err.println(" producing " + lalr_state.number() + - " unique parse states."); - - /* unused symbols */ - System.err.println(" " + emit.unused_term + " terminal" + - plural(emit.unused_term) + " declared but not used."); - System.err.println(" " + emit.unused_non_term + " non-terminal" + - plural(emit.unused_term) + " declared but not used."); - - /* productions that didn't reduce */ - System.err.println(" " + emit.not_reduced + " production" + - plural(emit.not_reduced) + " never reduced."); - - /* conflicts */ - System.err.println(" " + emit.num_conflicts + " conflict" + - plural(emit.num_conflicts) + " detected" + - " (" + expect_conflicts + " expected)."); - - /* code location */ - if (output_produced) - System.err.println(" Code written to \"" + emit.parser_class_name + - ".java\", and \"" + emit.symbol_const_class_name + ".java\"."); - else - System.err.println(" No code produced."); - - if (opt_show_timing) show_times(); - - System.err.println( - "---------------------------------------------------- (" + - version.version_str + ")"); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce the optional timing summary as part of an overall summary. */ - protected static void show_times() - { - long total_time = final_time - start_time; - - System.err.println(". . . . . . . . . . . . . . . . . . . . . . . . . "); - System.err.println(" Timing Summary"); - System.err.println(" Total time " - + timestr(final_time-start_time, total_time)); - System.err.println(" Startup " - + timestr(prelim_end-start_time, total_time)); - System.err.println(" Parse " - + timestr(parse_end-prelim_end, total_time) ); - if (check_end != 0) - System.err.println(" Checking " - + timestr(check_end-parse_end, total_time)); - if (check_end != 0 && build_end != 0) - System.err.println(" Parser Build " - + timestr(build_end-check_end, total_time)); - if (nullability_end != 0 && check_end != 0) - System.err.println(" Nullability " - + timestr(nullability_end-check_end, total_time)); - if (first_end != 0 && nullability_end != 0) - System.err.println(" First sets " - + timestr(first_end-nullability_end, total_time)); - if (machine_end != 0 && first_end != 0) - System.err.println(" State build " - + timestr(machine_end-first_end, total_time)); - if (table_end != 0 && machine_end != 0) - System.err.println(" Table build " - + timestr(table_end-machine_end, total_time)); - if (reduce_check_end != 0 && table_end != 0) - System.err.println(" Checking " - + timestr(reduce_check_end-table_end, total_time)); - if (emit_end != 0 && build_end != 0) - System.err.println(" Code Output " - + timestr(emit_end-build_end, total_time)); - if (emit.symbols_time != 0) - System.err.println(" Symbols " - + timestr(emit.symbols_time, total_time)); - if (emit.parser_time != 0) - System.err.println(" Parser class " - + timestr(emit.parser_time, total_time)); - if (emit.action_code_time != 0) - System.err.println(" Actions " - + timestr(emit.action_code_time, total_time)); - if (emit.production_table_time != 0) - System.err.println(" Prod table " - + timestr(emit.production_table_time, total_time)); - if (emit.action_table_time != 0) - System.err.println(" Action tab " - + timestr(emit.action_table_time, total_time)); - if (emit.goto_table_time != 0) - System.err.println(" Reduce tab " - + timestr(emit.goto_table_time, total_time)); - - System.err.println(" Dump Output " - + timestr(dump_end-emit_end, total_time)); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Helper routine to format a decimal based display of seconds and - * percentage of total time given counts of milliseconds. Note: this - * is broken for use with some instances of negative time (since we don't - * use any negative time here, we let if be for now). - * @param time_val the value being formatted (in ms). - * @param total_time total time percentages are calculated against (in ms). - */ - protected static String timestr(long time_val, long total_time) - { - boolean neg; - long ms = 0; - long sec = 0; - long percent10; - String pad; - - /* work with positives only */ - neg = time_val < 0; - if (neg) time_val = -time_val; - - /* pull out seconds and ms */ - ms = time_val % 1000; - sec = time_val / 1000; - - /* construct a pad to blank fill seconds out to 4 places */ - if (sec < 10) - pad = " "; - else if (sec < 100) - pad = " "; - else if (sec < 1000) - pad = " "; - else - pad = ""; - - /* calculate 10 times the percentage of total */ - percent10 = (time_val*1000)/total_time; - - /* build and return the output string */ - return (neg ? "-" : "") + pad + sec + "." + - ((ms%1000)/100) + ((ms%100)/10) + (ms%10) + "sec" + - " (" + percent10/10 + "." + percent10%10 + "%)"; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a human readable dump of the grammar. */ - public static void dump_grammar() throws internal_error - { - System.err.println("===== Terminals ====="); - for (int tidx=0, cnt=0; tidx < terminal.number(); tidx++, cnt++) - { - System.err.print("["+tidx+"]"+terminal.find(tidx).name()+" "); - if ((cnt+1) % 5 == 0) System.err.println(); - } - System.err.println(); - System.err.println(); - - System.err.println("===== Non terminals ====="); - for (int nidx=0, cnt=0; nidx < non_terminal.number(); nidx++, cnt++) - { - System.err.print("["+nidx+"]"+non_terminal.find(nidx).name()+" "); - if ((cnt+1) % 5 == 0) System.err.println(); - } - System.err.println(); - System.err.println(); - - - System.err.println("===== Productions ====="); - for (int pidx=0; pidx < production.number(); pidx++) - { - production prod = production.find(pidx); - System.err.print("["+pidx+"] "+prod.lhs().the_symbol().name() + " ::= "); - for (int i=0; i<prod.rhs_length(); i++) - if (prod.rhs(i).is_action()) - System.err.print("{action} "); - else - System.err.print( - ((symbol_part)prod.rhs(i)).the_symbol().name() + " "); - System.err.println(); - } - System.err.println(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a (semi-) human readable dump of the complete viable prefix - * recognition state machine. - */ - public static void dump_machine() - { - lalr_state ordered[] = new lalr_state[lalr_state.number()]; - - /* put the states in sorted order for a nicer display */ - for (Enumeration s = lalr_state.all(); s.hasMoreElements(); ) - { - lalr_state st = (lalr_state)s.nextElement(); - ordered[st.index()] = st; - } - - System.err.println("===== Viable Prefix Recognizer ====="); - for (int i = 0; i<lalr_state.number(); i++) - { - if (ordered[i] == start_state) System.err.print("START "); - System.err.println(ordered[i]); - System.err.println("-------------------"); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a (semi-) human readable dumps of the parse tables */ - public static void dump_tables() - { - System.err.println(action_table); - System.err.println(reduce_table); - } - - /*-----------------------------------------------------------*/ - -} - diff --git a/src/syntaxParser/java_cup/SAVE/action_part.java b/src/syntaxParser/java_cup/SAVE/action_part.java deleted file mode 100644 index 5346669..0000000 --- a/src/syntaxParser/java_cup/SAVE/action_part.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** - * This class represents a part of a production which contains an - * action. These are eventually eliminated from productions and converted - * to trailing actions by factoring out with a production that derives the - * empty string (and ends with this action). - * - * @see java_cup.production - */ - -public class action_part extends production_part { - - /*-----------------------------------------------------------*/ - /*--- Constructors ------------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. - * @param code_str string containing the actual user code. - */ - public action_part(String code_str) - { - super(/* never have a label on code */null); - _code_string = code_str; - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** String containing code for the action in question. */ - protected String _code_string; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** String containing code for the action in question. */ - public String code_string() {return _code_string;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Set the code string. */ - public void set_code_string(String new_str) {_code_string = new_str;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Override to report this object as an action. */ - public boolean is_action() { return true; } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison for properly typed object. */ - public boolean equals(action_part other) - { - /* compare the strings */ - return other != null && super.equals(other) && - other.code_string().equals(code_string()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof action_part)) - return false; - else - return equals((action_part)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a hash code. */ - public int hashCode() - { - return super.hashCode() ^ - (code_string()==null ? 0 : code_string().hashCode()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - return super.toString() + "{" + code_string() + "}"; - } - - /*-----------------------------------------------------------*/ -} diff --git a/src/syntaxParser/java_cup/SAVE/action_production.java b/src/syntaxParser/java_cup/SAVE/action_production.java deleted file mode 100644 index 5ce2297..0000000 --- a/src/syntaxParser/java_cup/SAVE/action_production.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** A specialized version of a production used when we split an existing - * production in order to remove an embedded action. Here we keep a bit - * of extra bookkeeping so that we know where we came from. - */ - -public class action_production extends production { - - /** Constructor. - * @param base the production we are being factored out of. - * @param lhs_sym the LHS symbol for this production. - * @param rhs_parts array of production parts for the RHS. - * @param rhs_len how much of the rhs_parts array is valid. - * @param action_str the trailing reduce action for this production. - */ - public action_production( - production base, - non_terminal lhs_sym, - production_part rhs_parts[], - int rhs_len, - String action_str) - throws internal_error - { - super(lhs_sym, rhs_parts, rhs_len, action_str); - _base_production = base; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The production we were taken out of. */ - protected production _base_production; - - /** The production we were taken out of. */ - public production base_production() {return _base_production;} -} diff --git a/src/syntaxParser/java_cup/SAVE/assoc.java b/src/syntaxParser/java_cup/SAVE/assoc.java deleted file mode 100644 index 4565a2e..0000000 --- a/src/syntaxParser/java_cup/SAVE/assoc.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -// Defines integers that represent the associativity of terminals - -public class assoc { - - /* various associativities, no_prec being the default value */ - public final static int left = 0; - public final static int right = 1; - public final static int nonassoc = 2; - public final static int no_prec = -1; - -} diff --git a/src/syntaxParser/java_cup/SAVE/emit.java b/src/syntaxParser/java_cup/SAVE/emit.java deleted file mode 100644 index a79d83d..0000000 --- a/src/syntaxParser/java_cup/SAVE/emit.java +++ /dev/null @@ -1,917 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.io.PrintWriter; -import java.util.Stack; -import java.util.Enumeration; -import java.util.Date; - -/** - * This class handles emitting generated code for the resulting parser. - * The various parse tables must be constructed, etc. before calling any - * routines in this class.<p> - * - * Three classes are produced by this code: - * <dl> - * <dt> symbol constant class - * <dd> this contains constant declarations for each terminal (and - * optionally each non-terminal). - * <dt> action class - * <dd> this non-public class contains code to invoke all the user actions - * that were embedded in the parser specification. - * <dt> parser class - * <dd> the specialized parser class consisting primarily of some user - * supplied general and initialization code, and the parse tables. - * </dl><p> - * - * Three parse tables are created as part of the parser class: - * <dl> - * <dt> production table - * <dd> lists the LHS non terminal number, and the length of the RHS of - * each production. - * <dt> action table - * <dd> for each state of the parse machine, gives the action to be taken - * (shift, reduce, or error) under each lookahead symbol.<br> - * <dt> reduce-goto table - * <dd> when a reduce on a given production is taken, the parse stack is - * popped back a number of elements corresponding to the RHS of the - * production. This reveals a prior state, which we transition out - * of under the LHS non terminal symbol for the production (as if we - * had seen the LHS symbol rather than all the symbols matching the - * RHS). This table is indexed by non terminal numbers and indicates - * how to make these transitions. - * </dl><p> - * - * In addition to the method interface, this class maintains a series of - * public global variables and flags indicating how misc. parts of the code - * and other output is to be produced, and counting things such as number of - * conflicts detected (see the source code and public variables below for - * more details).<p> - * - * This class is "static" (contains only static data and methods).<p> - * - * @see java_cup.main - */ - -/* Major externally callable routines here include: - symbols - emit the symbol constant class - parser - emit the parser class - - In addition the following major internal routines are provided: - emit_package - emit a package declaration - emit_action_code - emit the class containing the user's actions - emit_production_table - emit declaration and init for the production table - do_action_table - emit declaration and init for the action table - do_reduce_table - emit declaration and init for the reduce-goto table - - Finally, this class uses a number of public instance variables to communicate - optional parameters and flags used to control how code is generated, - as well as to report counts of various things (such as number of conflicts - detected). These include: - - prefix - a prefix string used to prefix names that would - otherwise "pollute" someone else's name space. - package_name - name of the package emitted code is placed in - (or null for an unnamed package. - symbol_const_class_name - name of the class containing symbol constants. - parser_class_name - name of the class for the resulting parser. - action_code - user supplied declarations and other code to be - placed in action class. - parser_code - user supplied declarations and other code to be - placed in parser class. - init_code - user supplied code to be executed as the parser - is being initialized. - scan_code - user supplied code to get the next Symbol. - start_production - the start production for the grammar. - import_list - list of imports for use with action class. - num_conflicts - number of conflicts detected. - nowarn - true if we are not to issue warning messages. - not_reduced - count of number of productions that never reduce. - unused_term - count of unused terminal symbols. - unused_non_term - count of unused non terminal symbols. - *_time - a series of symbols indicating how long various - sub-parts of code generation took (used to produce - optional time reports in main). -*/ - -public class emit { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Only constructor is private so no instances can be created. */ - private emit() { } - - /*-----------------------------------------------------------*/ - /*--- Static (Class) Variables ------------------------------*/ - /*-----------------------------------------------------------*/ - - /** The prefix placed on names that pollute someone else's name space. */ - public static String prefix = "CUP$"; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Package that the resulting code goes into (null is used for unnamed). */ - public static String package_name = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Name of the generated class for symbol constants. */ - public static String symbol_const_class_name = "sym"; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Name of the generated parser class. */ - public static String parser_class_name = "parser"; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** User declarations for direct inclusion in user action class. */ - public static String action_code = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** User declarations for direct inclusion in parser class. */ - public static String parser_code = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** User code for user_init() which is called during parser initialization. */ - public static String init_code = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** User code for scan() which is called to get the next Symbol. */ - public static String scan_code = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The start production of the grammar. */ - public static production start_production = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** List of imports (Strings containing class names) to go with actions. */ - public static Stack import_list = new Stack(); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Number of conflict found while building tables. */ - public static int num_conflicts = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Do we skip warnings? */ - public static boolean nowarn = false; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of the number on non-reduced productions found. */ - public static int not_reduced = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of unused terminals. */ - public static int unused_term = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of unused non terminals. */ - public static int unused_non_term = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /* Timing values used to produce timing report in main.*/ - - /** Time to produce symbol constant class. */ - public static long symbols_time = 0; - - /** Time to produce parser class. */ - public static long parser_time = 0; - - /** Time to produce action code class. */ - public static long action_code_time = 0; - - /** Time to produce the production table. */ - public static long production_table_time = 0; - - /** Time to produce the action table. */ - public static long action_table_time = 0; - - /** Time to produce the reduce-goto table. */ - public static long goto_table_time = 0; - - /* frankf 6/18/96 */ - protected static boolean _lr_values; - - /** whether or not to emit code for left and right values */ - public static boolean lr_values() {return _lr_values;} - protected static void set_lr_values(boolean b) { _lr_values = b;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Build a string with the standard prefix. - * @param str string to prefix. - */ - protected static String pre(String str) { - return prefix + parser_class_name + "$" + str; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit a package spec if the user wants one. - * @param out stream to produce output on. - */ - protected static void emit_package(PrintWriter out) - { - /* generate a package spec if we have a name for one */ - if (package_name != null) { - out.println("package " + package_name + ";"); out.println(); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit code for the symbol constant class, optionally including non terms, - * if they have been requested. - * @param out stream to produce output on. - * @param emit_non_terms do we emit constants for non terminals? - * @param sym_interface should we emit an interface, rather than a class? - */ - public static void symbols(PrintWriter out, - boolean emit_non_terms, boolean sym_interface) - { - terminal term; - non_terminal nt; - String class_or_interface = (sym_interface)?"interface":"class"; - - long start_time = System.currentTimeMillis(); - - /* top of file */ - out.println(); - out.println("//----------------------------------------------------"); - out.println("// The following code was generated by " + - version.title_str); - out.println("// " + new Date()); - out.println("//----------------------------------------------------"); - out.println(); - emit_package(out); - - /* class header */ - out.println("/** CUP generated " + class_or_interface + - " containing symbol constants. */"); - out.println("public " + class_or_interface + " " + - symbol_const_class_name + " {"); - - out.println(" /* terminals */"); - - /* walk over the terminals */ /* later might sort these */ - for (Enumeration e = terminal.all(); e.hasMoreElements(); ) - { - term = (terminal)e.nextElement(); - - /* output a constant decl for the terminal */ - out.println(" public static final int " + term.name() + " = " + - term.index() + ";"); - } - - /* do the non terminals if they want them (parser doesn't need them) */ - if (emit_non_terms) - { - out.println(); - out.println(" /* non terminals */"); - - /* walk over the non terminals */ /* later might sort these */ - for (Enumeration e = non_terminal.all(); e.hasMoreElements(); ) - { - nt = (non_terminal)e.nextElement(); - - /* output a constant decl for the terminal */ - out.println(" static final int " + nt.name() + " = " + - nt.index() + ";"); - } - } - - /* end of class */ - out.println("}"); - out.println(); - - symbols_time = System.currentTimeMillis() - start_time; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit code for the non-public class holding the actual action code. - * @param out stream to produce output on. - * @param start_prod the start production of the grammar. - */ - protected static void emit_action_code(PrintWriter out, production start_prod) - throws internal_error - { - production prod; - - long start_time = System.currentTimeMillis(); - - /* class header */ - out.println(); - out.println( - "/** Cup generated class to encapsulate user supplied action code.*/" - ); - out.println("class " + pre("actions") + " {"); - - /* user supplied code */ - if (action_code != null) - { - out.println(); - out.println(action_code); - } - - /* field for parser object */ - out.println(" private final "+parser_class_name+" parser;"); - - /* constructor */ - out.println(); - out.println(" /** Constructor */"); - out.println(" " + pre("actions") + "("+parser_class_name+" parser) {"); - out.println(" this.parser = parser;"); - out.println(" }"); - - /* action method head */ - out.println(); - out.println(" /** Method with the actual generated action code. */"); - out.println(" public final java_cup.runtime.Symbol " + - pre("do_action") + "("); - out.println(" int " + pre("act_num,")); - out.println(" java_cup.runtime.lr_parser " + pre("parser,")); - out.println(" java.util.Stack " + pre("stack,")); - out.println(" int " + pre("top)")); - out.println(" throws java.lang.Exception"); - out.println(" {"); - - /* declaration of result symbol */ - /* New declaration!! now return Symbol - 6/13/96 frankf */ - out.println(" /* Symbol object for return from actions */"); - out.println(" java_cup.runtime.Symbol " + pre("result") + ";"); - out.println(); - - /* switch top */ - out.println(" /* select the action based on the action number */"); - out.println(" switch (" + pre("act_num") + ")"); - out.println(" {"); - - /* emit action code for each production as a separate case */ - for (Enumeration p = production.all(); p.hasMoreElements(); ) - { - prod = (production)p.nextElement(); - - /* case label */ - out.println(" /*. . . . . . . . . . . . . . . . . . . .*/"); - out.println(" case " + prod.index() + ": // " + - prod.to_simple_string()); - - /* give them their own block to work in */ - out.println(" {"); - - /* create the result symbol */ - /*make the variable RESULT which will point to the new Symbol (see below) - and be changed by action code - 6/13/96 frankf */ - out.println(" " + prod.lhs().the_symbol().stack_type() + - " RESULT = null;"); - - /* Add code to propagate RESULT assignments that occur in - * action code embedded in a production (ie, non-rightmost - * action code). 24-Mar-1998 CSA - */ - for (int i=0; i<prod.rhs_length(); i++) { - // only interested in non-terminal symbols. - if (!(prod.rhs(i) instanceof symbol_part)) continue; - symbol s = ((symbol_part)prod.rhs(i)).the_symbol(); - if (!(s instanceof non_terminal)) continue; - // skip this non-terminal unless it corresponds to - // an embedded action production. - if (((non_terminal)s).is_embedded_action == false) continue; - // OK, it fits. Make a conditional assignment to RESULT. - int index = prod.rhs_length() - i - 1; // last rhs is on top. - out.println(" " + "// propagate RESULT from " + - s.name()); - out.println(" " + "if ( " + - "((java_cup.runtime.Symbol) " + emit.pre("stack") + ".elementAt(" - + emit.pre("top") + "-" + index + ")).value != null )"); - out.println(" " + "RESULT = " + - "(" + prod.lhs().the_symbol().stack_type() + ") " + - "((java_cup.runtime.Symbol) " + emit.pre("stack") + ".elementAt(" - + emit.pre("top") + "-" + index + ")).value;"); - } - - /* if there is an action string, emit it */ - if (prod.action() != null && prod.action().code_string() != null && - !prod.action().equals("")) - out.println(prod.action().code_string()); - - /* here we have the left and right values being propagated. - must make this a command line option. - frankf 6/18/96 */ - - /* Create the code that assigns the left and right values of - the new Symbol that the production is reducing to */ - if (emit.lr_values()) { - int loffset; - String leftstring, rightstring; - int roffset = 0; - rightstring = "((java_cup.runtime.Symbol)" + emit.pre("stack") + ".elementAt(" + - emit.pre("top") + "-" + roffset + ")).right"; - if (prod.rhs_length() == 0) - leftstring = rightstring; - else { - loffset = prod.rhs_length() - 1; - leftstring = "((java_cup.runtime.Symbol)" + emit.pre("stack") + ".elementAt(" + - emit.pre("top") + "-" + loffset + ")).left"; - } - out.println(" " + pre("result") + " = new java_cup.runtime.Symbol(" + - prod.lhs().the_symbol().index() + "/*" + - prod.lhs().the_symbol().name() + "*/" + - ", " + leftstring + ", " + rightstring + ", RESULT);"); - } else { - out.println(" " + pre("result") + " = new java_cup.runtime.Symbol(" + - prod.lhs().the_symbol().index() + "/*" + - prod.lhs().the_symbol().name() + "*/" + - ", RESULT);"); - } - - /* end of their block */ - out.println(" }"); - - /* if this was the start production, do action for accept */ - if (prod == start_prod) - { - out.println(" /* ACCEPT */"); - out.println(" " + pre("parser") + ".done_parsing();"); - } - - /* code to return lhs symbol */ - out.println(" return " + pre("result") + ";"); - out.println(); - } - - /* end of switch */ - out.println(" /* . . . . . .*/"); - out.println(" default:"); - out.println(" throw new Exception("); - out.println(" \"Invalid action number found in " + - "internal parse table\");"); - out.println(); - out.println(" }"); - - /* end of method */ - out.println(" }"); - - /* end of class */ - out.println("}"); - out.println(); - - action_code_time = System.currentTimeMillis() - start_time; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit the production table. - * @param out stream to produce output on. - */ - protected static void emit_production_table(PrintWriter out) - { - production all_prods[]; - production prod; - - long start_time = System.currentTimeMillis(); - - /* collect up the productions in order */ - all_prods = new production[production.number()]; - for (Enumeration p = production.all(); p.hasMoreElements(); ) - { - prod = (production)p.nextElement(); - all_prods[prod.index()] = prod; - } - - // make short[][] - short[][] prod_table = new short[production.number()][2]; - for (int i = 0; i<production.number(); i++) - { - prod = all_prods[i]; - // { lhs symbol , rhs size } - prod_table[i][0] = (short) prod.lhs().the_symbol().index(); - prod_table[i][1] = (short) prod.rhs_length(); - } - /* do the top of the table */ - out.println(); - out.println(" /** Production table. */"); - out.println(" protected static final short _production_table[][] = "); - out.print (" unpackFromStrings("); - do_table_as_string(out, prod_table); - out.println(");"); - - /* do the public accessor method */ - out.println(); - out.println(" /** Access to production table. */"); - out.println(" public short[][] production_table() " + - "{return _production_table;}"); - - production_table_time = System.currentTimeMillis() - start_time; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit the action table. - * @param out stream to produce output on. - * @param act_tab the internal representation of the action table. - * @param compact_reduces do we use the most frequent reduce as default? - */ - protected static void do_action_table( - PrintWriter out, - parse_action_table act_tab, - boolean compact_reduces) - throws internal_error - { - parse_action_row row; - parse_action act; - int red; - - long start_time = System.currentTimeMillis(); - - /* collect values for the action table */ - short[][] action_table = new short[act_tab.num_states()][]; - /* do each state (row) of the action table */ - for (int i = 0; i < act_tab.num_states(); i++) - { - /* get the row */ - row = act_tab.under_state[i]; - - /* determine the default for the row */ - if (compact_reduces) - row.compute_default(); - else - row.default_reduce = -1; - - /* make temporary table for the row. */ - short[] temp_table = new short[2*row.size()]; - int nentries = 0; - - /* do each column */ - for (int j = 0; j < row.size(); j++) - { - /* extract the action from the table */ - act = row.under_term[j]; - - /* skip error entries these are all defaulted out */ - if (act.kind() != parse_action.ERROR) - { - /* first put in the symbol index, then the actual entry */ - - /* shifts get positive entries of state number + 1 */ - if (act.kind() == parse_action.SHIFT) - { - /* make entry */ - temp_table[nentries++] = (short) j; - temp_table[nentries++] = (short) - (((shift_action)act).shift_to().index() + 1); - } - - /* reduce actions get negated entries of production# + 1 */ - else if (act.kind() == parse_action.REDUCE) - { - /* if its the default entry let it get defaulted out */ - red = ((reduce_action)act).reduce_with().index(); - if (red != row.default_reduce) { - /* make entry */ - temp_table[nentries++] = (short) j; - temp_table[nentries++] = (short) (-(red+1)); - } - } else if (act.kind() == parse_action.NONASSOC) - { - /* do nothing, since we just want a syntax error */ - } - /* shouldn't be anything else */ - else - throw new internal_error("Unrecognized action code " + - act.kind() + " found in parse table"); - } - } - - /* now we know how big to make the row */ - action_table[i] = new short[nentries + 2]; - System.arraycopy(temp_table, 0, action_table[i], 0, nentries); - - /* finish off the row with a default entry */ - action_table[i][nentries++] = -1; - if (row.default_reduce != -1) - action_table[i][nentries++] = (short) (-(row.default_reduce+1)); - else - action_table[i][nentries++] = 0; - } - - /* finish off the init of the table */ - out.println(); - out.println(" /** Parse-action table. */"); - out.println(" protected static final short[][] _action_table = "); - out.print (" unpackFromStrings("); - do_table_as_string(out, action_table); - out.println(");"); - - /* do the public accessor method */ - out.println(); - out.println(" /** Access to parse-action table. */"); - out.println(" public short[][] action_table() {return _action_table;}"); - - action_table_time = System.currentTimeMillis() - start_time; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit the reduce-goto table. - * @param out stream to produce output on. - * @param red_tab the internal representation of the reduce-goto table. - */ - protected static void do_reduce_table( - PrintWriter out, - parse_reduce_table red_tab) - { - lalr_state goto_st; - parse_action act; - - long start_time = System.currentTimeMillis(); - - /* collect values for reduce-goto table */ - short[][] reduce_goto_table = new short[red_tab.num_states()][]; - /* do each row of the reduce-goto table */ - for (int i=0; i<red_tab.num_states(); i++) - { - /* make temporary table for the row. */ - short[] temp_table = new short[2*red_tab.under_state[i].size()]; - int nentries = 0; - /* do each entry in the row */ - for (int j=0; j<red_tab.under_state[i].size(); j++) - { - /* get the entry */ - goto_st = red_tab.under_state[i].under_non_term[j]; - - /* if we have none, skip it */ - if (goto_st != null) - { - /* make entries for the index and the value */ - temp_table[nentries++] = (short) j; - temp_table[nentries++] = (short) goto_st.index(); - } - } - /* now we know how big to make the row. */ - reduce_goto_table[i] = new short[nentries+2]; - System.arraycopy(temp_table, 0, reduce_goto_table[i], 0, nentries); - - /* end row with default value */ - reduce_goto_table[i][nentries++] = -1; - reduce_goto_table[i][nentries++] = -1; - } - - /* emit the table. */ - out.println(); - out.println(" /** <code>reduce_goto</code> table. */"); - out.println(" protected static final short[][] _reduce_table = "); - out.print (" unpackFromStrings("); - do_table_as_string(out, reduce_goto_table); - out.println(");"); - - /* do the public accessor method */ - out.println(); - out.println(" /** Access to <code>reduce_goto</code> table. */"); - out.println(" public short[][] reduce_table() {return _reduce_table;}"); - out.println(); - - goto_table_time = System.currentTimeMillis() - start_time; - } - - // print a string array encoding the given short[][] array. - protected static void do_table_as_string(PrintWriter out, short[][] sa) { - out.println("new String[] {"); - out.print(" \""); - int nchar=0, nbytes=0; - nbytes+=do_escaped(out, (char)(sa.length>>16)); - nchar =do_newline(out, nchar, nbytes); - nbytes+=do_escaped(out, (char)(sa.length&0xFFFF)); - nchar =do_newline(out, nchar, nbytes); - for (int i=0; i<sa.length; i++) { - nbytes+=do_escaped(out, (char)(sa[i].length>>16)); - nchar =do_newline(out, nchar, nbytes); - nbytes+=do_escaped(out, (char)(sa[i].length&0xFFFF)); - nchar =do_newline(out, nchar, nbytes); - for (int j=0; j<sa[i].length; j++) { - // contents of string are (value+2) to allow for common -1, 0 cases - // (UTF-8 encoding is most efficient for 0<c<0x80) - nbytes+=do_escaped(out, (char)(2+sa[i][j])); - nchar =do_newline(out, nchar, nbytes); - } - } - out.print("\" }"); - } - // split string if it is very long; start new line occasionally for neatness - protected static int do_newline(PrintWriter out, int nchar, int nbytes) { - if (nbytes > 65500) { out.println("\", "); out.print(" \""); } - else if (nchar > 11) { out.println("\" +"); out.print(" \""); } - else return nchar+1; - return 0; - } - // output an escape sequence for the given character code. - protected static int do_escaped(PrintWriter out, char c) { - StringBuffer escape = new StringBuffer(); - if (c <= 0xFF) { - escape.append(Integer.toOctalString(c)); - while(escape.length() < 3) escape.insert(0, '0'); - } else { - escape.append(Integer.toHexString(c)); - while(escape.length() < 4) escape.insert(0, '0'); - escape.insert(0, 'u'); - } - escape.insert(0, '\\'); - out.print(escape.toString()); - - // return number of bytes this takes up in UTF-8 encoding. - if (c == 0) return 2; - if (c >= 0x01 && c <= 0x7F) return 1; - if (c >= 0x80 && c <= 0x7FF) return 2; - return 3; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit the parser subclass with embedded tables. - * @param out stream to produce output on. - * @param action_table internal representation of the action table. - * @param reduce_table internal representation of the reduce-goto table. - * @param start_st start state of the parse machine. - * @param start_prod start production of the grammar. - * @param compact_reduces do we use most frequent reduce as default? - * @param suppress_scanner should scanner be suppressed for compatibility? - */ - public static void parser( - PrintWriter out, - parse_action_table action_table, - parse_reduce_table reduce_table, - int start_st, - production start_prod, - boolean compact_reduces, - boolean suppress_scanner) - throws internal_error - { - long start_time = System.currentTimeMillis(); - - /* top of file */ - out.println(); - out.println("//----------------------------------------------------"); - out.println("// The following code was generated by " + - version.title_str); - out.println("// " + new Date()); - out.println("//----------------------------------------------------"); - out.println(); - emit_package(out); - - /* user supplied imports */ - for (int i = 0; i < import_list.size(); i++) - out.println("import " + import_list.elementAt(i) + ";"); - - /* class header */ - out.println(); - out.println("/** "+version.title_str+" generated parser."); - out.println(" * @version " + new Date()); - out.println(" */"); - out.println("public class " + parser_class_name + - " extends java_cup.runtime.lr_parser {"); - - /* constructors [CSA/davidm, 24-jul-99] */ - out.println(); - out.println(" /** Default constructor. */"); - out.println(" public " + parser_class_name + "() {super();}"); - if (!suppress_scanner) { - out.println(); - out.println(" /** Constructor which sets the default scanner. */"); - out.println(" public " + parser_class_name + - "(java_cup.runtime.Scanner s) {super(s);}"); - } - - /* emit the various tables */ - emit_production_table(out); - do_action_table(out, action_table, compact_reduces); - do_reduce_table(out, reduce_table); - - /* instance of the action encapsulation class */ - out.println(" /** Instance of action encapsulation class. */"); - out.println(" protected " + pre("actions") + " action_obj;"); - out.println(); - - /* action object initializer */ - out.println(" /** Action encapsulation object initializer. */"); - out.println(" protected void init_actions()"); - out.println(" {"); - out.println(" action_obj = new " + pre("actions") + "(this);"); - out.println(" }"); - out.println(); - - /* access to action code */ - out.println(" /** Invoke a user supplied parse action. */"); - out.println(" public java_cup.runtime.Symbol do_action("); - out.println(" int act_num,"); - out.println(" java_cup.runtime.lr_parser parser,"); - out.println(" java.util.Stack stack,"); - out.println(" int top)"); - out.println(" throws java.lang.Exception"); - out.println(" {"); - out.println(" /* call code in generated class */"); - out.println(" return action_obj." + pre("do_action(") + - "act_num, parser, stack, top);"); - out.println(" }"); - out.println(""); - - - /* method to tell the parser about the start state */ - out.println(" /** Indicates start state. */"); - out.println(" public int start_state() {return " + start_st + ";}"); - - /* method to indicate start production */ - out.println(" /** Indicates start production. */"); - out.println(" public int start_production() {return " + - start_production.index() + ";}"); - out.println(); - - /* methods to indicate EOF and error symbol indexes */ - out.println(" /** <code>EOF</code> Symbol index. */"); - out.println(" public int EOF_sym() {return " + terminal.EOF.index() + - ";}"); - out.println(); - out.println(" /** <code>error</code> Symbol index. */"); - out.println(" public int error_sym() {return " + terminal.error.index() + - ";}"); - out.println(); - - /* user supplied code for user_init() */ - if (init_code != null) - { - out.println(); - out.println(" /** User initialization code. */"); - out.println(" public void user_init() throws java.lang.Exception"); - out.println(" {"); - out.println(init_code); - out.println(" }"); - } - - /* user supplied code for scan */ - if (scan_code != null) - { - out.println(); - out.println(" /** Scan to get the next Symbol. */"); - out.println(" public java_cup.runtime.Symbol scan()"); - out.println(" throws java.lang.Exception"); - out.println(" {"); - out.println(scan_code); - out.println(" }"); - } - - /* user supplied code */ - if (parser_code != null) - { - out.println(); - out.println(parser_code); - } - - /* end of class */ - out.println("}"); - - /* put out the action code class */ - emit_action_code(out, start_prod); - - parser_time = System.currentTimeMillis() - start_time; - } - - /*-----------------------------------------------------------*/ -} diff --git a/src/syntaxParser/java_cup/SAVE/internal_error.java b/src/syntaxParser/java_cup/SAVE/internal_error.java deleted file mode 100644 index 1ef58de..0000000 --- a/src/syntaxParser/java_cup/SAVE/internal_error.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** Exception subclass for reporting internal errors in JavaCup. */ -public class internal_error extends Exception - { - /** Constructor with a message */ - public internal_error(String msg) - { - super(msg); - } - - /** Method called to do a forced error exit on an internal error - for cases when we can't actually throw the exception. */ - public void crash() - { - System.err.println("JavaCUP Fatal Internal Error Detected"); - System.err.println(getMessage()); - printStackTrace(); - System.exit(-1); - } - } diff --git a/src/syntaxParser/java_cup/SAVE/lalr_item.java b/src/syntaxParser/java_cup/SAVE/lalr_item.java deleted file mode 100644 index 9612bf4..0000000 --- a/src/syntaxParser/java_cup/SAVE/lalr_item.java +++ /dev/null @@ -1,350 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Stack; -import java.util.Enumeration; - -/** This class represents an LALR item. Each LALR item consists of - * a production, a "dot" at a position within that production, and - * a set of lookahead symbols (terminal). (The first two of these parts - * are provide by the super class). An item is designed to represent a - * configuration that the parser may be in. For example, an item of the - * form: <pre> - * [A ::= B * C d E , {a,b,c}] - * </pre> - * indicates that the parser is in the middle of parsing the production <pre> - * A ::= B C d E - * </pre> - * that B has already been parsed, and that we will expect to see a lookahead - * of either a, b, or c once the complete RHS of this production has been - * found.<p> - * - * Items may initially be missing some items from their lookahead sets. - * Links are maintained from each item to the set of items that would need - * to be updated if symbols are added to its lookahead set. During - * "lookahead propagation", we add symbols to various lookahead sets and - * propagate these changes across these dependency links as needed. - * - * @see java_cup.lalr_item_set - * @see java_cup.lalr_state - */ -public class lalr_item extends lr_item_core { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param prod the production for the item. - * @param pos the position of the "dot" within the production. - * @param look the set of lookahead symbols. - */ - public lalr_item(production prod, int pos, terminal_set look) - throws internal_error - { - super(prod, pos); - _lookahead = look; - _propagate_items = new Stack(); - needs_propagation = true; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with default position (dot at start). - * @param prod the production for the item. - * @param look the set of lookahead symbols. - */ - public lalr_item(production prod, terminal_set look) throws internal_error - { - this(prod,0,look); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with default position and empty lookahead set. - * @param prod the production for the item. - */ - public lalr_item(production prod) throws internal_error - { - this(prod,0,new terminal_set()); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The lookahead symbols of the item. */ - protected terminal_set _lookahead; - - /** The lookahead symbols of the item. */ - public terminal_set lookahead() {return _lookahead;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Links to items that the lookahead needs to be propagated to. */ - protected Stack _propagate_items; - - /** Links to items that the lookahead needs to be propagated to */ - public Stack propagate_items() {return _propagate_items;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Flag to indicate that this item needs to propagate its lookahead - * (whether it has changed or not). - */ - protected boolean needs_propagation; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add a new item to the set of items we propagate to. */ - public void add_propagate(lalr_item prop_to) - { - _propagate_items.push(prop_to); - needs_propagation = true; - } - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Propagate incoming lookaheads through this item to others need to - * be changed. - * @params incoming symbols to potentially be added to lookahead of this item. - */ - public void propagate_lookaheads(terminal_set incoming) throws internal_error - { - boolean change = false; - - /* if we don't need to propagate, then bail out now */ - if (!needs_propagation && (incoming == null || incoming.empty())) - return; - - /* if we have null incoming, treat as an empty set */ - if (incoming != null) - { - /* add the incoming to the lookahead of this item */ - change = lookahead().add(incoming); - } - - /* if we changed or need it anyway, propagate across our links */ - if (change || needs_propagation) - { - /* don't need to propagate again */ - needs_propagation = false; - - /* propagate our lookahead into each item we are linked to */ - for (int i = 0; i < propagate_items().size(); i++) - ((lalr_item)propagate_items().elementAt(i)) - .propagate_lookaheads(lookahead()); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce the new lalr_item that results from shifting the dot one position - * to the right. - */ - public lalr_item shift() throws internal_error - { - lalr_item result; - - /* can't shift if we have dot already at the end */ - if (dot_at_end()) - throw new internal_error("Attempt to shift past end of an lalr_item"); - - /* create the new item w/ the dot shifted by one */ - result = new lalr_item(the_production(), dot_pos()+1, - new terminal_set(lookahead())); - - /* change in our lookahead needs to be propagated to this item */ - add_propagate(result); - - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Calculate lookahead representing symbols that could appear after the - * symbol that the dot is currently in front of. Note: this routine must - * not be invoked before first sets and nullability has been calculated - * for all non terminals. - */ - public terminal_set calc_lookahead(terminal_set lookahead_after) - throws internal_error - { - terminal_set result; - int pos; - production_part part; - symbol sym; - - /* sanity check */ - if (dot_at_end()) - throw new internal_error( - "Attempt to calculate a lookahead set with a completed item"); - - /* start with an empty result */ - result = new terminal_set(); - - /* consider all nullable symbols after the one to the right of the dot */ - for (pos = dot_pos()+1; pos < the_production().rhs_length(); pos++) - { - part = the_production().rhs(pos); - - /* consider what kind of production part it is -- skip actions */ - if (!part.is_action()) - { - sym = ((symbol_part)part).the_symbol(); - - /* if its a terminal add it in and we are done */ - if (!sym.is_non_term()) - { - result.add((terminal)sym); - return result; - } - else - { - /* otherwise add in first set of the non terminal */ - result.add(((non_terminal)sym).first_set()); - - /* if its nullable we continue adding, if not, we are done */ - if (!((non_terminal)sym).nullable()) - return result; - } - } - } - - /* if we get here everything past the dot was nullable - we add in the lookahead for after the production and we are done */ - result.add(lookahead_after); - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if everything from the symbol one beyond the dot all the - * way to the end of the right hand side is nullable. This would indicate - * that the lookahead of this item must be included in the lookaheads of - * all items produced as a closure of this item. Note: this routine should - * not be invoked until after first sets and nullability have been - * calculated for all non terminals. - */ - public boolean lookahead_visible() throws internal_error - { - production_part part; - symbol sym; - - /* if the dot is at the end, we have a problem, but the cleanest thing - to do is just return true. */ - if (dot_at_end()) return true; - - /* walk down the rhs and bail if we get a non-nullable symbol */ - for (int pos = dot_pos() + 1; pos < the_production().rhs_length(); pos++) - { - part = the_production().rhs(pos); - - /* skip actions */ - if (!part.is_action()) - { - sym = ((symbol_part)part).the_symbol(); - - /* if its a terminal we fail */ - if (!sym.is_non_term()) return false; - - /* if its not nullable we fail */ - if (!((non_terminal)sym).nullable()) return false; - } - } - - /* if we get here its all nullable */ - return true; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison -- here we only require the cores to be equal since - * we need to do sets of items based only on core equality (ignoring - * lookahead sets). - */ - public boolean equals(lalr_item other) - { - if (other == null) return false; - return super.equals(other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof lalr_item)) - return false; - else - return equals((lalr_item)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Return a hash code -- here we only hash the core since we only test core - * matching in LALR items. - */ - public int hashCode() - { - return super.hashCode(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to string. */ - public String toString() - { - String result = ""; - - // additional output for debugging: - // result += "(" + obj_hash() + ")"; - result += "["; - result += super.toString(); - result += ", "; - if (lookahead() != null) - { - result += "{"; - for (int t = 0; t < terminal.number(); t++) - if (lookahead().contains(t)) - result += terminal.find(t).name() + " "; - result += "}"; - } - else - result += "NULL LOOKAHEAD!!"; - result += "]"; - - // additional output for debugging: - // result += " -> "; - // for (int i = 0; i<propagate_items().size(); i++) - // result+=((lalr_item)(propagate_items().elementAt(i))).obj_hash()+" "; - // - // if (needs_propagation) result += " NP"; - - return result; - } - /*-----------------------------------------------------------*/ -} diff --git a/src/syntaxParser/java_cup/SAVE/lalr_item_set.java b/src/syntaxParser/java_cup/SAVE/lalr_item_set.java deleted file mode 100644 index a11db7d..0000000 --- a/src/syntaxParser/java_cup/SAVE/lalr_item_set.java +++ /dev/null @@ -1,390 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Hashtable; -import java.util.Enumeration; - -/** This class represents a set of LALR items. For purposes of building - * these sets, items are considered unique only if they have unique cores - * (i.e., ignoring differences in their lookahead sets).<p> - * - * This class provides fairly conventional set oriented operations (union, - * sub/super-set tests, etc.), as well as an LALR "closure" operation (see - * compute_closure()). - * - * @see java_cup.lalr_item - * @see java_cup.lalr_state - */ - -public class lalr_item_set { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Constructor for an empty set. */ - public lalr_item_set() { } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor for cloning from another set. - * @param other indicates set we should copy from. - */ - public lalr_item_set(lalr_item_set other) - throws internal_error - { - not_null(other); - _all = (Hashtable)other._all.clone(); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** A hash table to implement the set. We store the items using themselves - * as keys. - */ - protected Hashtable _all = new Hashtable(11); - - /** Access to all elements of the set. */ - public Enumeration all() {return _all.elements();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Cached hashcode for this set. */ - protected Integer hashcode_cache = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Size of the set */ - public int size() {return _all.size();} - - /*-----------------------------------------------------------*/ - /*--- Set Operation Methods ---------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Does the set contain a particular item? - * @param itm the item in question. - */ - public boolean contains(lalr_item itm) {return _all.containsKey(itm);} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Return the item in the set matching a particular item (or null if not - * found) - * @param itm the item we are looking for. - */ - public lalr_item find(lalr_item itm) {return (lalr_item)_all.get(itm);} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Is this set an (improper) subset of another? - * @param other the other set in question. - */ - public boolean is_subset_of(lalr_item_set other) throws internal_error - { - not_null(other); - - /* walk down our set and make sure every element is in the other */ - for (Enumeration e = all(); e.hasMoreElements(); ) - if (!other.contains((lalr_item)e.nextElement())) - return false; - - /* they were all there */ - return true; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Is this set an (improper) superset of another? - * @param other the other set in question. - */ - public boolean is_superset_of(lalr_item_set other) throws internal_error - { - not_null(other); - return other.is_subset_of(this); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add a singleton item, merging lookahead sets if the item is already - * part of the set. returns the element of the set that was added or - * merged into. - * @param itm the item being added. - */ - public lalr_item add(lalr_item itm) throws internal_error - { - lalr_item other; - - not_null(itm); - - /* see if an item with a matching core is already there */ - other = (lalr_item)_all.get(itm); - - /* if so, merge this lookahead into the original and leave it */ - if (other != null) - { - other.lookahead().add(itm.lookahead()); - return other; - } - /* otherwise we just go in the set */ - else - { - /* invalidate cached hashcode */ - hashcode_cache = null; - - _all.put(itm,itm); - return itm; - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove a single item if it is in the set. - * @param itm the item to remove. - */ - public void remove(lalr_item itm) throws internal_error - { - not_null(itm); - - /* invalidate cached hashcode */ - hashcode_cache = null; - - /* remove it from hash table implementing set */ - _all.remove(itm); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add a complete set, merging lookaheads where items are already in - * the set - * @param other the set to be added. - */ - public void add(lalr_item_set other) throws internal_error - { - not_null(other); - - /* walk down the other set and do the adds individually */ - for (Enumeration e = other.all(); e.hasMoreElements(); ) - add((lalr_item)e.nextElement()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove (set subtract) a complete set. - * @param other the set to remove. - */ - public void remove(lalr_item_set other) throws internal_error - { - not_null(other); - - /* walk down the other set and do the removes individually */ - for (Enumeration e = other.all(); e.hasMoreElements(); ) - remove((lalr_item)e.nextElement()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove and return one item from the set (done in hash order). */ - public lalr_item get_one() throws internal_error - { - Enumeration the_set; - lalr_item result; - - the_set = all(); - if (the_set.hasMoreElements()) - { - result = (lalr_item)the_set.nextElement(); - remove(result); - return result; - } - else - return null; - } - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Helper function for null test. Throws an interal_error exception if its - * parameter is null. - * @param obj the object we are testing. - */ - protected void not_null(Object obj) throws internal_error - { - if (obj == null) - throw new internal_error("Null object used in set operation"); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute the closure of the set using the LALR closure rules. Basically - * for every item of the form: <pre> - * [L ::= a *N alpha, l] - * </pre> - * (where N is a a non terminal and alpha is a string of symbols) make - * sure there are also items of the form: <pre> - * [N ::= *beta, first(alpha l)] - * </pre> - * corresponding to each production of N. Items with identical cores but - * differing lookahead sets are merged by creating a new item with the same - * core and the union of the lookahead sets (the LA in LALR stands for - * "lookahead merged" and this is where the merger is). This routine - * assumes that nullability and first sets have been computed for all - * productions before it is called. - */ - public void compute_closure() - throws internal_error - { - lalr_item_set consider; - lalr_item itm, new_itm, add_itm; - non_terminal nt; - terminal_set new_lookaheads; - Enumeration p; - production prod; - boolean need_prop; - - - - /* invalidate cached hashcode */ - hashcode_cache = null; - - /* each current element needs to be considered */ - consider = new lalr_item_set(this); - - /* repeat this until there is nothing else to consider */ - while (consider.size() > 0) - { - /* get one item to consider */ - itm = consider.get_one(); - - /* do we have a dot before a non terminal */ - nt = itm.dot_before_nt(); - if (nt != null) - { - /* create the lookahead set based on first after dot */ - new_lookaheads = itm.calc_lookahead(itm.lookahead()); - - /* are we going to need to propagate our lookahead to new item */ - need_prop = itm.lookahead_visible(); - - /* create items for each production of that non term */ - for (p = nt.productions(); p.hasMoreElements(); ) - { - prod = (production)p.nextElement(); - - /* create new item with dot at start and that lookahead */ - new_itm = new lalr_item(prod, - new terminal_set(new_lookaheads)); - - /* add/merge item into the set */ - add_itm = add(new_itm); - /* if propagation is needed link to that item */ - if (need_prop) - itm.add_propagate(add_itm); - - /* was this was a new item*/ - if (add_itm == new_itm) - { - /* that may need further closure, consider it also */ - consider.add(new_itm); - } - } - } - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(lalr_item_set other) - { - if (other == null || other.size() != size()) return false; - - /* once we know they are the same size, then improper subset does test */ - try { - return is_subset_of(other); - } catch (internal_error e) { - /* can't throw error from here (because superclass doesn't) so crash */ - e.crash(); - return false; - } - - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof lalr_item_set)) - return false; - else - return equals((lalr_item_set)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Return hash code. */ - public int hashCode() - { - int result = 0; - Enumeration e; - int cnt; - - /* only compute a new one if we don't have it cached */ - if (hashcode_cache == null) - { - /* hash together codes from at most first 5 elements */ - // CSA fix! we'd *like* to hash just a few elements, but - // that means equal sets will have inequal hashcodes, which - // we're not allowed (by contract) to do. So hash them all. - for (e = all(), cnt=0 ; e.hasMoreElements() /*&& cnt<5*/; cnt++) - result ^= ((lalr_item)e.nextElement()).hashCode(); - - hashcode_cache = new Integer(result); - } - - return hashcode_cache.intValue(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to string. */ - public String toString() - { - StringBuffer result = new StringBuffer(); - - result.append("{\n"); - for (Enumeration e=all(); e.hasMoreElements(); ) - { - result.append(" " + (lalr_item)e.nextElement() + "\n"); - } - result.append("}"); - - return result.toString(); - } - /*-----------------------------------------------------------*/ -} - diff --git a/src/syntaxParser/java_cup/SAVE/lalr_state.java b/src/syntaxParser/java_cup/SAVE/lalr_state.java deleted file mode 100644 index de65957..0000000 --- a/src/syntaxParser/java_cup/SAVE/lalr_state.java +++ /dev/null @@ -1,902 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Hashtable; -import java.util.Enumeration; -import java.util.Stack; - -/** This class represents a state in the LALR viable prefix recognition machine. - * A state consists of an LALR item set and a set of transitions to other - * states under terminal and non-terminal symbols. Each state represents - * a potential configuration of the parser. If the item set of a state - * includes an item such as: <pre> - * [A ::= B * C d E , {a,b,c}] - * </pre> - * this indicates that when the parser is in this state it is currently - * looking for an A of the given form, has already seen the B, and would - * expect to see an a, b, or c after this sequence is complete. Note that - * the parser is normally looking for several things at once (represented - * by several items). In our example above, the state would also include - * items such as: <pre> - * [C ::= * X e Z, {d}] - * [X ::= * f, {e}] - * </pre> - * to indicate that it was currently looking for a C followed by a d (which - * would be reduced into a C, matching the first symbol in our production - * above), and the terminal f followed by e.<p> - * - * At runtime, the parser uses a viable prefix recognition machine made up - * of these states to parse. The parser has two operations, shift and reduce. - * In a shift, it consumes one Symbol and makes a transition to a new state. - * This corresponds to "moving the dot past" a terminal in one or more items - * in the state (these new shifted items will then be found in the state at - * the end of the transition). For a reduce operation, the parser is - * signifying that it is recognizing the RHS of some production. To do this - * it first "backs up" by popping a stack of previously saved states. It - * pops off the same number of states as are found in the RHS of the - * production. This leaves the machine in the same state is was in when the - * parser first attempted to find the RHS. From this state it makes a - * transition based on the non-terminal on the LHS of the production. This - * corresponds to placing the parse in a configuration equivalent to having - * replaced all the symbols from the the input corresponding to the RHS with - * the symbol on the LHS. - * - * @see java_cup.lalr_item - * @see java_cup.lalr_item_set - * @see java_cup.lalr_transition - */ - -public class lalr_state { - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Constructor for building a state from a set of items. - * @param itms the set of items that makes up this state. - */ - public lalr_state(lalr_item_set itms) throws internal_error - { - /* don't allow null or duplicate item sets */ - if (itms == null) - throw new internal_error( - "Attempt to construct an LALR state from a null item set"); - - if (find_state(itms) != null) - throw new internal_error( - "Attempt to construct a duplicate LALR state"); - - /* assign a unique index */ - _index = next_index++; - - /* store the items */ - _items = itms; - - /* add to the global collection, keyed with its item set */ - _all.put(_items,this); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Collection of all states. */ - protected static Hashtable _all = new Hashtable(); - - /** Collection of all states. */ - public static Enumeration all() {return _all.elements();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Indicate total number of states there are. */ - public static int number() {return _all.size();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Hash table to find states by their kernels (i.e, the original, - * unclosed, set of items -- which uniquely define the state). This table - * stores state objects using (a copy of) their kernel item sets as keys. - */ - protected static Hashtable _all_kernels = new Hashtable(); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Find and return state with a given a kernel item set (or null if not - * found). The kernel item set is the subset of items that were used to - * originally create the state. These items are formed by "shifting the - * dot" within items of other states that have a transition to this one. - * The remaining elements of this state's item set are added during closure. - * @param itms the kernel set of the state we are looking for. - */ - public static lalr_state find_state(lalr_item_set itms) - { - if (itms == null) - return null; - else - return (lalr_state)_all.get(itms); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Static counter for assigning unique state indexes. */ - protected static int next_index = 0; - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The item set for this state. */ - protected lalr_item_set _items; - - /** The item set for this state. */ - public lalr_item_set items() {return _items;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** List of transitions out of this state. */ - protected lalr_transition _transitions = null; - - /** List of transitions out of this state. */ - public lalr_transition transitions() {return _transitions;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Index of this state in the parse tables */ - protected int _index; - - /** Index of this state in the parse tables */ - public int index() {return _index;} - - /*-----------------------------------------------------------*/ - /*--- Static Methods ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Helper routine for debugging -- produces a dump of the given state - * onto System.out. - */ - protected static void dump_state(lalr_state st) throws internal_error - { - lalr_item_set itms; - lalr_item itm; - production_part part; - - if (st == null) - { - System.out.println("NULL lalr_state"); - return; - } - - System.out.println("lalr_state [" + st.index() + "] {"); - itms = st.items(); - for (Enumeration e = itms.all(); e.hasMoreElements(); ) - { - itm = (lalr_item)e.nextElement(); - System.out.print(" ["); - System.out.print(itm.the_production().lhs().the_symbol().name()); - System.out.print(" ::= "); - for (int i = 0; i<itm.the_production().rhs_length(); i++) - { - if (i == itm.dot_pos()) System.out.print("(*) "); - part = itm.the_production().rhs(i); - if (part.is_action()) - System.out.print("{action} "); - else - System.out.print(((symbol_part)part).the_symbol().name() + " "); - } - if (itm.dot_at_end()) System.out.print("(*) "); - System.out.println("]"); - } - System.out.println("}"); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Propagate lookahead sets through the constructed viable prefix - * recognizer. When the machine is constructed, each item that results - in the creation of another such that its lookahead is included in the - other's will have a propagate link set up for it. This allows additions - to the lookahead of one item to be included in other items that it - was used to directly or indirectly create. - */ - protected static void propagate_all_lookaheads() throws internal_error - { - /* iterate across all states */ - for (Enumeration st = all(); st.hasMoreElements(); ) - { - /* propagate lookaheads out of that state */ - ((lalr_state)st.nextElement()).propagate_lookaheads(); - } - } - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Add a transition out of this state to another. - * @param on_sym the symbol the transition is under. - * @param to_st the state the transition goes to. - */ - public void add_transition(symbol on_sym, lalr_state to_st) - throws internal_error - { - lalr_transition trans; - - /* create a new transition object and put it in our list */ - trans = new lalr_transition(on_sym, to_st, _transitions); - _transitions = trans; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Build an LALR viable prefix recognition machine given a start - * production. This method operates by first building a start state - * from the start production (based on a single item with the dot at - * the beginning and EOF as expected lookahead). Then for each state - * it attempts to extend the machine by creating transitions out of - * the state to new or existing states. When considering extension - * from a state we make a transition on each symbol that appears before - * the dot in some item. For example, if we have the items: <pre> - * [A ::= a b * X c, {d,e}] - * [B ::= a b * X d, {a,b}] - * </pre> - * in some state, then we would be making a transition under X to a new - * state. This new state would be formed by a "kernel" of items - * corresponding to moving the dot past the X. In this case: <pre> - * [A ::= a b X * c, {d,e}] - * [B ::= a b X * Y, {a,b}] - * </pre> - * The full state would then be formed by "closing" this kernel set of - * items so that it included items that represented productions of things - * the parser was now looking for. In this case we would items - * corresponding to productions of Y, since various forms of Y are expected - * next when in this state (see lalr_item_set.compute_closure() for details - * on closure). <p> - * - * The process of building the viable prefix recognizer terminates when no - * new states can be added. However, in order to build a smaller number of - * states (i.e., corresponding to LALR rather than canonical LR) the state - * building process does not maintain full loookaheads in all items. - * Consequently, after the machine is built, we go back and propagate - * lookaheads through the constructed machine using a call to - * propagate_all_lookaheads(). This makes use of propagation links - * constructed during the closure and transition process. - * - * @param start_prod the start production of the grammar - * @see java_cup.lalr_item_set#compute_closure - * @see java_cup.lalr_state#propagate_all_lookaheads - */ - - public static lalr_state build_machine(production start_prod) - throws internal_error - { - lalr_state start_state; - lalr_item_set start_items; - lalr_item_set new_items; - lalr_item_set linked_items; - lalr_item_set kernel; - Stack work_stack = new Stack(); - lalr_state st, new_st; - symbol_set outgoing; - lalr_item itm, new_itm, existing, fix_itm; - symbol sym, sym2; - Enumeration i, s, fix; - - /* sanity check */ - if (start_prod == null) - throw new internal_error( - "Attempt to build viable prefix recognizer using a null production"); - - /* build item with dot at front of start production and EOF lookahead */ - start_items = new lalr_item_set(); - - itm = new lalr_item(start_prod); - itm.lookahead().add(terminal.EOF); - - start_items.add(itm); - - /* create copy the item set to form the kernel */ - kernel = new lalr_item_set(start_items); - - /* create the closure from that item set */ - start_items.compute_closure(); - - /* build a state out of that item set and put it in our work set */ - start_state = new lalr_state(start_items); - work_stack.push(start_state); - - /* enter the state using the kernel as the key */ - _all_kernels.put(kernel, start_state); - - /* continue looking at new states until we have no more work to do */ - while (!work_stack.empty()) - { - /* remove a state from the work set */ - st = (lalr_state)work_stack.pop(); - - /* gather up all the symbols that appear before dots */ - outgoing = new symbol_set(); - for (i = st.items().all(); i.hasMoreElements(); ) - { - itm = (lalr_item)i.nextElement(); - - /* add the symbol before the dot (if any) to our collection */ - sym = itm.symbol_after_dot(); - if (sym != null) outgoing.add(sym); - } - - /* now create a transition out for each individual symbol */ - for (s = outgoing.all(); s.hasMoreElements(); ) - { - sym = (symbol)s.nextElement(); - - /* will be keeping the set of items with propagate links */ - linked_items = new lalr_item_set(); - - /* gather up shifted versions of all the items that have this - symbol before the dot */ - new_items = new lalr_item_set(); - for (i = st.items().all(); i.hasMoreElements();) - { - itm = (lalr_item)i.nextElement(); - - /* if this is the symbol we are working on now, add to set */ - sym2 = itm.symbol_after_dot(); - if (sym.equals(sym2)) - { - /* add to the kernel of the new state */ - new_items.add(itm.shift()); - - /* remember that itm has propagate link to it */ - linked_items.add(itm); - } - } - - /* use new items as state kernel */ - kernel = new lalr_item_set(new_items); - - /* have we seen this one already? */ - new_st = (lalr_state)_all_kernels.get(kernel); - - /* if we haven't, build a new state out of the item set */ - if (new_st == null) - { - /* compute closure of the kernel for the full item set */ - new_items.compute_closure(); - - /* build the new state */ - new_st = new lalr_state(new_items); - - /* add the new state to our work set */ - work_stack.push(new_st); - - /* put it in our kernel table */ - _all_kernels.put(kernel, new_st); - } - /* otherwise relink propagation to items in existing state */ - else - { - /* walk through the items that have links to the new state */ - for (fix = linked_items.all(); fix.hasMoreElements(); ) - { - fix_itm = (lalr_item)fix.nextElement(); - - /* look at each propagate link out of that item */ - for (int l =0; l < fix_itm.propagate_items().size(); l++) - { - /* pull out item linked to in the new state */ - new_itm = - (lalr_item)fix_itm.propagate_items().elementAt(l); - - /* find corresponding item in the existing state */ - existing = new_st.items().find(new_itm); - - /* fix up the item so it points to the existing set */ - if (existing != null) - fix_itm.propagate_items().setElementAt(existing ,l); - } - } - } - - /* add a transition from current state to that state */ - st.add_transition(sym, new_st); - } - } - - /* all done building states */ - - /* propagate complete lookahead sets throughout the states */ - propagate_all_lookaheads(); - - return start_state; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Propagate lookahead sets out of this state. This recursively - * propagates to all items that have propagation links from some item - * in this state. - */ - protected void propagate_lookaheads() throws internal_error - { - /* recursively propagate out from each item in the state */ - for (Enumeration itm = items().all(); itm.hasMoreElements(); ) - ((lalr_item)itm.nextElement()).propagate_lookaheads(null); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Fill in the parse table entries for this state. There are two - * parse tables that encode the viable prefix recognition machine, an - * action table and a reduce-goto table. The rows in each table - * correspond to states of the machine. The columns of the action table - * are indexed by terminal symbols and correspond to either transitions - * out of the state (shift entries) or reductions from the state to some - * previous state saved on the stack (reduce entries). All entries in the - * action table that are not shifts or reduces, represent errors. The - * reduce-goto table is indexed by non terminals and represents transitions - * out of a state on that non-terminal.<p> - * Conflicts occur if more than one action needs to go in one entry of the - * action table (this cannot happen with the reduce-goto table). Conflicts - * are resolved by always shifting for shift/reduce conflicts and choosing - * the lowest numbered production (hence the one that appeared first in - * the specification) in reduce/reduce conflicts. All conflicts are - * reported and if more conflicts are detected than were declared by the - * user, code generation is aborted. - * - * @param act_table the action table to put entries in. - * @param reduce_table the reduce-goto table to put entries in. - */ - public void build_table_entries( - parse_action_table act_table, - parse_reduce_table reduce_table) - throws internal_error - { - parse_action_row our_act_row; - parse_reduce_row our_red_row; - lalr_item itm; - parse_action act, other_act; - symbol sym; - terminal_set conflict_set = new terminal_set(); - - /* pull out our rows from the tables */ - our_act_row = act_table.under_state[index()]; - our_red_row = reduce_table.under_state[index()]; - - /* consider each item in our state */ - for (Enumeration i = items().all(); i.hasMoreElements(); ) - { - itm = (lalr_item)i.nextElement(); - - - /* if its completed (dot at end) then reduce under the lookahead */ - if (itm.dot_at_end()) - { - act = new reduce_action(itm.the_production()); - - /* consider each lookahead symbol */ - for (int t = 0; t < terminal.number(); t++) - { - /* skip over the ones not in the lookahead */ - if (!itm.lookahead().contains(t)) continue; - - /* if we don't already have an action put this one in */ - if (our_act_row.under_term[t].kind() == - parse_action.ERROR) - { - our_act_row.under_term[t] = act; - } - else - { - /* we now have at least one conflict */ - terminal term = terminal.find(t); - other_act = our_act_row.under_term[t]; - - /* if the other act was not a shift */ - if ((other_act.kind() != parse_action.SHIFT) && - (other_act.kind() != parse_action.NONASSOC)) - { - /* if we have lower index hence priority, replace it*/ - if (itm.the_production().index() < - ((reduce_action)other_act).reduce_with().index()) - { - /* replace the action */ - our_act_row.under_term[t] = act; - } - } else { - /* Check precedences,see if problem is correctable */ - if(fix_with_precedence(itm.the_production(), - t, our_act_row, act)) { - term = null; - } - } - if(term!=null) { - - conflict_set.add(term); - } - } - } - } - } - - /* consider each outgoing transition */ - for (lalr_transition trans=transitions(); trans!=null; trans=trans.next()) - { - /* if its on an terminal add a shift entry */ - sym = trans.on_symbol(); - if (!sym.is_non_term()) - { - act = new shift_action(trans.to_state()); - - /* if we don't already have an action put this one in */ - if ( our_act_row.under_term[sym.index()].kind() == - parse_action.ERROR) - { - our_act_row.under_term[sym.index()] = act; - } - else - { - /* we now have at least one conflict */ - production p = ((reduce_action)our_act_row.under_term[sym.index()]).reduce_with(); - - /* shift always wins */ - if (!fix_with_precedence(p, sym.index(), our_act_row, act)) { - our_act_row.under_term[sym.index()] = act; - conflict_set.add(terminal.find(sym.index())); - } - } - } - else - { - /* for non terminals add an entry to the reduce-goto table */ - our_red_row.under_non_term[sym.index()] = trans.to_state(); - } - } - - /* if we end up with conflict(s), report them */ - if (!conflict_set.empty()) - report_conflicts(conflict_set); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - - /** Procedure that attempts to fix a shift/reduce error by using - * precedences. --frankf 6/26/96 - * - * if a production (also called rule) or the lookahead terminal - * has a precedence, then the table can be fixed. if the rule - * has greater precedence than the terminal, a reduce by that rule - * in inserted in the table. If the terminal has a higher precedence, - * it is shifted. if they have equal precedence, then the associativity - * of the precedence is used to determine what to put in the table: - * if the precedence is left associative, the action is to reduce. - * if the precedence is right associative, the action is to shift. - * if the precedence is non associative, then it is a syntax error. - * - * @param p the production - * @param term_index the index of the lokahead terminal - * @param parse_action_row a row of the action table - * @param act the rule in conflict with the table entry - */ - - protected boolean fix_with_precedence( - production p, - int term_index, - parse_action_row table_row, - parse_action act) - - throws internal_error { - - terminal term = terminal.find(term_index); - - /* if the production has a precedence number, it can be fixed */ - if (p.precedence_num() > assoc.no_prec) { - - /* if production precedes terminal, put reduce in table */ - if (p.precedence_num() > term.precedence_num()) { - table_row.under_term[term_index] = - insert_reduce(table_row.under_term[term_index],act); - return true; - } - - /* if terminal precedes rule, put shift in table */ - else if (p.precedence_num() < term.precedence_num()) { - table_row.under_term[term_index] = - insert_shift(table_row.under_term[term_index],act); - return true; - } - else { /* they are == precedence */ - - /* equal precedences have equal sides, so only need to - look at one: if it is right, put shift in table */ - if (term.precedence_side() == assoc.right) { - table_row.under_term[term_index] = - insert_shift(table_row.under_term[term_index],act); - return true; - } - - /* if it is left, put reduce in table */ - else if (term.precedence_side() == assoc.left) { - table_row.under_term[term_index] = - insert_reduce(table_row.under_term[term_index],act); - return true; - } - - /* if it is nonassoc, we're not allowed to have two nonassocs - of equal precedence in a row, so put in NONASSOC */ - else if (term.precedence_side() == assoc.nonassoc) { - table_row.under_term[term_index] = new nonassoc_action(); - return true; - } else { - /* something really went wrong */ - throw new internal_error("Unable to resolve conflict correctly"); - } - } - } - /* check if terminal has precedence, if so, shift, since - rule does not have precedence */ - else if (term.precedence_num() > assoc.no_prec) { - table_row.under_term[term_index] = - insert_shift(table_row.under_term[term_index],act); - return true; - } - - /* otherwise, neither the rule nor the terminal has a precedence, - so it can't be fixed. */ - return false; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - - /* given two actions, and an action type, return the - action of that action type. give an error if they are of - the same action, because that should never have tried - to be fixed - - */ - protected parse_action insert_action( - parse_action a1, - parse_action a2, - int act_type) - throws internal_error - { - if ((a1.kind() == act_type) && (a2.kind() == act_type)) { - throw new internal_error("Conflict resolution of bogus actions"); - } else if (a1.kind() == act_type) { - return a1; - } else if (a2.kind() == act_type) { - return a2; - } else { - throw new internal_error("Conflict resolution of bogus actions"); - } - } - - /* find the shift in the two actions */ - protected parse_action insert_shift( - parse_action a1, - parse_action a2) - throws internal_error - { - return insert_action(a1, a2, parse_action.SHIFT); - } - - /* find the reduce in the two actions */ - protected parse_action insert_reduce( - parse_action a1, - parse_action a2) - throws internal_error - { - return insert_action(a1, a2, parse_action.REDUCE); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce warning messages for all conflicts found in this state. */ - protected void report_conflicts(terminal_set conflict_set) - throws internal_error - { - lalr_item itm, compare; - symbol shift_sym; - - boolean after_itm; - - /* consider each element */ - for (Enumeration itms = items().all(); itms.hasMoreElements(); ) - { - itm = (lalr_item)itms.nextElement(); - - /* clear the S/R conflict set for this item */ - - /* if it results in a reduce, it could be a conflict */ - if (itm.dot_at_end()) - { - /* not yet after itm */ - after_itm = false; - - /* compare this item against all others looking for conflicts */ - for (Enumeration comps = items().all(); comps.hasMoreElements(); ) - { - compare = (lalr_item)comps.nextElement(); - - /* if this is the item, next one is after it */ - if (itm == compare) after_itm = true; - - /* only look at it if its not the same item */ - if (itm != compare) - { - /* is it a reduce */ - if (compare.dot_at_end()) - { - /* only look at reduces after itm */ - if (after_itm) - /* does the comparison item conflict? */ - if (compare.lookahead().intersects(itm.lookahead())) - /* report a reduce/reduce conflict */ - report_reduce_reduce(itm, compare); - } - } - } - /* report S/R conflicts under all the symbols we conflict under */ - for (int t = 0; t < terminal.number(); t++) - if (conflict_set.contains(t)) - report_shift_reduce(itm,t); - } - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a warning message for one reduce/reduce conflict. - * - * @param itm1 first item in conflict. - * @param itm2 second item in conflict. - */ - protected void report_reduce_reduce(lalr_item itm1, lalr_item itm2) - throws internal_error - { - boolean comma_flag = false; - - System.err.println("*** Reduce/Reduce conflict found in state #"+index()); - System.err.print (" between "); - System.err.println(itm1.to_simple_string()); - System.err.print (" and "); - System.err.println(itm2.to_simple_string()); - System.err.print(" under symbols: {" ); - for (int t = 0; t < terminal.number(); t++) - { - if (itm1.lookahead().contains(t) && itm2.lookahead().contains(t)) - { - if (comma_flag) System.err.print(", "); else comma_flag = true; - System.err.print(terminal.find(t).name()); - } - } - System.err.println("}"); - System.err.print(" Resolved in favor of "); - if (itm1.the_production().index() < itm2.the_production().index()) - System.err.println("the first production.\n"); - else - System.err.println("the second production.\n"); - - /* count the conflict */ - emit.num_conflicts++; - lexer.warning_count++; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a warning message for one shift/reduce conflict. - * - * @param red_itm the item with the reduce. - * @param conflict_sym the index of the symbol conflict occurs under. - */ - protected void report_shift_reduce( - lalr_item red_itm, - int conflict_sym) - throws internal_error - { - lalr_item itm; - symbol shift_sym; - - /* emit top part of message including the reduce item */ - System.err.println("*** Shift/Reduce conflict found in state #"+index()); - System.err.print (" between "); - System.err.println(red_itm.to_simple_string()); - - /* find and report on all items that shift under our conflict symbol */ - for (Enumeration itms = items().all(); itms.hasMoreElements(); ) - { - itm = (lalr_item)itms.nextElement(); - - /* only look if its not the same item and not a reduce */ - if (itm != red_itm && !itm.dot_at_end()) - { - /* is it a shift on our conflicting terminal */ - shift_sym = itm.symbol_after_dot(); - if (!shift_sym.is_non_term() && shift_sym.index() == conflict_sym) - { - /* yes, report on it */ - System.err.println(" and " + itm.to_simple_string()); - } - } - } - System.err.println(" under symbol "+ terminal.find(conflict_sym).name()); - System.err.println(" Resolved in favor of shifting.\n"); - - /* count the conflict */ - emit.num_conflicts++; - lexer.warning_count++; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(lalr_state other) - { - /* we are equal if our item sets are equal */ - return other != null && items().equals(other.items()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof lalr_state)) - return false; - else - return equals((lalr_state)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a hash code. */ - public int hashCode() - { - /* just use the item set hash code */ - return items().hashCode(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - String result; - lalr_transition tr; - - /* dump the item set */ - result = "lalr_state [" + index() + "]: " + _items + "\n"; - - /* do the transitions */ - for (tr = transitions(); tr != null; tr = tr.next()) - { - result += tr; - result += "\n"; - } - - return result; - } - - /*-----------------------------------------------------------*/ -} diff --git a/src/syntaxParser/java_cup/SAVE/lalr_transition.java b/src/syntaxParser/java_cup/SAVE/lalr_transition.java deleted file mode 100644 index 706b062..0000000 --- a/src/syntaxParser/java_cup/SAVE/lalr_transition.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents a transition in an LALR viable prefix recognition - * machine. Transitions can be under terminals for non-terminals. They are - * internally linked together into singly linked lists containing all the - * transitions out of a single state via the _next field. - * - * @see java_cup.lalr_state - */ -public class lalr_transition { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param on_sym symbol we are transitioning on. - * @param to_st state we transition to. - * @param nxt next transition in linked list. - */ - public lalr_transition(symbol on_sym, lalr_state to_st, lalr_transition nxt) - throws internal_error - { - /* sanity checks */ - if (on_sym == null) - throw new internal_error("Attempt to create transition on null symbol"); - if (to_st == null) - throw new internal_error("Attempt to create transition to null state"); - - /* initialize */ - _on_symbol = on_sym; - _to_state = to_st; - _next = nxt; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with null next. - * @param on_sym symbol we are transitioning on. - * @param to_st state we transition to. - */ - public lalr_transition(symbol on_sym, lalr_state to_st) throws internal_error - { - this(on_sym, to_st, null); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The symbol we make the transition on. */ - protected symbol _on_symbol; - - /** The symbol we make the transition on. */ - public symbol on_symbol() {return _on_symbol;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The state we transition to. */ - protected lalr_state _to_state; - - /** The state we transition to. */ - public lalr_state to_state() {return _to_state;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Next transition in linked list of transitions out of a state */ - protected lalr_transition _next; - - /** Next transition in linked list of transitions out of a state */ - public lalr_transition next() {return _next;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Convert to a string. */ - public String toString() - { - String result; - - result = "transition on " + on_symbol().name() + " to state ["; - result += _to_state.index(); - result += "]"; - - return result; - } - - /*-----------------------------------------------------------*/ -} diff --git a/src/syntaxParser/java_cup/SAVE/lexer.java b/src/syntaxParser/java_cup/SAVE/lexer.java deleted file mode 100644 index 858c71f..0000000 --- a/src/syntaxParser/java_cup/SAVE/lexer.java +++ /dev/null @@ -1,562 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java_cup.runtime.Symbol; -import java.util.Hashtable; - -/** This class implements a small scanner (aka lexical analyzer or lexer) for - * the JavaCup specification. This scanner reads characters from standard - * input (System.in) and returns integers corresponding to the terminal - * number of the next Symbol. Once end of input is reached the EOF Symbol is - * returned on every subsequent call.<p> - * Symbols currently returned include: <pre> - * Symbol Constant Returned Symbol Constant Returned - * ------ ----------------- ------ ----------------- - * "package" PACKAGE "import" IMPORT - * "code" CODE "action" ACTION - * "parser" PARSER "terminal" TERMINAL - * "non" NON "init" INIT - * "scan" SCAN "with" WITH - * "start" START "precedence" PRECEDENCE - * "left" LEFT "right" RIGHT - * "nonassoc" NONASSOC "%prec PRECENT_PREC - * [ LBRACK ] RBRACK - * ; SEMI - * , COMMA * STAR - * . DOT : COLON - * ::= COLON_COLON_EQUALS | BAR - * identifier ID {:...:} CODE_STRING - * "nonterminal" NONTERMINAL - * </pre> - * All symbol constants are defined in sym.java which is generated by - * JavaCup from parser.cup.<p> - * - * In addition to the scanner proper (called first via init() then with - * next_token() to get each Symbol) this class provides simple error and - * warning routines and keeps a count of errors and warnings that is - * publicly accessible.<p> - * - * This class is "static" (i.e., it has only static members and methods). - */ -public class lexer { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** The only constructor is private, so no instances can be created. */ - private lexer() { } - - /*-----------------------------------------------------------*/ - /*--- Static (Class) Variables ------------------------------*/ - /*-----------------------------------------------------------*/ - - /** First character of lookahead. */ - protected static int next_char; - - /** Second character of lookahead. */ - protected static int next_char2; - - /** Second character of lookahead. */ - protected static int next_char3; - - /** Second character of lookahead. */ - protected static int next_char4; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** EOF constant. */ - protected static final int EOF_CHAR = -1; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Table of keywords. Keywords are initially treated as identifiers. - * Just before they are returned we look them up in this table to see if - * they match one of the keywords. The string of the name is the key here, - * which indexes Integer objects holding the symbol number. - */ - protected static Hashtable keywords = new Hashtable(23); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Table of single character symbols. For ease of implementation, we - * store all unambiguous single character Symbols in this table of Integer - * objects keyed by Integer objects with the numerical value of the - * appropriate char (currently Character objects have a bug which precludes - * their use in tables). - */ - protected static Hashtable char_symbols = new Hashtable(11); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Current line number for use in error messages. */ - protected static int current_line = 1; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Character position in current line. */ - protected static int current_position = 1; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Character position in current line. */ - protected static int absolute_position = 1; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of total errors detected so far. */ - public static int error_count = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of warnings issued so far */ - public static int warning_count = 0; - - /*-----------------------------------------------------------*/ - /*--- Static Methods ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Initialize the scanner. This sets up the keywords and char_symbols - * tables and reads the first two characters of lookahead. - */ - public static void init() throws java.io.IOException - { - /* set up the keyword table */ - keywords.put("package", new Integer(sym.PACKAGE)); - keywords.put("import", new Integer(sym.IMPORT)); - keywords.put("code", new Integer(sym.CODE)); - keywords.put("action", new Integer(sym.ACTION)); - keywords.put("parser", new Integer(sym.PARSER)); - keywords.put("terminal", new Integer(sym.TERMINAL)); - keywords.put("non", new Integer(sym.NON)); - keywords.put("nonterminal",new Integer(sym.NONTERMINAL));// [CSA] - keywords.put("init", new Integer(sym.INIT)); - keywords.put("scan", new Integer(sym.SCAN)); - keywords.put("with", new Integer(sym.WITH)); - keywords.put("start", new Integer(sym.START)); - keywords.put("precedence", new Integer(sym.PRECEDENCE)); - keywords.put("left", new Integer(sym.LEFT)); - keywords.put("right", new Integer(sym.RIGHT)); - keywords.put("nonassoc", new Integer(sym.NONASSOC)); - - /* set up the table of single character symbols */ - char_symbols.put(new Integer(';'), new Integer(sym.SEMI)); - char_symbols.put(new Integer(','), new Integer(sym.COMMA)); - char_symbols.put(new Integer('*'), new Integer(sym.STAR)); - char_symbols.put(new Integer('.'), new Integer(sym.DOT)); - char_symbols.put(new Integer('|'), new Integer(sym.BAR)); - char_symbols.put(new Integer('['), new Integer(sym.LBRACK)); - char_symbols.put(new Integer(']'), new Integer(sym.RBRACK)); - - /* read two characters of lookahead */ - next_char = System.in.read(); - if (next_char == EOF_CHAR) { - next_char2 = EOF_CHAR; - next_char3 = EOF_CHAR; - next_char4 = EOF_CHAR; - } else { - next_char2 = System.in.read(); - if (next_char2 == EOF_CHAR) { - next_char3 = EOF_CHAR; - next_char4 = EOF_CHAR; - } else { - next_char3 = System.in.read(); - if (next_char3 == EOF_CHAR) { - next_char4 = EOF_CHAR; - } else { - next_char4 = System.in.read(); - } - } - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Advance the scanner one character in the input stream. This moves - * next_char2 to next_char and then reads a new next_char2. - */ - protected static void advance() throws java.io.IOException - { - int old_char; - - old_char = next_char; - next_char = next_char2; - if (next_char == EOF_CHAR) { - next_char2 = EOF_CHAR; - next_char3 = EOF_CHAR; - next_char4 = EOF_CHAR; - } else { - next_char2 = next_char3; - if (next_char2 == EOF_CHAR) { - next_char3 = EOF_CHAR; - next_char4 = EOF_CHAR; - } else { - next_char3 = next_char4; - if (next_char3 == EOF_CHAR) { - next_char4 = EOF_CHAR; - } else { - next_char4 = System.in.read(); - } - } - } - - /* count this */ - absolute_position++; - current_position++; - if (old_char == '\n' || (old_char == '\r' && next_char!='\n')) - { - current_line++; - current_position = 1; - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit an error message. The message will be marked with both the - * current line number and the position in the line. Error messages - * are printed on standard error (System.err). - * @param message the message to print. - */ - public static void emit_error(String message) - { - System.err.println("Error at " + current_line + "(" + current_position + - "): " + message); - error_count++; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Emit a warning message. The message will be marked with both the - * current line number and the position in the line. Messages are - * printed on standard error (System.err). - * @param message the message to print. - */ - public static void emit_warn(String message) - { - System.err.println("Warning at " + current_line + "(" + current_position + - "): " + message); - warning_count++; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if a character is ok to start an id. - * @param ch the character in question. - */ - protected static boolean id_start_char(int ch) - { - /* allow for % in identifiers. a hack to allow my - %prec in. Should eventually make lex spec for this - frankf */ - return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch == '_'); - - // later need to deal with non-8-bit chars here - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if a character is ok for the middle of an id. - * @param ch the character in question. - */ - protected static boolean id_char(int ch) - { - return id_start_char(ch) || (ch >= '0' && ch <= '9'); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Try to look up a single character symbol, returns -1 for not found. - * @param ch the character in question. - */ - protected static int find_single_char(int ch) - { - Integer result; - - result = (Integer)char_symbols.get(new Integer((char)ch)); - if (result == null) - return -1; - else - return result.intValue(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Handle swallowing up a comment. Both old style C and new style C++ - * comments are handled. - */ - protected static void swallow_comment() throws java.io.IOException - { - /* next_char == '/' at this point */ - - /* is it a traditional comment */ - if (next_char2 == '*') - { - /* swallow the opener */ - advance(); advance(); - - /* swallow the comment until end of comment or EOF */ - for (;;) - { - /* if its EOF we have an error */ - if (next_char == EOF_CHAR) - { - emit_error("Specification file ends inside a comment"); - return; - } - - /* if we can see the closer we are done */ - if (next_char == '*' && next_char2 == '/') - { - advance(); - advance(); - return; - } - - /* otherwise swallow char and move on */ - advance(); - } - } - - /* is its a new style comment */ - if (next_char2 == '/') - { - /* swallow the opener */ - advance(); advance(); - - /* swallow to '\n', '\r', '\f', or EOF */ - while (next_char != '\n' && next_char != '\r' && - next_char != '\f' && next_char!=EOF_CHAR) - advance(); - - return; - - } - - /* shouldn't get here, but... if we get here we have an error */ - emit_error("Malformed comment in specification -- ignored"); - advance(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Swallow up a code string. Code strings begin with "{:" and include - all characters up to the first occurrence of ":}" (there is no way to - include ":}" inside a code string). The routine returns a String - object suitable for return by the scanner. - */ - protected static Symbol do_code_string() throws java.io.IOException - { - StringBuffer result = new StringBuffer(); - - /* at this point we have lookahead of "{:" -- swallow that */ - advance(); advance(); - - /* save chars until we see ":}" */ - while (!(next_char == ':' && next_char2 == '}')) - { - /* if we have run off the end issue a message and break out of loop */ - if (next_char == EOF_CHAR) - { - emit_error("Specification file ends inside a code string"); - break; - } - - /* otherwise record the char and move on */ - result.append(new Character((char)next_char)); - advance(); - } - - /* advance past the closer and build a return Symbol */ - advance(); advance(); - return new Symbol(sym.CODE_STRING, result.toString()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Process an identifier. Identifiers begin with a letter, underscore, - * or dollar sign, which is followed by zero or more letters, numbers, - * underscores or dollar signs. This routine returns a String suitable - * for return by the scanner. - */ - protected static Symbol do_id() throws java.io.IOException - { - StringBuffer result = new StringBuffer(); - String result_str; - Integer keyword_num; - char buffer[] = new char[1]; - - /* next_char holds first character of id */ - buffer[0] = (char)next_char; - result.append(buffer,0,1); - advance(); - - /* collect up characters while they fit in id */ - while(id_char(next_char)) - { - buffer[0] = (char)next_char; - result.append(buffer,0,1); - advance(); - } - - /* extract a string and try to look it up as a keyword */ - result_str = result.toString(); - keyword_num = (Integer)keywords.get(result_str); - - /* if we found something, return that keyword */ - if (keyword_num != null) - return new Symbol(keyword_num.intValue()); - - /* otherwise build and return an id Symbol with an attached string */ - return new Symbol(sym.ID, result_str); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Return one Symbol. This is the main external interface to the scanner. - * It consumes sufficient characters to determine the next input Symbol - * and returns it. To help with debugging, this routine actually calls - * real_next_token() which does the work. If you need to debug the - * parser, this can be changed to call debug_next_token() which prints - * a debugging message before returning the Symbol. - */ - public static Symbol next_token() throws java.io.IOException - { - return real_next_token(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Debugging version of next_token(). This routine calls the real scanning - * routine, prints a message on System.out indicating what the Symbol is, - * then returns it. - */ - public static Symbol debug_next_token() throws java.io.IOException - { - Symbol result = real_next_token(); - System.out.println("# next_Symbol() => " + result.sym); - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The actual routine to return one Symbol. This is normally called from - * next_token(), but for debugging purposes can be called indirectly from - * debug_next_token(). - */ - protected static Symbol real_next_token() throws java.io.IOException - { - int sym_num; - - for (;;) - { - /* look for white space */ - if (next_char == ' ' || next_char == '\t' || next_char == '\n' || - next_char == '\f' || next_char == '\r') - { - /* advance past it and try the next character */ - advance(); - continue; - } - - /* look for a single character symbol */ - sym_num = find_single_char(next_char); - if (sym_num != -1) - { - /* found one -- advance past it and return a Symbol for it */ - advance(); - return new Symbol(sym_num); - } - - /* look for : or ::= */ - if (next_char == ':') - { - /* if we don't have a second ':' return COLON */ - if (next_char2 != ':') - { - advance(); - return new Symbol(sym.COLON); - } - - /* move forward and look for the '=' */ - advance(); - if (next_char2 == '=') - { - advance(); advance(); - return new Symbol(sym.COLON_COLON_EQUALS); - } - else - { - /* return just the colon (already consumed) */ - return new Symbol(sym.COLON); - } - } - - /* find a "%prec" string and return it. otherwise, a '%' was found, - which has no right being in the specification otherwise */ - if (next_char == '%') { - advance(); - if ((next_char == 'p') && (next_char2 == 'r') && (next_char3 == 'e') && - (next_char4 == 'c')) { - advance(); - advance(); - advance(); - advance(); - return new Symbol(sym.PERCENT_PREC); - } else { - emit_error("Found extraneous percent sign"); - } - } - - /* look for a comment */ - if (next_char == '/' && (next_char2 == '*' || next_char2 == '/')) - { - /* swallow then continue the scan */ - swallow_comment(); - continue; - } - - /* look for start of code string */ - if (next_char == '{' && next_char2 == ':') - return do_code_string(); - - /* look for an id or keyword */ - if (id_start_char(next_char)) return do_id(); - - /* look for EOF */ - if (next_char == EOF_CHAR) return new Symbol(sym.EOF); - - /* if we get here, we have an unrecognized character */ - emit_warn("Unrecognized character '" + - new Character((char)next_char) + "'(" + next_char + - ") -- ignored"); - - /* advance past it */ - advance(); - } - } - - /*-----------------------------------------------------------*/ -} - diff --git a/src/syntaxParser/java_cup/SAVE/lr_item_core.java b/src/syntaxParser/java_cup/SAVE/lr_item_core.java deleted file mode 100644 index 6596f61..0000000 --- a/src/syntaxParser/java_cup/SAVE/lr_item_core.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** The "core" of an LR item. This includes a production and the position - * of a marker (the "dot") within the production. Typically item cores - * are written using a production with an embedded "dot" to indicate their - * position. For example: <pre> - * A ::= B * C d E - * </pre> - * This represents a point in a parse where the parser is trying to match - * the given production, and has succeeded in matching everything before the - * "dot" (and hence is expecting to see the symbols after the dot next). See - * lalr_item, lalr_item_set, and lalr_start for full details on the meaning - * and use of items. - * - * @see java_cup.lalr_item - * @see java_cup.lalr_item_set - * @see java_cup.lalr_state -*/ - -public class lr_item_core { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param prod production this item uses. - * @param pos position of the "dot" within the item. - */ - public lr_item_core(production prod, int pos) throws internal_error - { - symbol after_dot = null; - production_part part; - - if (prod == null) - throw new internal_error( - "Attempt to create an lr_item_core with a null production"); - - _the_production = prod; - - if (pos < 0 || pos > _the_production.rhs_length()) - throw new internal_error( - "Attempt to create an lr_item_core with a bad dot position"); - - _dot_pos = pos; - - /* compute and cache hash code now */ - _core_hash_cache = 13*_the_production.hashCode() + pos; - - /* cache the symbol after the dot */ - if (_dot_pos < _the_production.rhs_length()) - { - part = _the_production.rhs(_dot_pos); - if (!part.is_action()) - _symbol_after_dot = ((symbol_part)part).the_symbol(); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor for dot at start of right hand side. - * @param prod production this item uses. - */ - public lr_item_core(production prod) throws internal_error - { - this(prod,0); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The production for the item. */ - protected production _the_production; - - /** The production for the item. */ - public production the_production() {return _the_production;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The position of the "dot" -- this indicates the part of the production - * that the marker is before, so 0 indicates a dot at the beginning of - * the RHS. - */ - protected int _dot_pos; - - /** The position of the "dot" -- this indicates the part of the production - * that the marker is before, so 0 indicates a dot at the beginning of - * the RHS. - */ - public int dot_pos() {return _dot_pos;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Cache of the hash code. */ - protected int _core_hash_cache; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Cache of symbol after the dot. */ - protected symbol _symbol_after_dot = null; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Is the dot at the end of the production? */ - public boolean dot_at_end() - { - return _dot_pos >= _the_production.rhs_length(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Return the symbol after the dot. If there is no symbol after the dot - * we return null. */ - public symbol symbol_after_dot() - { - /* use the cached symbol */ - return _symbol_after_dot; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if we have a dot before a non terminal, and if so which one - * (return null or the non terminal). - */ - public non_terminal dot_before_nt() - { - symbol sym; - - /* get the symbol after the dot */ - sym = symbol_after_dot(); - - /* if it exists and is a non terminal, return it */ - if (sym != null && sym.is_non_term()) - return (non_terminal)sym; - else - return null; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a new lr_item_core that results from shifting the dot one - * position to the right. - */ - public lr_item_core shift_core() throws internal_error - { - if (dot_at_end()) - throw new internal_error( - "Attempt to shift past end of an lr_item_core"); - - return new lr_item_core(_the_production, _dot_pos+1); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison for the core only. This is separate out because we - * need separate access in a super class. - */ - public boolean core_equals(lr_item_core other) - { - return other != null && - _the_production.equals(other._the_production) && - _dot_pos == other._dot_pos; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(lr_item_core other) {return core_equals(other);} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof lr_item_core)) - return false; - else - return equals((lr_item_core)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Hash code for the core (separated so we keep non overridden version). */ - public int core_hashCode() - { - return _core_hash_cache; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Hash code for the item. */ - public int hashCode() - { - return _core_hash_cache; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Return the hash code that object would have provided for us so we have - * a (nearly) unique id for debugging. - */ - protected int obj_hash() - { - return super.hashCode(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string (separated out from toString() so we can call it - * from subclass that overrides toString()). - */ - public String to_simple_string() throws internal_error - { - String result; - production_part part; - - if (_the_production.lhs() != null && - _the_production.lhs().the_symbol() != null && - _the_production.lhs().the_symbol().name() != null) - result = _the_production.lhs().the_symbol().name(); - else - result = "$$NULL$$"; - - result += " ::= "; - - for (int i = 0; i<_the_production.rhs_length(); i++) - { - /* do we need the dot before this one? */ - if (i == _dot_pos) - result += "(*) "; - - /* print the name of the part */ - if (_the_production.rhs(i) == null) - { - result += "$$NULL$$ "; - } - else - { - part = _the_production.rhs(i); - if (part == null) - result += "$$NULL$$ "; - else if (part.is_action()) - result += "{ACTION} "; - else if (((symbol_part)part).the_symbol() != null && - ((symbol_part)part).the_symbol().name() != null) - result += ((symbol_part)part).the_symbol().name() + " "; - else - result += "$$NULL$$ "; - } - } - - /* put the dot after if needed */ - if (_dot_pos == _the_production.rhs_length()) - result += "(*) "; - - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string */ - public String toString() - { - /* can't throw here since super class doesn't, so we crash instead */ - try { - return to_simple_string(); - } catch(internal_error e) { - e.crash(); - return null; - } - } - - /*-----------------------------------------------------------*/ - -} - diff --git a/src/syntaxParser/java_cup/SAVE/non_terminal.java b/src/syntaxParser/java_cup/SAVE/non_terminal.java deleted file mode 100644 index 65c42e0..0000000 --- a/src/syntaxParser/java_cup/SAVE/non_terminal.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Hashtable; -import java.util.Enumeration; - -/** This class represents a non-terminal symbol in the grammar. Each - * non terminal has a textual name, an index, and a string which indicates - * the type of object it will be implemented with at runtime (i.e. the class - * of object that will be pushed on the parse stack to represent it). - */ - -public class non_terminal extends symbol { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param nm the name of the non terminal. - * @param tp the type string for the non terminal. - */ - public non_terminal(String nm, String tp) - { - /* super class does most of the work */ - super(nm, tp); - - /* add to set of all non terminals and check for duplicates */ - Object conflict = _all.put(nm,this); - if (conflict != null) - // can't throw an exception here because these are used in static - // initializers, so we crash instead - // was: - // throw new internal_error("Duplicate non-terminal ("+nm+") created"); - (new internal_error("Duplicate non-terminal ("+nm+") created")).crash(); - - /* assign a unique index */ - _index = next_index++; - - /* add to by_index set */ - _all_by_index.put(new Integer(_index), this); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with default type. - * @param nm the name of the non terminal. - */ - public non_terminal(String nm) - { - this(nm, null); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Table of all non-terminals -- elements are stored using name strings - * as the key - */ - protected static Hashtable _all = new Hashtable(); - - /** Access to all non-terminals. */ - public static Enumeration all() {return _all.elements();} - - /** lookup a non terminal by name string */ - public static non_terminal find(String with_name) - { - if (with_name == null) - return null; - else - return (non_terminal)_all.get(with_name); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Table of all non terminals indexed by their index number. */ - protected static Hashtable _all_by_index = new Hashtable(); - - /** Lookup a non terminal by index. */ - public static non_terminal find(int indx) - { - Integer the_indx = new Integer(indx); - - return (non_terminal)_all_by_index.get(the_indx); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Total number of non-terminals. */ - public static int number() {return _all.size();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Static counter to assign unique indexes. */ - protected static int next_index = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Static counter for creating unique non-terminal names */ - static protected int next_nt = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** special non-terminal for start symbol */ - public static final non_terminal START_nt = new non_terminal("$START"); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** flag non-terminals created to embed action productions */ - public boolean is_embedded_action = false; /* added 24-Mar-1998, CSA */ - - /*-----------------------------------------------------------*/ - /*--- Static Methods ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Method for creating a new uniquely named hidden non-terminal using - * the given string as a base for the name (or "NT$" if null is passed). - * @param prefix base name to construct unique name from. - */ - static non_terminal create_new(String prefix) throws internal_error - { - if (prefix == null) prefix = "NT$"; - return new non_terminal(prefix + next_nt++); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** static routine for creating a new uniquely named hidden non-terminal */ - static non_terminal create_new() throws internal_error - { - return create_new(null); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute nullability of all non-terminals. */ - public static void compute_nullability() throws internal_error - { - boolean change = true; - non_terminal nt; - Enumeration e; - production prod; - - /* repeat this process until there is no change */ - while (change) - { - /* look for a new change */ - change = false; - - /* consider each non-terminal */ - for (e=all(); e.hasMoreElements(); ) - { - nt = (non_terminal)e.nextElement(); - - /* only look at things that aren't already marked nullable */ - if (!nt.nullable()) - { - if (nt.looks_nullable()) - { - nt._nullable = true; - change = true; - } - } - } - } - - /* do one last pass over the productions to finalize all of them */ - for (e=production.all(); e.hasMoreElements(); ) - { - prod = (production)e.nextElement(); - prod.set_nullable(prod.check_nullable()); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute first sets for all non-terminals. This assumes nullability has - * already computed. - */ - public static void compute_first_sets() throws internal_error - { - boolean change = true; - Enumeration n; - Enumeration p; - non_terminal nt; - production prod; - terminal_set prod_first; - - /* repeat this process until we have no change */ - while (change) - { - /* look for a new change */ - change = false; - - /* consider each non-terminal */ - for (n = all(); n.hasMoreElements(); ) - { - nt = (non_terminal)n.nextElement(); - - /* consider every production of that non terminal */ - for (p = nt.productions(); p.hasMoreElements(); ) - { - prod = (production)p.nextElement(); - - /* get the updated first of that production */ - prod_first = prod.check_first_set(); - - /* if this going to add anything, add it */ - if (!prod_first.is_subset_of(nt._first_set)) - { - change = true; - nt._first_set.add(prod_first); - } - } - } - } - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** Table of all productions with this non terminal on the LHS. */ - protected Hashtable _productions = new Hashtable(11); - - /** Access to productions with this non terminal on the LHS. */ - public Enumeration productions() {return _productions.elements();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Total number of productions with this non terminal on the LHS. */ - public int num_productions() {return _productions.size();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add a production to our set of productions. */ - public void add_production(production prod) throws internal_error - { - /* catch improper productions */ - if (prod == null || prod.lhs() == null || prod.lhs().the_symbol() != this) - throw new internal_error( - "Attempt to add invalid production to non terminal production table"); - - /* add it to the table, keyed with itself */ - _productions.put(prod,prod); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Nullability of this non terminal. */ - protected boolean _nullable; - - /** Nullability of this non terminal. */ - public boolean nullable() {return _nullable;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** First set for this non-terminal. */ - protected terminal_set _first_set = new terminal_set(); - - /** First set for this non-terminal. */ - public terminal_set first_set() {return _first_set;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Indicate that this symbol is a non-terminal. */ - public boolean is_non_term() - { - return true; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Test to see if this non terminal currently looks nullable. */ - protected boolean looks_nullable() throws internal_error - { - /* look and see if any of the productions now look nullable */ - for (Enumeration e = productions(); e.hasMoreElements(); ) - /* if the production can go to empty, we are nullable */ - if (((production)e.nextElement()).check_nullable()) - return true; - - /* none of the productions can go to empty, so we are not nullable */ - return false; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** convert to string */ - public String toString() - { - return super.toString() + "[" + index() + "]" + (nullable() ? "*" : ""); - } - - /*-----------------------------------------------------------*/ -} diff --git a/src/syntaxParser/java_cup/SAVE/nonassoc_action.java b/src/syntaxParser/java_cup/SAVE/nonassoc_action.java deleted file mode 100644 index 28038d2..0000000 --- a/src/syntaxParser/java_cup/SAVE/nonassoc_action.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents a shift/reduce nonassociative error within the - * parse table. If action_table element is assign to type - * nonassoc_action, it cannot be changed, and signifies that there - * is a conflict between shifting and reducing a production and a - * terminal that shouldn't be next to each other. - */ -public class nonassoc_action extends parse_action { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. - */ - public nonassoc_action() throws internal_error - { - /* don't need to set anything, since it signifies error */ - } - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Quick access to type of action. */ - public int kind() {return NONASSOC;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality test. */ - public boolean equals(parse_action other) - { - return other != null && other.kind() == NONASSOC; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality test. */ - public boolean equals(Object other) - { - if (other instanceof parse_action) - return equals((parse_action)other); - else - return false; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute a hash code. */ - public int hashCode() - { - /* all objects of this class hash together */ - return 0xCafe321; - } - - - - /** Convert to string. */ - public String toString() - { - return "NONASSOC"; - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/parse_action.java b/src/syntaxParser/java_cup/SAVE/parse_action.java deleted file mode 100644 index 77ae441..0000000 --- a/src/syntaxParser/java_cup/SAVE/parse_action.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class serves as the base class for entries in a parse action table. - * Full entries will either be SHIFT(state_num), REDUCE(production), NONASSOC, - * or ERROR. Objects of this base class will default to ERROR, while - * the other three types will be represented by subclasses. - * - * @see java_cup.reduce_action - * @see java_cup.shift_action - */ - -public class parse_action { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. */ - public parse_action() - { - /* nothing to do in the base class */ - } - - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Constant for action type -- error action. */ - public static final int ERROR = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constant for action type -- shift action. */ - public static final int SHIFT = 1; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constants for action type -- reduce action. */ - public static final int REDUCE = 2; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constants for action type -- reduce action. */ - public static final int NONASSOC = 3; - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Quick access to the type -- base class defaults to error. */ - public int kind() {return ERROR;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality test. */ - public boolean equals(parse_action other) - { - /* we match all error actions */ - return other != null && other.kind() == ERROR; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality test. */ - public boolean equals(Object other) - { - if (other instanceof parse_action) - return equals((parse_action)other); - else - return false; - } - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute a hash code. */ - public int hashCode() - { - /* all objects of this class hash together */ - return 0xCafe123; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to string. */ - public String toString() {return "ERROR";} - - /*-----------------------------------------------------------*/ -} - diff --git a/src/syntaxParser/java_cup/SAVE/parse_action_row.java b/src/syntaxParser/java_cup/SAVE/parse_action_row.java deleted file mode 100644 index 8050a6a..0000000 --- a/src/syntaxParser/java_cup/SAVE/parse_action_row.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents one row (corresponding to one machine state) of the - * parse action table. - */ -public class parse_action_row { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. Note: this should not be used until the number of - * terminals in the grammar has been established. - */ - public parse_action_row() - { - /* make sure the size is set */ - if (_size <= 0 ) _size = terminal.number(); - - /* allocate the array */ - under_term = new parse_action[size()]; - - /* set each element to an error action */ - for (int i=0; i<_size; i++) - under_term[i] = new parse_action(); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Number of columns (terminals) in every row. */ - protected static int _size = 0; - - /** Number of columns (terminals) in every row. */ - public static int size() {return _size;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Table of reduction counts (reused by compute_default()). */ - protected static int reduction_count[] = null; - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** Actual action entries for the row. */ - public parse_action under_term[]; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Default (reduce) action for this row. -1 will represent default - * of error. - */ - public int default_reduce; - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Compute the default (reduce) action for this row and store it in - * default_reduce. In the case of non-zero default we will have the - * effect of replacing all errors by that reduction. This may cause - * us to do erroneous reduces, but will never cause us to shift past - * the point of the error and never cause an incorrect parse. -1 will - * be used to encode the fact that no reduction can be used as a - * default (in which case error will be used). - */ - public void compute_default() - { - int i, prod, max_prod, max_red; - - /* if we haven't allocated the count table, do so now */ - if (reduction_count == null) - reduction_count = new int[production.number()]; - - /* clear the reduction count table and maximums */ - for (i = 0; i < production.number(); i++) - reduction_count[i] = 0; - max_prod = -1; - max_red = 0; - - /* walk down the row and look at the reduces */ - for (i = 0; i < size(); i++) - if (under_term[i].kind() == parse_action.REDUCE) - { - /* count the reduce in the proper production slot and keep the - max up to date */ - prod = ((reduce_action)under_term[i]).reduce_with().index(); - reduction_count[prod]++; - if (reduction_count[prod] > max_red) - { - max_red = reduction_count[prod]; - max_prod = prod; - } - } - - /* record the max as the default (or -1 for not found) */ - default_reduce = max_prod; - } - - /*-----------------------------------------------------------*/ - -} - diff --git a/src/syntaxParser/java_cup/SAVE/parse_action_table.java b/src/syntaxParser/java_cup/SAVE/parse_action_table.java deleted file mode 100644 index 00eedfc..0000000 --- a/src/syntaxParser/java_cup/SAVE/parse_action_table.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Enumeration; - -/** This class represents the complete "action" table of the parser. - * It has one row for each state in the parse machine, and a column for - * each terminal symbol. Each entry in the table represents a shift, - * reduce, or an error. - * - * @see java_cup.parse_action - * @see java_cup.parse_action_row - */ -public class parse_action_table { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. All terminals, non-terminals, and productions must - * already have been entered, and the viable prefix recognizer should - * have been constructed before this is called. - */ - public parse_action_table() - { - /* determine how many states we are working with */ - _num_states = lalr_state.number(); - - /* allocate the array and fill it in with empty rows */ - under_state = new parse_action_row[_num_states]; - for (int i=0; i<_num_states; i++) - under_state[i] = new parse_action_row(); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** How many rows/states are in the machine/table. */ - protected int _num_states; - - /** How many rows/states are in the machine/table. */ - public int num_states() {return _num_states;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Actual array of rows, one per state. */ - public parse_action_row[] under_state; - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Check the table to ensure that all productions have been reduced. - * Issue a warning message (to System.err) for each production that - * is never reduced. - */ - public void check_reductions() - throws internal_error - { - parse_action act; - production prod; - - /* tabulate reductions -- look at every table entry */ - for (int row = 0; row < num_states(); row++) - { - for (int col = 0; col < under_state[row].size(); col++) - { - /* look at the action entry to see if its a reduce */ - act = under_state[row].under_term[col]; - if (act != null && act.kind() == parse_action.REDUCE) - { - /* tell production that we used it */ - ((reduce_action)act).reduce_with().note_reduction_use(); - } - } - } - - /* now go across every production and make sure we hit it */ - for (Enumeration p = production.all(); p.hasMoreElements(); ) - { - prod = (production)p.nextElement(); - - /* if we didn't hit it give a warning */ - if (prod.num_reductions() == 0) - { - /* count it * - emit.not_reduced++; - - /* give a warning if they haven't been turned off */ - if (!emit.nowarn) - { - System.err.println("*** Production \"" + - prod.to_simple_string() + "\" never reduced"); - lexer.warning_count++; - } - } - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* - - /** Convert to a string. */ - public String toString() - { - String result; - int cnt; - - result = "-------- ACTION_TABLE --------\n"; - for (int row = 0; row < num_states(); row++) - { - result += "From state #" + row + "\n"; - cnt = 0; - for (int col = 0; col < under_state[row].size(); col++) - { - /* if the action is not an error print it */ - if (under_state[row].under_term[col].kind() != parse_action.ERROR) - { - result += " [term " + col + ":" + under_state[row].under_term[col] + "]"; - - /* end the line after the 2nd one */ - cnt++; - if (cnt == 2) - { - result += "\n"; - cnt = 0; - } - } - } - /* finish the line if we haven't just done that */ - if (cnt != 0) result += "\n"; - } - result += "------------------------------"; - - return result; - } - - /*-----------------------------------------------------------*/ - -} - diff --git a/src/syntaxParser/java_cup/SAVE/parse_reduce_row.java b/src/syntaxParser/java_cup/SAVE/parse_reduce_row.java deleted file mode 100644 index 009bf7e..0000000 --- a/src/syntaxParser/java_cup/SAVE/parse_reduce_row.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents one row (corresponding to one machine state) of the - * reduce-goto parse table. - */ -public class parse_reduce_row { - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. Note: this should not be used until the number - * of terminals in the grammar has been established. - */ - public parse_reduce_row() - { - /* make sure the size is set */ - if (_size <= 0 ) _size = non_terminal.number(); - - /* allocate the array */ - under_non_term = new lalr_state[size()]; - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Number of columns (non terminals) in every row. */ - protected static int _size = 0; - - /** Number of columns (non terminals) in every row. */ - public static int size() {return _size;} - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** Actual entries for the row. */ - public lalr_state under_non_term[]; -} - diff --git a/src/syntaxParser/java_cup/SAVE/parse_reduce_table.java b/src/syntaxParser/java_cup/SAVE/parse_reduce_table.java deleted file mode 100644 index 0d93011..0000000 --- a/src/syntaxParser/java_cup/SAVE/parse_reduce_table.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Enumeration; - -/** This class represents the complete "reduce-goto" table of the parser. - * It has one row for each state in the parse machines, and a column for - * each terminal symbol. Each entry contains a state number to shift to - * as the last step of a reduce. - * - * @see java_cup.parse_reduce_row - */ -public class parse_reduce_table { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. Note: all terminals, non-terminals, and productions - * must already have been entered, and the viable prefix recognizer should - * have been constructed before this is called. - */ - public parse_reduce_table() - { - /* determine how many states we are working with */ - _num_states = lalr_state.number(); - - /* allocate the array and fill it in with empty rows */ - under_state = new parse_reduce_row[_num_states]; - for (int i=0; i<_num_states; i++) - under_state[i] = new parse_reduce_row(); - } - - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** How many rows/states in the machine/table. */ - protected int _num_states; - - /** How many rows/states in the machine/table. */ - public int num_states() {return _num_states;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Actual array of rows, one per state */ - public parse_reduce_row[] under_state; - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Convert to a string. */ - public String toString() - { - String result; - lalr_state goto_st; - int cnt; - - result = "-------- REDUCE_TABLE --------\n"; - for (int row = 0; row < num_states(); row++) - { - result += "From state #" + row + "\n"; - cnt = 0; - for (int col = 0; col < under_state[row].size(); col++) - { - /* pull out the table entry */ - goto_st = under_state[row].under_non_term[col]; - - /* if it has action in it, print it */ - if (goto_st != null) - { - result += " [non term " + col + "->"; - result += "state " + goto_st.index() + "]"; - - /* end the line after the 3rd one */ - cnt++; - if (cnt == 3) - { - result += "\n"; - cnt = 0; - } - } - } - /* finish the line if we haven't just done that */ - if (cnt != 0) result += "\n"; - } - result += "-----------------------------"; - - return result; - } - - /*-----------------------------------------------------------*/ - -} - diff --git a/src/syntaxParser/java_cup/SAVE/parser.cup b/src/syntaxParser/java_cup/SAVE/parser.cup deleted file mode 100644 index 8af0d05..0000000 --- a/src/syntaxParser/java_cup/SAVE/parser.cup +++ /dev/null @@ -1,863 +0,0 @@ - -/*================================================================*/ -/* - JavaCup Specification for the JavaCup Specification Language - by Scott Hudson, GVU Center, Georgia Tech, August 1995 - and Frank Flannery, Department of Computer Science, Princeton Univ, - July 1996 - Bug Fixes: C. Scott Ananian, Dept of Electrical Engineering, Princeton - University, October 1996. [later Massachusetts Institute of Technology] - - - This JavaCup specification is used to implement JavaCup itself. - It specifies the parser for the JavaCup specification language. - (It also serves as a reasonable example of what a typical JavaCup - spec looks like). - - The specification has the following parts: - Package and import declarations - These serve the same purpose as in a normal Java source file - (and will appear in the generated code for the parser). In this - case we are part of the java_cup package and we import both the - java_cup runtime system and Hashtable from the standard Java - utilities package. - - Action code - This section provides code that is included with the class encapsulating - the various pieces of user code embedded in the grammar (i.e., the - semantic actions). This provides a series of helper routines and - data structures that the semantic actions use. - - Parser code - This section provides code included in the parser class itself. In - this case we override the default error reporting routines. - - Init with and scan with - These sections provide small bits of code that initialize, then - indicate how to invoke the scanner. - - Symbols and grammar - These sections declare all the terminal and non terminal symbols - and the types of objects that they will be represented by at runtime, - then indicate the start symbol of the grammar (), and finally provide - the grammar itself (with embedded actions). - - Operation of the parser - The parser acts primarily by accumulating data structures representing - various parts of the specification. Various small parts (e.g., single - code strings) are stored as static variables of the emit class and - in a few cases as variables declared in the action code section. - Terminals, non terminals, and productions, are maintained as collection - accessible via static methods of those classes. In addition, two - symbol tables are kept: - symbols maintains the name to object mapping for all symbols - non_terms maintains a separate mapping containing only the non terms - - Several intermediate working structures are also declared in the action - code section. These include: rhs_parts, rhs_pos, and lhs_nt which - build up parts of the current production while it is being parsed. - - Author(s) - Scott Hudson, GVU Center, Georgia Tech. - Frank Flannery, Department of Computer Science, Princeton Univ. - C. Scott Ananian, Department of Electrical Engineering, Princeton Univ. - - Revisions - v0.9a First released version [SEH] 8/29/95 - v0.9b Updated for beta language (throws clauses) [SEH] 11/25/95 - v0.10a Made many improvements/changes. now offers: - return value - left/right positions and propagations - cleaner label references - precedence and associativity for terminals - contextual precedence for productions - [FF] 7/3/96 - v0.10b Fixed %prec directive so it works like it's supposed to. - [CSA] 10/10/96 - v0.10g Added support for array types on symbols. - [CSA] 03/23/98 - v0.10i Broaden set of IDs allowed in multipart_id and label_id so - that only java reserved words (and not CUP reserved words like - 'parser' and 'start') are prohibited. Allow reordering of - action code, parser code, init code, and scan with sections, - and made closing semicolon optional for these sections. - Added 'nonterminal' as a terminal symbol, finally fixing a - spelling mistake that's been around since the beginning. - For backwards compatibility, you can still misspell the - word if you like. -*/ -/*================================================================*/ - -package java_cup; -import java_cup.runtime.*; -import java.util.Hashtable; - -/*----------------------------------------------------------------*/ - -action code {: - /** helper routine to clone a new production part adding a given label */ - protected production_part add_lab(production_part part, String lab) - throws internal_error - { - /* if there is no label, or this is an action, just return the original */ - if (lab == null || part.is_action()) return part; - - /* otherwise build a new one with the given label attached */ - return new symbol_part(((symbol_part)part).the_symbol(),lab); - } - - /** max size of right hand side we will support */ - protected final int MAX_RHS = 200; - - /** array for accumulating right hand side parts */ - protected production_part[] rhs_parts = new production_part[MAX_RHS]; - - /** where we are currently in building a right hand side */ - protected int rhs_pos = 0; - - /** start a new right hand side */ - protected void new_rhs() {rhs_pos = 0; } - - /** add a new right hand side part */ - protected void add_rhs_part(production_part part) throws java.lang.Exception - { - if (rhs_pos >= MAX_RHS) - throw new Exception("Internal Error: Productions limited to " + - MAX_RHS + " symbols and actions"); - - rhs_parts[rhs_pos] = part; - rhs_pos++; - } - - /** string to build up multiple part names */ - protected String multipart_name = new String(); - - /** append a new name segment to the accumulated multipart name */ - protected void append_multipart(String name) - { - String dot = ""; - - /* if we aren't just starting out, put on a dot */ - if (multipart_name.length() != 0) dot = "."; - - multipart_name = multipart_name.concat(dot + name); - } - - /** table of declared symbols -- contains production parts indexed by name */ - protected Hashtable symbols = new Hashtable(); - - /** table of just non terminals -- contains non_terminals indexed by name */ - protected Hashtable non_terms = new Hashtable(); - - /** declared start non_terminal */ - protected non_terminal start_nt = null; - - /** left hand side non terminal of the current production */ - protected non_terminal lhs_nt; - - /** Current precedence number */ - int _cur_prec = 0; - - /** Current precedence side */ - int _cur_side = assoc.no_prec; - - /** update the precedences we are declaring */ - protected void update_precedence(int p) { - _cur_side = p; - _cur_prec++; - } - /** add relevant data to terminals */ - protected void add_precedence(String term) { - if (term == null) { - System.err.println("Unable to add precedence to nonexistent terminal"); - } else { - symbol_part sp = (symbol_part)symbols.get(term); - if (sp == null) { - System.err.println("Could find terminal " + term + " while declaring precedence"); - } else { - java_cup.symbol sym = sp.the_symbol(); - if (sym instanceof terminal) - ((terminal)sym).set_precedence(_cur_side, _cur_prec); - else System.err.println("Precedence declaration: Can't find terminal " + term); - } - } - } -:}; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -parser code {: - - /* override error routines */ - - public void report_fatal_error( - String message, - Object info) - { - done_parsing(); - lexer.emit_error(message); - System.err.println("Can't recover from previous error(s), giving up."); - System.exit(1); - } - - public void report_error(String message, Object info) - { - lexer.emit_error(message); - } -:}; - -/*----------------------------------------------------------------*/ - -init with {: lexer.init(); :}; -scan with {: return lexer.next_token(); :}; - -/*----------------------------------------------------------------*/ - -terminal - PACKAGE, IMPORT, CODE, ACTION, PARSER, TERMINAL, NON, INIT, SCAN, WITH, - START, SEMI, COMMA, STAR, DOT, COLON, COLON_COLON_EQUALS, BAR, PRECEDENCE, - LEFT, RIGHT, NONASSOC, PERCENT_PREC, LBRACK, RBRACK, NONTERMINAL; - -terminal String ID, CODE_STRING; - -non terminal - spec, package_spec, import_list, action_code_part, - code_parts, code_part, opt_semi, non_terminal, - parser_code_part, symbol_list, start_spec, production_list, - multipart_id, import_spec, import_id, init_code, scan_code, symbol, - type_id, term_name_list, non_term_name_list, production, prod_part_list, - prod_part, new_term_id, new_non_term_id, rhs_list, rhs, empty, - precedence_list, preced, terminal_list, precedence_l, declares_term, - declares_non_term; - -non terminal String nt_id, symbol_id, label_id, opt_label, terminal_id, - term_id, robust_id; - -/*----------------------------------------------------------------*/ - -start with spec; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -spec ::= - {: - /* declare "error" as a terminal */ - symbols.put("error", new symbol_part(terminal.error)); - - /* declare start non terminal */ - non_terms.put("$START", non_terminal.START_nt); - :} - package_spec - import_list - code_parts - symbol_list - precedence_list - start_spec - production_list - | - /* error recovery assuming something went wrong before symbols - and we have TERMINAL or NON TERMINAL to sync on. if we get - an error after that, we recover inside symbol_list or - production_list - */ - error - symbol_list - precedence_list - start_spec - production_list - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -package_spec ::= - PACKAGE - multipart_id - {: - /* save the package name */ - emit.package_name = multipart_name; - - /* reset the accumulated multipart name */ - multipart_name = new String(); - :} - SEMI - | - empty - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -import_list ::= - import_list - import_spec - | - empty - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -import_spec ::= - IMPORT - import_id - {: - /* save this import on the imports list */ - emit.import_list.push(multipart_name); - - /* reset the accumulated multipart name */ - multipart_name = new String(); - :} - SEMI - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -// allow any order; all parts are optional. [CSA, 23-Jul-1999] -// (we check in the part action to make sure we don't have 2 of any part) -code_part ::= - action_code_part | parser_code_part | init_code | scan_code ; -code_parts ::= - | code_parts code_part; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -action_code_part ::= - ACTION CODE CODE_STRING:user_code opt_semi - {: - if (emit.action_code!=null) - lexer.emit_error("Redundant action code (skipping)"); - else /* save the user included code string */ - emit.action_code = user_code; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -parser_code_part ::= - PARSER CODE CODE_STRING:user_code opt_semi - {: - if (emit.parser_code!=null) - lexer.emit_error("Redundant parser code (skipping)"); - else /* save the user included code string */ - emit.parser_code = user_code; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -init_code ::= - INIT WITH CODE_STRING:user_code opt_semi - {: - if (emit.init_code!=null) - lexer.emit_error("Redundant init code (skipping)"); - else /* save the user code */ - emit.init_code = user_code; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -scan_code ::= - SCAN WITH CODE_STRING:user_code opt_semi - {: - if (emit.scan_code!=null) - lexer.emit_error("Redundant scan code (skipping)"); - else /* save the user code */ - emit.scan_code = user_code; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -symbol_list ::= symbol_list symbol | symbol; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -symbol ::= - TERMINAL - type_id - declares_term - | - TERMINAL - declares_term - | - non_terminal - type_id - declares_non_term - | - non_terminal - declares_non_term - | - /* error recovery productions -- sync on semicolon */ - - TERMINAL - error - {: - /* reset the accumulated multipart name */ - multipart_name = new String(); - :} - SEMI - | - non_terminal - error - {: - /* reset the accumulated multipart name */ - multipart_name = new String(); - :} - SEMI - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -declares_term ::= - term_name_list - {: - /* reset the accumulated multipart name */ - multipart_name = new String(); - :} - SEMI - ; -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -declares_non_term ::= - non_term_name_list - {: - /* reset the accumulated multipart name */ - multipart_name = new String(); - :} - SEMI - ; -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -term_name_list ::= term_name_list COMMA new_term_id | new_term_id; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -non_term_name_list ::= - non_term_name_list - COMMA - new_non_term_id - | - new_non_term_id - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - - -precedence_list ::= precedence_l | empty; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -precedence_l ::= precedence_l preced | preced; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -preced ::= - PRECEDENCE LEFT - {: - update_precedence(assoc.left); - :} - terminal_list SEMI - | - PRECEDENCE RIGHT - {: - update_precedence(assoc.right); - :} - terminal_list SEMI - | - PRECEDENCE NONASSOC - {: - update_precedence(assoc.nonassoc); - :} - terminal_list SEMI - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -terminal_list ::= terminal_list COMMA terminal_id - | - terminal_id - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -terminal_id ::= term_id:sym - {: - add_precedence(sym); - RESULT = sym; - :}; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -term_id ::= symbol_id:sym - {: - /* check that the symbol_id is a terminal */ - if (symbols.get(sym) == null) - { - /* issue a message */ - lexer.emit_error("Terminal \"" + sym + - "\" has not been declared"); - } - RESULT = sym; - :}; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -start_spec ::= - START WITH nt_id:start_name - {: - /* verify that the name has been declared as a non terminal */ - non_terminal nt = (non_terminal)non_terms.get(start_name); - if (nt == null) - { - lexer.emit_error( "Start non terminal \"" + start_name + - "\" has not been declared"); - } - else - { - /* remember the non-terminal for later */ - start_nt = nt; - - /* build a special start production */ - new_rhs(); - add_rhs_part(add_lab(new symbol_part(start_nt), "start_val")); - add_rhs_part(new symbol_part(terminal.EOF)); - add_rhs_part(new action_part("RESULT = start_val;")); - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, rhs_pos); - new_rhs(); - } - :} - SEMI - | - empty - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -production_list ::= production_list production | production; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -production ::= - nt_id:lhs_id - {: - /* lookup the lhs nt */ - lhs_nt = (non_terminal)non_terms.get(lhs_id); - - /* if it wasn't declared, emit a message */ - if (lhs_nt == null) - { - if (lexer.error_count == 0) - lexer.emit_error("LHS non terminal \"" + lhs_id + - "\" has not been declared"); - } - - /* reset the rhs accumulation */ - new_rhs(); - :} - COLON_COLON_EQUALS - {: :} - rhs_list - SEMI - | - error - {: lexer.emit_error("Syntax Error"); :} - SEMI - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -rhs_list ::= rhs_list BAR rhs | rhs; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -rhs ::= - prod_part_list PERCENT_PREC term_id:term_name - {: - java_cup.symbol sym = null; - if (lhs_nt != null) - { - /* Find the precedence symbol */ - if (term_name == null) { - System.err.println("No terminal for contextual precedence"); - sym = null; - } else { - sym = ((symbol_part)symbols.get(term_name)).the_symbol(); - } - /* build the production */ - production p; - if ((sym!=null) && (sym instanceof terminal)) { - p = new production(lhs_nt, rhs_parts, rhs_pos, - ((terminal)sym).precedence_num(), - ((terminal)sym).precedence_side()); - ((symbol_part)symbols.get(term_name)).the_symbol().note_use(); - } else { - System.err.println("Invalid terminal " + term_name + - " for contextual precedence assignment"); - p = new production(lhs_nt, rhs_parts, rhs_pos); - } - - /* if we have no start non-terminal declared and this is - the first production, make its lhs nt the start_nt - and build a special start production for it. */ - if (start_nt == null) - { - start_nt = lhs_nt; - - /* build a special start production */ - new_rhs(); - add_rhs_part(add_lab(new symbol_part(start_nt),"start_val")); - add_rhs_part(new symbol_part(terminal.EOF)); - add_rhs_part(new action_part("RESULT = start_val;")); - if ((sym!=null) && (sym instanceof terminal)) { - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, - rhs_pos, ((terminal)sym).precedence_num(), - ((terminal)sym).precedence_side()); - } else { - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, rhs_pos); - } - new_rhs(); - } - } - - /* reset the rhs accumulation in any case */ - new_rhs(); - :} - | - prod_part_list - {: - if (lhs_nt != null) - { - /* build the production */ - production p = new production(lhs_nt, rhs_parts, rhs_pos); - - /* if we have no start non-terminal declared and this is - the first production, make its lhs nt the start_nt - and build a special start production for it. */ - if (start_nt == null) - { - start_nt = lhs_nt; - - /* build a special start production */ - new_rhs(); - add_rhs_part(add_lab(new symbol_part(start_nt),"start_val")); - add_rhs_part(new symbol_part(terminal.EOF)); - add_rhs_part(new action_part("RESULT = start_val;")); - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, rhs_pos); - - new_rhs(); - } - } - - /* reset the rhs accumulation in any case */ - new_rhs(); - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -prod_part_list ::= prod_part_list prod_part | empty; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -prod_part ::= - symbol_id:symid opt_label:labid - {: - /* try to look up the id */ - production_part symb = (production_part)symbols.get(symid); - - /* if that fails, symbol is undeclared */ - if (symb == null) - { - if (lexer.error_count == 0) - lexer.emit_error("java_cup.runtime.Symbol \"" + symid + - "\" has not been declared"); - } - else - { - /* add a labeled production part */ - add_rhs_part(add_lab(symb, labid)); - } - :} - | - CODE_STRING:code_str - {: - /* add a new production part */ - add_rhs_part(new action_part(code_str)); - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -opt_label ::= - COLON label_id:labid - {: RESULT = labid; :} - | - empty - {: RESULT = null; :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -multipart_id ::= - multipart_id DOT robust_id:another_id - {: append_multipart(another_id); :} - | - robust_id:an_id - {: append_multipart(an_id); :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -import_id ::= - multipart_id DOT STAR - {: append_multipart("*"); :} - | - multipart_id - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -type_id ::= multipart_id - | type_id LBRACK RBRACK - {: multipart_name = multipart_name.concat("[]"); :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -new_term_id ::= - ID:term_id - {: - /* see if this terminal has been declared before */ - if (symbols.get(term_id) != null) - { - /* issue a message */ - lexer.emit_error("java_cup.runtime.Symbol \"" + term_id + - "\" has already been declared"); - } - else - { - /* if no type declared, declare one */ - if (multipart_name.equals("")) { - append_multipart("Object"); - } - /* build a production_part and put it in the table */ - symbols.put(term_id, - new symbol_part(new terminal(term_id, multipart_name))); - } - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -new_non_term_id ::= - ID:non_term_id - {: - /* see if this non terminal has been declared before */ - if (symbols.get(non_term_id) != null) - { - /* issue a message */ - lexer.emit_error( "java_cup.runtime.Symbol \"" + non_term_id + - "\" has already been declared"); - } - else - { - if (multipart_name.equals("")) { - append_multipart("Object"); - } - /* build the non terminal object */ - non_terminal this_nt = - new non_terminal(non_term_id, multipart_name); - - /* put it in the non_terms table */ - non_terms.put(non_term_id, this_nt); - - /* build a production_part and put it in the symbols table */ - symbols.put(non_term_id, new symbol_part(this_nt)); - } - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -nt_id ::= - ID:the_id - {: RESULT = the_id; :} - | error - {: - lexer.emit_error("Illegal use of reserved word"); - RESULT="ILLEGAL"; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -symbol_id ::= - ID:the_id - {: RESULT = the_id; :} - | error - {: - lexer.emit_error("Illegal use of reserved word"); - RESULT="ILLEGAL"; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -label_id ::= - robust_id:the_id - {: RESULT = the_id; :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -robust_id ::= /* all ids that aren't reserved words in Java */ - ID:the_id {: RESULT = the_id; :} - /* package is reserved. */ - /* import is reserved. */ - | CODE {: RESULT = "code"; :} - | ACTION {: RESULT = "action"; :} - | PARSER {: RESULT = "parser"; :} - | TERMINAL {: RESULT = "terminal"; :} - | NON {: RESULT = "non"; :} - | NONTERMINAL {: RESULT = "nonterminal"; :} - | INIT {: RESULT = "init"; :} - | SCAN {: RESULT = "scan"; :} - | WITH {: RESULT = "with"; :} - | START {: RESULT = "start"; :} - | PRECEDENCE {: RESULT = "precedence"; :} - | LEFT {: RESULT = "left"; :} - | RIGHT {: RESULT = "right"; :} - | NONASSOC {: RESULT = "nonassoc"; :} - | error - {: - lexer.emit_error("Illegal use of reserved word"); - RESULT="ILLEGAL"; - :} - ; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -non_terminal ::= NON TERMINAL | NONTERMINAL; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -opt_semi ::= /* nothing */ - | SEMI; - -/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ - -empty ::= /* nothing */; - -/*----------------------------------------------------------------*/ - - - - - - - - - diff --git a/src/syntaxParser/java_cup/SAVE/parser.java b/src/syntaxParser/java_cup/SAVE/parser.java deleted file mode 100644 index f8c0539..0000000 --- a/src/syntaxParser/java_cup/SAVE/parser.java +++ /dev/null @@ -1,1869 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -//---------------------------------------------------- -// The following code was generated by CUP v0.10k -// Sun Jul 25 13:35:26 EDT 1999 -//---------------------------------------------------- - -package java_cup; - -import java_cup.runtime.*; -import java.util.Hashtable; - -/** CUP v0.10k generated parser. - */ -public class parser extends java_cup.runtime.lr_parser { - - /** Default constructor. */ - public parser() {super();} - - /** Constructor which sets the default scanner. */ - public parser(java_cup.runtime.Scanner s) {super(s);} - - /** Production table. */ - protected static final short _production_table[][] = - unpackFromStrings(new String[] { - "\000\153\000\002\002\004\000\002\055\002\000\002\003" + - "\012\000\002\003\007\000\002\056\002\000\002\004\006" + - "\000\002\004\003\000\002\005\004\000\002\005\003\000" + - "\002\057\002\000\002\020\006\000\002\010\003\000\002" + - "\010\003\000\002\010\003\000\002\010\003\000\002\007" + - "\002\000\002\007\004\000\002\006\006\000\002\013\006" + - "\000\002\022\006\000\002\023\006\000\002\014\004\000" + - "\002\014\003\000\002\024\005\000\002\024\004\000\002" + - "\024\005\000\002\024\004\000\002\060\002\000\002\024" + - "\006\000\002\061\002\000\002\024\006\000\002\062\002" + - "\000\002\044\005\000\002\063\002\000\002\045\005\000" + - "\002\026\005\000\002\026\003\000\002\027\005\000\002" + - "\027\003\000\002\040\003\000\002\040\003\000\002\043" + - "\004\000\002\043\003\000\002\064\002\000\002\041\007" + - "\000\002\065\002\000\002\041\007\000\002\066\002\000" + - "\002\041\007\000\002\042\005\000\002\042\003\000\002" + - "\052\003\000\002\053\003\000\002\067\002\000\002\015" + - "\007\000\002\015\003\000\002\016\004\000\002\016\003" + - "\000\002\070\002\000\002\071\002\000\002\030\010\000" + - "\002\072\002\000\002\030\005\000\002\035\005\000\002" + - "\035\003\000\002\036\005\000\002\036\003\000\002\031" + - "\004\000\002\031\003\000\002\032\004\000\002\032\003" + - "\000\002\051\004\000\002\051\003\000\002\017\005\000" + - "\002\017\003\000\002\021\005\000\002\021\003\000\002" + - "\025\003\000\002\025\005\000\002\033\003\000\002\034" + - "\003\000\002\046\003\000\002\046\003\000\002\047\003" + - "\000\002\047\003\000\002\050\003\000\002\054\003\000" + - "\002\054\003\000\002\054\003\000\002\054\003\000\002" + - "\054\003\000\002\054\003\000\002\054\003\000\002\054" + - "\003\000\002\054\003\000\002\054\003\000\002\054\003" + - "\000\002\054\003\000\002\054\003\000\002\054\003\000" + - "\002\054\003\000\002\054\003\000\002\012\004\000\002" + - "\012\003\000\002\011\002\000\002\011\003\000\002\037" + - "\002" }); - - /** Access to production table. */ - public short[][] production_table() {return _production_table;} - - /** Parse-action table. */ - protected static final short[][] _action_table = - unpackFromStrings(new String[] { - "\000\247\000\026\003\006\004\000\005\000\007\000\010" + - "\000\011\000\012\000\013\000\014\000\035\000\001\002" + - "\000\004\002\251\001\002\000\024\004\200\005\uff97\007" + - "\uff97\010\uff97\011\uff97\012\uff97\013\uff97\014\uff97\035\uff97" + - "\001\002\000\010\011\007\012\012\035\014\001\002\000" + - "\042\003\163\006\026\007\027\010\040\011\036\012\022" + - "\013\042\014\030\015\017\016\015\026\033\027\023\030" + - "\035\031\041\035\025\036\160\001\002\000\020\003\uffeb" + - "\011\uffeb\012\uffeb\016\uffeb\026\uffeb\035\uffeb\036\uffeb\001" + - "\002\000\020\003\uff97\011\007\012\012\016\uff97\026\065" + - "\035\014\036\uff97\001\002\000\004\011\061\001\002\000" + - "\042\003\034\006\026\007\027\010\040\011\036\012\022" + - "\013\042\014\030\015\017\016\015\026\033\027\023\030" + - "\035\031\041\035\025\036\016\001\002\000\042\003\uff9a" + - "\006\uff9a\007\uff9a\010\uff9a\011\uff9a\012\uff9a\013\uff9a\014" + - "\uff9a\015\uff9a\016\uff9a\026\uff9a\027\uff9a\030\uff9a\031\uff9a" + - "\035\uff9a\036\uff9a\001\002\000\022\003\uffa1\017\uffa1\022" + - "\uffa1\025\uffa1\032\uffa1\033\uffa1\036\uffa1\037\uffa1\001\002" + - "\000\014\017\uffb1\020\uffb1\022\uffab\033\uffab\036\uffab\001" + - "\002\000\022\003\uffa2\017\uffa2\022\uffa2\025\uffa2\032\uffa2" + - "\033\uffa2\036\uffa2\037\uffa2\001\002\000\006\017\uffe0\020" + - "\055\001\002\000\010\022\051\033\uffb4\036\uffb4\001\002" + - "\000\022\003\uffa6\017\uffa6\022\uffa6\025\uffa6\032\uffa6\033" + - "\uffa6\036\uffa6\037\uffa6\001\002\000\022\003\uff9f\017\uff9f" + - "\022\uff9f\025\uff9f\032\uff9f\033\uff9f\036\uff9f\037\uff9f\001" + - "\002\000\006\033\047\036\045\001\002\000\022\003\uffa5" + - "\017\uffa5\022\uffa5\025\uffa5\032\uffa5\033\uffa5\036\uffa5\037" + - "\uffa5\001\002\000\022\003\uffaa\017\uffaa\022\uffaa\025\uffaa" + - "\032\uffaa\033\uffaa\036\uffaa\037\uffaa\001\002\000\022\003" + - "\uffa9\017\uffa9\022\uffa9\025\uffa9\032\uffa9\033\uffa9\036\uffa9" + - "\037\uffa9\001\002\000\022\003\uffa3\017\uffa3\022\uffa3\025" + - "\uffa3\032\uffa3\033\uffa3\036\uffa3\037\uffa3\001\002\000\012" + - "\017\uffb7\022\uffb7\033\uffb7\036\uffb7\001\002\000\020\003" + - "\uffe7\011\uffe7\012\uffe7\016\uffe7\026\uffe7\035\uffe7\036\uffe7" + - "\001\002\000\022\003\uffa0\017\uffa0\022\uffa0\025\uffa0\032" + - "\uffa0\033\uffa0\036\uffa0\037\uffa0\001\002\000\012\017\uffe4" + - "\022\uff9c\033\uff9c\036\uff9c\001\002\000\022\003\uff9e\017" + - "\uff9e\022\uff9e\025\uff9e\032\uff9e\033\uff9e\036\uff9e\037\uff9e" + - "\001\002\000\022\003\uffa7\017\uffa7\022\uffa7\025\uffa7\032" + - "\uffa7\033\uffa7\036\uffa7\037\uffa7\001\002\000\006\017\uffdb" + - "\020\uffdb\001\002\000\022\003\uffa8\017\uffa8\022\uffa8\025" + - "\uffa8\032\uffa8\033\uffa8\036\uffa8\037\uffa8\001\002\000\022" + - "\003\uff9d\017\uff9d\022\uff9d\025\uff9d\032\uff9d\033\uff9d\036" + - "\uff9d\037\uff9d\001\002\000\022\003\uffa4\017\uffa4\022\uffa4" + - "\025\uffa4\032\uffa4\033\uffa4\036\uffa4\037\uffa4\001\002\000" + - "\004\017\044\001\002\000\020\003\uffe3\011\uffe3\012\uffe3" + - "\016\uffe3\026\uffe3\035\uffe3\036\uffe3\001\002\000\006\017" + - "\uffb1\020\uffb1\001\002\000\020\003\uffe8\011\uffe8\012\uffe8" + - "\016\uffe8\026\uffe8\035\uffe8\036\uffe8\001\002\000\004\034" + - "\050\001\002\000\006\033\uffb3\036\uffb3\001\002\000\042" + - "\003\054\006\026\007\027\010\040\011\036\012\022\013" + - "\042\014\030\015\017\016\015\026\033\027\023\030\035" + - "\031\041\035\025\036\053\001\002\000\012\017\uffb8\022" + - "\uffb8\033\uffb8\036\uffb8\001\002\000\022\003\uffab\017\uffab" + - "\022\uffab\025\uffab\032\uffab\033\uffab\036\uffab\037\uffab\001" + - "\002\000\022\003\uff9c\017\uff9c\022\uff9c\025\uff9c\032\uff9c" + - "\033\uff9c\036\uff9c\037\uff9c\001\002\000\004\036\045\001" + - "\002\000\004\017\057\001\002\000\020\003\uffdf\011\uffdf" + - "\012\uffdf\016\uffdf\026\uffdf\035\uffdf\036\uffdf\001\002\000" + - "\006\017\uffdc\020\uffdc\001\002\000\042\003\uff9b\006\uff9b" + - "\007\uff9b\010\uff9b\011\uff9b\012\uff9b\013\uff9b\014\uff9b\015" + - "\uff9b\016\uff9b\026\uff9b\027\uff9b\030\uff9b\031\uff9b\035\uff9b" + - "\036\uff9b\001\002\000\010\003\uff97\016\116\036\uff97\001" + - "\002\000\012\003\uffda\016\uffda\026\065\036\uffda\001\002" + - "\000\010\003\uffd9\016\uffd9\036\uffd9\001\002\000\010\027" + - "\071\030\072\031\070\001\002\000\020\003\uffec\011\uffec" + - "\012\uffec\016\uffec\026\uffec\035\uffec\036\uffec\001\002\000" + - "\012\003\uffd7\016\uffd7\026\uffd7\036\uffd7\001\002\000\006" + - "\003\uffd2\036\uffd2\001\002\000\006\003\uffd6\036\uffd6\001" + - "\002\000\006\003\uffd4\036\uffd4\001\002\000\006\003\077" + - "\036\074\001\002\000\022\003\uffae\017\uffae\020\uffae\023" + - "\uffae\025\uffae\032\uffae\036\uffae\037\uffae\001\002\000\010" + - "\017\uffcd\020\uffcd\025\uffcd\001\002\000\006\017\uffce\020" + - "\uffce\001\002\000\022\003\uffad\017\uffad\020\uffad\023\uffad" + - "\025\uffad\032\uffad\036\uffad\037\uffad\001\002\000\006\017" + - "\102\020\103\001\002\000\006\017\uffcf\020\uffcf\001\002" + - "\000\012\003\uffd3\016\uffd3\026\uffd3\036\uffd3\001\002\000" + - "\006\003\077\036\074\001\002\000\006\017\uffd0\020\uffd0" + - "\001\002\000\006\003\077\036\074\001\002\000\006\017" + - "\107\020\103\001\002\000\012\003\uffd5\016\uffd5\026\uffd5" + - "\036\uffd5\001\002\000\006\003\077\036\074\001\002\000" + - "\006\017\112\020\103\001\002\000\012\003\uffd1\016\uffd1" + - "\026\uffd1\036\uffd1\001\002\000\012\003\uffd8\016\uffd8\026" + - "\uffd8\036\uffd8\001\002\000\006\003\uffca\036\uffca\001\002" + - "\000\006\003\126\036\120\001\002\000\004\015\117\001" + - "\002\000\006\003\122\036\120\001\002\000\006\017\uffb0" + - "\024\uffb0\001\002\000\004\017\uffcc\001\002\000\004\017" + - "\uffaf\001\002\000\004\017\124\001\002\000\006\003\uffcb" + - "\036\uffcb\001\002\000\004\024\uffc7\001\002\000\006\017" + - "\uffc4\024\uffaf\001\002\000\010\002\ufffe\003\126\036\120" + - "\001\002\000\010\002\uffc8\003\uffc8\036\uffc8\001\002\000" + - "\010\002\uffc9\003\uffc9\036\uffc9\001\002\000\004\017\133" + - "\001\002\000\010\002\uffc3\003\uffc3\036\uffc3\001\002\000" + - "\004\024\135\001\002\000\016\003\uffc6\017\uffc6\025\uffc6" + - "\032\uffc6\036\uffc6\037\uffc6\001\002\000\016\003\uff97\017" + - "\uff97\025\uff97\032\uff97\036\uff97\037\uff97\001\002\000\016" + - "\003\uffbd\017\uffbd\025\uffbd\032\uffbd\036\uffbd\037\uffbd\001" + - "\002\000\016\003\077\017\uffbf\025\uffbf\032\147\036\074" + - "\037\146\001\002\000\006\017\uffc1\025\uffc1\001\002\000" + - "\006\017\143\025\144\001\002\000\010\002\uffc5\003\uffc5" + - "\036\uffc5\001\002\000\016\003\uff97\017\uff97\025\uff97\032" + - "\uff97\036\uff97\037\uff97\001\002\000\006\017\uffc2\025\uffc2" + - "\001\002\000\016\003\uffbb\017\uffbb\025\uffbb\032\uffbb\036" + - "\uffbb\037\uffbb\001\002\000\006\003\077\036\074\001\002" + - "\000\020\003\uff97\017\uff97\023\154\025\uff97\032\uff97\036" + - "\uff97\037\uff97\001\002\000\016\003\uffbe\017\uffbe\025\uffbe" + - "\032\uffbe\036\uffbe\037\uffbe\001\002\000\016\003\uffb9\017" + - "\uffb9\025\uffb9\032\uffb9\036\uffb9\037\uffb9\001\002\000\016" + - "\003\uffbc\017\uffbc\025\uffbc\032\uffbc\036\uffbc\037\uffbc\001" + - "\002\000\042\003\054\006\026\007\027\010\040\011\036" + - "\012\022\013\042\014\030\015\017\016\015\026\033\027" + - "\023\030\035\031\041\035\025\036\053\001\002\000\016" + - "\003\uffba\017\uffba\025\uffba\032\uffba\036\uffba\037\uffba\001" + - "\002\000\016\003\uffac\017\uffac\025\uffac\032\uffac\036\uffac" + - "\037\uffac\001\002\000\006\017\uffc0\025\uffc0\001\002\000" + - "\014\017\uffb2\020\uffb2\022\uffab\033\uffab\036\uffab\001\002" + - "\000\006\033\047\036\170\001\002\000\006\017\uffdd\020" + - "\uffdd\001\002\000\012\017\uffe6\022\uff9c\033\uff9c\036\uff9c" + - "\001\002\000\020\003\uffe9\011\uffe9\012\uffe9\016\uffe9\026" + - "\uffe9\035\uffe9\036\uffe9\001\002\000\006\017\uffe2\020\167" + - "\001\002\000\004\017\172\001\002\000\004\036\170\001" + - "\002\000\006\017\uffb2\020\uffb2\001\002\000\006\017\uffde" + - "\020\uffde\001\002\000\020\003\uffe1\011\uffe1\012\uffe1\016" + - "\uffe1\026\uffe1\035\uffe1\036\uffe1\001\002\000\004\017\174" + - "\001\002\000\020\003\uffe5\011\uffe5\012\uffe5\016\uffe5\026" + - "\uffe5\035\uffe5\036\uffe5\001\002\000\020\003\uffea\011\uffea" + - "\012\uffea\016\uffea\026\uffea\035\uffea\036\uffea\001\002\000" + - "\022\005\ufffb\007\ufffb\010\ufffb\011\ufffb\012\ufffb\013\ufffb" + - "\014\ufffb\035\ufffb\001\002\000\022\005\uff97\007\uff97\010" + - "\uff97\011\uff97\012\uff97\013\uff97\014\uff97\035\uff97\001\002" + - "\000\042\003\054\006\026\007\027\010\040\011\036\012" + - "\022\013\042\014\030\015\017\016\015\026\033\027\023" + - "\030\035\031\041\035\025\036\053\001\002\000\006\017" + - "\ufffd\022\051\001\002\000\004\017\203\001\002\000\022" + - "\005\ufffc\007\ufffc\010\ufffc\011\ufffc\012\ufffc\013\ufffc\014" + - "\ufffc\035\ufffc\001\002\000\022\005\210\007\ufff2\010\ufff2" + - "\011\ufff2\012\ufff2\013\ufff2\014\ufff2\035\ufff2\001\002\000" + - "\022\005\ufff9\007\ufff9\010\ufff9\011\ufff9\012\ufff9\013\ufff9" + - "\014\ufff9\035\ufff9\001\002\000\020\007\223\010\224\011" + - "\007\012\012\013\227\014\225\035\014\001\002\000\022" + - "\005\ufffa\007\ufffa\010\ufffa\011\ufffa\012\ufffa\013\ufffa\014" + - "\ufffa\035\ufffa\001\002\000\042\003\054\006\026\007\027" + - "\010\040\011\036\012\022\013\042\014\030\015\017\016" + - "\015\026\033\027\023\030\035\031\041\035\025\036\053" + - "\001\002\000\006\017\uffb5\022\215\001\002\000\004\017" + - "\ufff8\001\002\000\004\017\214\001\002\000\022\005\ufff7" + - "\007\ufff7\010\ufff7\011\ufff7\012\ufff7\013\ufff7\014\ufff7\035" + - "\ufff7\001\002\000\044\003\054\006\026\007\027\010\040" + - "\011\036\012\022\013\042\014\030\015\017\016\015\021" + - "\216\026\033\027\023\030\035\031\041\035\025\036\053" + - "\001\002\000\004\017\uffb6\001\002\000\020\007\ufff3\010" + - "\ufff3\011\ufff3\012\ufff3\013\ufff3\014\ufff3\035\ufff3\001\002" + - "\000\020\007\ufff5\010\ufff5\011\ufff5\012\ufff5\013\ufff5\014" + - "\ufff5\035\ufff5\001\002\000\020\007\ufff1\010\ufff1\011\ufff1" + - "\012\ufff1\013\ufff1\014\ufff1\035\ufff1\001\002\000\020\007" + - "\ufff4\010\ufff4\011\ufff4\012\ufff4\013\ufff4\014\ufff4\035\ufff4" + - "\001\002\000\004\006\246\001\002\000\004\006\243\001" + - "\002\000\004\015\240\001\002\000\020\007\ufff6\010\ufff6" + - "\011\ufff6\012\ufff6\013\ufff6\014\ufff6\035\ufff6\001\002\000" + - "\004\015\234\001\002\000\020\003\uff97\011\007\012\012" + - "\016\uff97\026\065\035\014\036\uff97\001\002\000\010\003" + - "\uff97\016\116\036\uff97\001\002\000\006\003\126\036\120" + - "\001\002\000\010\002\uffff\003\126\036\120\001\002\000" + - "\004\037\235\001\002\000\022\007\uff99\010\uff99\011\uff99" + - "\012\uff99\013\uff99\014\uff99\017\236\035\uff99\001\002\000" + - "\020\007\uff98\010\uff98\011\uff98\012\uff98\013\uff98\014\uff98" + - "\035\uff98\001\002\000\020\007\uffee\010\uffee\011\uffee\012" + - "\uffee\013\uffee\014\uffee\035\uffee\001\002\000\004\037\241" + - "\001\002\000\022\007\uff99\010\uff99\011\uff99\012\uff99\013" + - "\uff99\014\uff99\017\236\035\uff99\001\002\000\020\007\uffed" + - "\010\uffed\011\uffed\012\uffed\013\uffed\014\uffed\035\uffed\001" + - "\002\000\004\037\244\001\002\000\022\007\uff99\010\uff99" + - "\011\uff99\012\uff99\013\uff99\014\uff99\017\236\035\uff99\001" + - "\002\000\020\007\uffef\010\uffef\011\uffef\012\uffef\013\uffef" + - "\014\uffef\035\uffef\001\002\000\004\037\247\001\002\000" + - "\022\007\uff99\010\uff99\011\uff99\012\uff99\013\uff99\014\uff99" + - "\017\236\035\uff99\001\002\000\020\007\ufff0\010\ufff0\011" + - "\ufff0\012\ufff0\013\ufff0\014\ufff0\035\ufff0\001\002\000\004" + - "\002\001\001\002" }); - - /** Access to parse-action table. */ - public short[][] action_table() {return _action_table;} - - /** <code>reduce_goto</code> table. */ - protected static final short[][] _reduce_table = - unpackFromStrings(new String[] { - "\000\247\000\006\003\003\055\004\001\001\000\002\001" + - "\001\000\006\004\176\037\175\001\001\000\010\012\012" + - "\014\010\024\007\001\001\000\016\017\020\025\160\026" + - "\164\033\161\044\163\054\030\001\001\000\002\001\001" + - "\000\016\012\012\024\065\037\063\040\061\041\066\043" + - "\062\001\001\000\002\001\001\000\016\017\020\025\023" + - "\027\017\034\036\045\031\054\030\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\004\063\055\001\001\000\002\001\001\000\002\001" + - "\001\000\002\001\001\000\010\027\017\034\036\045\045" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\002\001\001\000\004\061\042\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001\000" + - "\002\001\001\000\002\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\004\054\051\001\001\000" + - "\002\001\001\000\002\001\001\000\002\001\001\000\004" + - "\034\057\001\001\000\002\001\001\000\002\001\001\000" + - "\002\001\001\000\002\001\001\000\006\015\114\037\113" + - "\001\001\000\004\041\112\001\001\000\002\001\001\000" + - "\002\001\001\000\002\001\001\000\002\001\001\000\004" + - "\066\107\001\001\000\004\064\104\001\001\000\004\065" + - "\072\001\001\000\012\042\077\047\074\052\100\053\075" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\002\001\001\000\010\047\074\052\103\053\075\001" + - "\001\000\002\001\001\000\012\042\105\047\074\052\100" + - "\053\075\001\001\000\002\001\001\000\002\001\001\000" + - "\012\042\110\047\074\052\100\053\075\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + - "\001\000\010\016\126\030\127\046\124\001\001\000\002" + - "\001\001\000\004\046\120\001\001\000\002\001\001\000" + - "\004\067\122\001\001\000\002\001\001\000\002\001\001" + - "\000\002\001\001\000\004\070\133\001\001\000\004\072" + - "\131\001\001\000\006\030\130\046\124\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + - "\001\000\002\001\001\000\004\071\135\001\001\000\012" + - "\031\137\035\141\036\140\037\136\001\001\000\002\001" + - "\001\000\006\032\150\047\147\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\010\031\137\036" + - "\144\037\136\001\001\000\002\001\001\000\002\001\001" + - "\000\006\047\074\053\156\001\001\000\006\037\151\051" + - "\152\001\001\000\002\001\001\000\002\001\001\000\002" + - "\001\001\000\006\050\154\054\155\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\010\026\164\033\161\044\174\001\001\000\002\001" + - "\001\000\004\060\172\001\001\000\002\001\001\000\004" + - "\062\165\001\001\000\002\001\001\000\004\033\170\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001\000" + - "\002\001\001\000\006\005\203\037\204\001\001\000\006" + - "\017\200\054\030\001\001\000\004\056\201\001\001\000" + - "\002\001\001\000\002\001\001\000\006\007\205\020\206" + - "\001\001\000\002\001\001\000\022\006\225\010\220\012" + - "\012\013\217\014\227\022\221\023\216\024\007\001\001" + - "\000\002\001\001\000\010\017\210\021\211\054\030\001" + - "\001\000\002\001\001\000\004\057\212\001\001\000\002" + - "\001\001\000\002\001\001\000\004\054\051\001\001\000" + - "\002\001\001\000\002\001\001\000\002\001\001\000\002" + - "\001\001\000\002\001\001\000\002\001\001\000\002\001" + - "\001\000\002\001\001\000\002\001\001\000\002\001\001" + - "\000\016\012\012\024\065\037\063\040\230\041\066\043" + - "\062\001\001\000\006\015\231\037\113\001\001\000\010" + - "\016\232\030\127\046\124\001\001\000\006\030\130\046" + - "\124\001\001\000\002\001\001\000\004\011\236\001\001" + - "\000\002\001\001\000\002\001\001\000\002\001\001\000" + - "\004\011\241\001\001\000\002\001\001\000\002\001\001" + - "\000\004\011\244\001\001\000\002\001\001\000\002\001" + - "\001\000\004\011\247\001\001\000\002\001\001\000\002" + - "\001\001" }); - - /** Access to <code>reduce_goto</code> table. */ - public short[][] reduce_table() {return _reduce_table;} - - /** Instance of action encapsulation class. */ - protected CUP$parser$actions action_obj; - - /** Action encapsulation object initializer. */ - protected void init_actions() - { - action_obj = new CUP$parser$actions(this); - } - - /** Invoke a user supplied parse action. */ - public java_cup.runtime.Symbol do_action( - int act_num, - java_cup.runtime.lr_parser parser, - java.util.Stack stack, - int top) - throws java.lang.Exception - { - /* call code in generated class */ - return action_obj.CUP$parser$do_action(act_num, parser, stack, top); - } - - /** Indicates start state. */ - public int start_state() {return 0;} - /** Indicates start production. */ - public int start_production() {return 0;} - - /** <code>EOF</code> Symbol index. */ - public int EOF_sym() {return 0;} - - /** <code>error</code> Symbol index. */ - public int error_sym() {return 1;} - - - /** User initialization code. */ - public void user_init() throws java.lang.Exception - { - lexer.init(); - } - - /** Scan to get the next Symbol. */ - public java_cup.runtime.Symbol scan() - throws java.lang.Exception - { - return lexer.next_token(); - } - - - - /* override error routines */ - - public void report_fatal_error( - String message, - Object info) - { - done_parsing(); - lexer.emit_error(message); - System.err.println("Can't recover from previous error(s), giving up."); - System.exit(1); - } - - public void report_error(String message, Object info) - { - lexer.emit_error(message); - } - -} - -/** Cup generated class to encapsulate user supplied action code.*/ -class CUP$parser$actions { - - - /** helper routine to clone a new production part adding a given label */ - protected production_part add_lab(production_part part, String lab) - throws internal_error - { - /* if there is no label, or this is an action, just return the original */ - if (lab == null || part.is_action()) return part; - - /* otherwise build a new one with the given label attached */ - return new symbol_part(((symbol_part)part).the_symbol(),lab); - } - - /** max size of right hand side we will support */ - protected final int MAX_RHS = 200; - - /** array for accumulating right hand side parts */ - protected production_part[] rhs_parts = new production_part[MAX_RHS]; - - /** where we are currently in building a right hand side */ - protected int rhs_pos = 0; - - /** start a new right hand side */ - protected void new_rhs() {rhs_pos = 0; } - - /** add a new right hand side part */ - protected void add_rhs_part(production_part part) throws java.lang.Exception - { - if (rhs_pos >= MAX_RHS) - throw new Exception("Internal Error: Productions limited to " + - MAX_RHS + " symbols and actions"); - - rhs_parts[rhs_pos] = part; - rhs_pos++; - } - - /** string to build up multiple part names */ - protected String multipart_name = new String(); - - /** append a new name segment to the accumulated multipart name */ - protected void append_multipart(String name) - { - String dot = ""; - - /* if we aren't just starting out, put on a dot */ - if (multipart_name.length() != 0) dot = "."; - - multipart_name = multipart_name.concat(dot + name); - } - - /** table of declared symbols -- contains production parts indexed by name */ - protected Hashtable symbols = new Hashtable(); - - /** table of just non terminals -- contains non_terminals indexed by name */ - protected Hashtable non_terms = new Hashtable(); - - /** declared start non_terminal */ - protected non_terminal start_nt = null; - - /** left hand side non terminal of the current production */ - protected non_terminal lhs_nt; - - /** Current precedence number */ - int _cur_prec = 0; - - /** Current precedence side */ - int _cur_side = assoc.no_prec; - - /** update the precedences we are declaring */ - protected void update_precedence(int p) { - _cur_side = p; - _cur_prec++; - } - /** add relevant data to terminals */ - protected void add_precedence(String term) { - if (term == null) { - System.err.println("Unable to add precedence to nonexistent terminal"); - } else { - symbol_part sp = (symbol_part)symbols.get(term); - if (sp == null) { - System.err.println("Could find terminal " + term + " while declaring precedence"); - } else { - java_cup.symbol sym = sp.the_symbol(); - if (sym instanceof terminal) - ((terminal)sym).set_precedence(_cur_side, _cur_prec); - else System.err.println("Precedence declaration: Can't find terminal " + term); - } - } - } - - private final parser parser; - - /** Constructor */ - CUP$parser$actions(parser parser) { - this.parser = parser; - } - - /** Method with the actual generated action code. */ - public final java_cup.runtime.Symbol CUP$parser$do_action( - int CUP$parser$act_num, - java_cup.runtime.lr_parser CUP$parser$parser, - java.util.Stack CUP$parser$stack, - int CUP$parser$top) - throws java.lang.Exception - { - /* Symbol object for return from actions */ - java_cup.runtime.Symbol CUP$parser$result; - - /* select the action based on the action number */ - switch (CUP$parser$act_num) - { - /*. . . . . . . . . . . . . . . . . . . .*/ - case 106: // empty ::= - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(29/*empty*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 105: // opt_semi ::= SEMI - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(7/*opt_semi*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 104: // opt_semi ::= - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(7/*opt_semi*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 103: // non_terminal ::= NONTERMINAL - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(8/*non_terminal*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 102: // non_terminal ::= NON TERMINAL - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(8/*non_terminal*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 101: // robust_id ::= error - { - String RESULT = null; - - lexer.emit_error("Illegal use of reserved word"); - RESULT="ILLEGAL"; - - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 100: // robust_id ::= NONASSOC - { - String RESULT = null; - RESULT = "nonassoc"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 99: // robust_id ::= RIGHT - { - String RESULT = null; - RESULT = "right"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 98: // robust_id ::= LEFT - { - String RESULT = null; - RESULT = "left"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 97: // robust_id ::= PRECEDENCE - { - String RESULT = null; - RESULT = "precedence"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 96: // robust_id ::= START - { - String RESULT = null; - RESULT = "start"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 95: // robust_id ::= WITH - { - String RESULT = null; - RESULT = "with"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 94: // robust_id ::= SCAN - { - String RESULT = null; - RESULT = "scan"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 93: // robust_id ::= INIT - { - String RESULT = null; - RESULT = "init"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 92: // robust_id ::= NONTERMINAL - { - String RESULT = null; - RESULT = "nonterminal"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 91: // robust_id ::= NON - { - String RESULT = null; - RESULT = "non"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 90: // robust_id ::= TERMINAL - { - String RESULT = null; - RESULT = "terminal"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 89: // robust_id ::= PARSER - { - String RESULT = null; - RESULT = "parser"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 88: // robust_id ::= ACTION - { - String RESULT = null; - RESULT = "action"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 87: // robust_id ::= CODE - { - String RESULT = null; - RESULT = "code"; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 86: // robust_id ::= ID - { - String RESULT = null; - int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - RESULT = the_id; - CUP$parser$result = new java_cup.runtime.Symbol(42/*robust_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 85: // label_id ::= robust_id - { - String RESULT = null; - int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - RESULT = the_id; - CUP$parser$result = new java_cup.runtime.Symbol(38/*label_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 84: // symbol_id ::= error - { - String RESULT = null; - - lexer.emit_error("Illegal use of reserved word"); - RESULT="ILLEGAL"; - - CUP$parser$result = new java_cup.runtime.Symbol(37/*symbol_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 83: // symbol_id ::= ID - { - String RESULT = null; - int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - RESULT = the_id; - CUP$parser$result = new java_cup.runtime.Symbol(37/*symbol_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 82: // nt_id ::= error - { - String RESULT = null; - - lexer.emit_error("Illegal use of reserved word"); - RESULT="ILLEGAL"; - - CUP$parser$result = new java_cup.runtime.Symbol(36/*nt_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 81: // nt_id ::= ID - { - String RESULT = null; - int the_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int the_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String the_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - RESULT = the_id; - CUP$parser$result = new java_cup.runtime.Symbol(36/*nt_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 80: // new_non_term_id ::= ID - { - Object RESULT = null; - int non_term_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int non_term_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String non_term_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* see if this non terminal has been declared before */ - if (symbols.get(non_term_id) != null) - { - /* issue a message */ - lexer.emit_error( "java_cup.runtime.Symbol \"" + non_term_id + - "\" has already been declared"); - } - else - { - if (multipart_name.equals("")) { - append_multipart("Object"); - } - /* build the non terminal object */ - non_terminal this_nt = - new non_terminal(non_term_id, multipart_name); - - /* put it in the non_terms table */ - non_terms.put(non_term_id, this_nt); - - /* build a production_part and put it in the symbols table */ - symbols.put(non_term_id, new symbol_part(this_nt)); - } - - CUP$parser$result = new java_cup.runtime.Symbol(26/*new_non_term_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 79: // new_term_id ::= ID - { - Object RESULT = null; - int term_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int term_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String term_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* see if this terminal has been declared before */ - if (symbols.get(term_id) != null) - { - /* issue a message */ - lexer.emit_error("java_cup.runtime.Symbol \"" + term_id + - "\" has already been declared"); - } - else - { - /* if no type declared, declare one */ - if (multipart_name.equals("")) { - append_multipart("Object"); - } - /* build a production_part and put it in the table */ - symbols.put(term_id, - new symbol_part(new terminal(term_id, multipart_name))); - } - - CUP$parser$result = new java_cup.runtime.Symbol(25/*new_term_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 78: // type_id ::= type_id LBRACK RBRACK - { - Object RESULT = null; - multipart_name = multipart_name.concat("[]"); - CUP$parser$result = new java_cup.runtime.Symbol(19/*type_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 77: // type_id ::= multipart_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(19/*type_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 76: // import_id ::= multipart_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(15/*import_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 75: // import_id ::= multipart_id DOT STAR - { - Object RESULT = null; - append_multipart("*"); - CUP$parser$result = new java_cup.runtime.Symbol(15/*import_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 74: // multipart_id ::= robust_id - { - Object RESULT = null; - int an_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int an_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String an_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - append_multipart(an_id); - CUP$parser$result = new java_cup.runtime.Symbol(13/*multipart_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 73: // multipart_id ::= multipart_id DOT robust_id - { - Object RESULT = null; - int another_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int another_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String another_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - append_multipart(another_id); - CUP$parser$result = new java_cup.runtime.Symbol(13/*multipart_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 72: // opt_label ::= empty - { - String RESULT = null; - RESULT = null; - CUP$parser$result = new java_cup.runtime.Symbol(39/*opt_label*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 71: // opt_label ::= COLON label_id - { - String RESULT = null; - int labidleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int labidright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String labid = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - RESULT = labid; - CUP$parser$result = new java_cup.runtime.Symbol(39/*opt_label*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 70: // prod_part ::= CODE_STRING - { - Object RESULT = null; - int code_strleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int code_strright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String code_str = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* add a new production part */ - add_rhs_part(new action_part(code_str)); - - CUP$parser$result = new java_cup.runtime.Symbol(24/*prod_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 69: // prod_part ::= symbol_id opt_label - { - Object RESULT = null; - int symidleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left; - int symidright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right; - String symid = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - int labidleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int labidright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String labid = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* try to look up the id */ - production_part symb = (production_part)symbols.get(symid); - - /* if that fails, symbol is undeclared */ - if (symb == null) - { - if (lexer.error_count == 0) - lexer.emit_error("java_cup.runtime.Symbol \"" + symid + - "\" has not been declared"); - } - else - { - /* add a labeled production part */ - add_rhs_part(add_lab(symb, labid)); - } - - CUP$parser$result = new java_cup.runtime.Symbol(24/*prod_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 68: // prod_part_list ::= empty - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(23/*prod_part_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 67: // prod_part_list ::= prod_part_list prod_part - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(23/*prod_part_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 66: // rhs ::= prod_part_list - { - Object RESULT = null; - - if (lhs_nt != null) - { - /* build the production */ - production p = new production(lhs_nt, rhs_parts, rhs_pos); - - /* if we have no start non-terminal declared and this is - the first production, make its lhs nt the start_nt - and build a special start production for it. */ - if (start_nt == null) - { - start_nt = lhs_nt; - - /* build a special start production */ - new_rhs(); - add_rhs_part(add_lab(new symbol_part(start_nt),"start_val")); - add_rhs_part(new symbol_part(terminal.EOF)); - add_rhs_part(new action_part("RESULT = start_val;")); - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, rhs_pos); - - new_rhs(); - } - } - - /* reset the rhs accumulation in any case */ - new_rhs(); - - CUP$parser$result = new java_cup.runtime.Symbol(28/*rhs*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 65: // rhs ::= prod_part_list PERCENT_PREC term_id - { - Object RESULT = null; - int term_nameleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int term_nameright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String term_name = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - java_cup.symbol sym = null; - if (lhs_nt != null) - { - /* Find the precedence symbol */ - if (term_name == null) { - System.err.println("No terminal for contextual precedence"); - sym = null; - } else { - sym = ((symbol_part)symbols.get(term_name)).the_symbol(); - } - /* build the production */ - production p; - if ((sym!=null) && (sym instanceof terminal)) { - p = new production(lhs_nt, rhs_parts, rhs_pos, - ((terminal)sym).precedence_num(), - ((terminal)sym).precedence_side()); - ((symbol_part)symbols.get(term_name)).the_symbol().note_use(); - } else { - System.err.println("Invalid terminal " + term_name + - " for contextual precedence assignment"); - p = new production(lhs_nt, rhs_parts, rhs_pos); - } - - /* if we have no start non-terminal declared and this is - the first production, make its lhs nt the start_nt - and build a special start production for it. */ - if (start_nt == null) - { - start_nt = lhs_nt; - - /* build a special start production */ - new_rhs(); - add_rhs_part(add_lab(new symbol_part(start_nt),"start_val")); - add_rhs_part(new symbol_part(terminal.EOF)); - add_rhs_part(new action_part("RESULT = start_val;")); - if ((sym!=null) && (sym instanceof terminal)) { - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, - rhs_pos, ((terminal)sym).precedence_num(), - ((terminal)sym).precedence_side()); - } else { - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, rhs_pos); - } - new_rhs(); - } - } - - /* reset the rhs accumulation in any case */ - new_rhs(); - - CUP$parser$result = new java_cup.runtime.Symbol(28/*rhs*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 64: // rhs_list ::= rhs - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(27/*rhs_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 63: // rhs_list ::= rhs_list BAR rhs - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(27/*rhs_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 62: // production ::= error NT$13 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$13 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(22/*production*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 61: // NT$13 ::= - { - Object RESULT = null; - lexer.emit_error("Syntax Error"); - CUP$parser$result = new java_cup.runtime.Symbol(56/*NT$13*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 60: // production ::= nt_id NT$11 COLON_COLON_EQUALS NT$12 rhs_list SEMI - { - Object RESULT = null; - // propagate RESULT from NT$11 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-4)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-4)).value; - // propagate RESULT from NT$12 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value; - int lhs_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-5)).left; - int lhs_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-5)).right; - String lhs_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-5)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(22/*production*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-5)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 59: // NT$12 ::= - { - Object RESULT = null; - int lhs_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left; - int lhs_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right; - String lhs_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(55/*NT$12*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 58: // NT$11 ::= - { - Object RESULT = null; - int lhs_idleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int lhs_idright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String lhs_id = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* lookup the lhs nt */ - lhs_nt = (non_terminal)non_terms.get(lhs_id); - - /* if it wasn't declared, emit a message */ - if (lhs_nt == null) - { - if (lexer.error_count == 0) - lexer.emit_error("LHS non terminal \"" + lhs_id + - "\" has not been declared"); - } - - /* reset the rhs accumulation */ - new_rhs(); - - CUP$parser$result = new java_cup.runtime.Symbol(54/*NT$11*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 57: // production_list ::= production - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(12/*production_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 56: // production_list ::= production_list production - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(12/*production_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 55: // start_spec ::= empty - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(11/*start_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 54: // start_spec ::= START WITH nt_id NT$10 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$10 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - int start_nameleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left; - int start_nameright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).right; - String start_name = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(11/*start_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 53: // NT$10 ::= - { - Object RESULT = null; - int start_nameleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int start_nameright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String start_name = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* verify that the name has been declared as a non terminal */ - non_terminal nt = (non_terminal)non_terms.get(start_name); - if (nt == null) - { - lexer.emit_error( "Start non terminal \"" + start_name + - "\" has not been declared"); - } - else - { - /* remember the non-terminal for later */ - start_nt = nt; - - /* build a special start production */ - new_rhs(); - add_rhs_part(add_lab(new symbol_part(start_nt), "start_val")); - add_rhs_part(new symbol_part(terminal.EOF)); - add_rhs_part(new action_part("RESULT = start_val;")); - emit.start_production = - new production(non_terminal.START_nt, rhs_parts, rhs_pos); - new_rhs(); - } - - CUP$parser$result = new java_cup.runtime.Symbol(53/*NT$10*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 52: // term_id ::= symbol_id - { - String RESULT = null; - int symleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int symright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String sym = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - /* check that the symbol_id is a terminal */ - if (symbols.get(sym) == null) - { - /* issue a message */ - lexer.emit_error("Terminal \"" + sym + - "\" has not been declared"); - } - RESULT = sym; - - CUP$parser$result = new java_cup.runtime.Symbol(41/*term_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 51: // terminal_id ::= term_id - { - String RESULT = null; - int symleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left; - int symright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right; - String sym = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-0)).value; - - add_precedence(sym); - RESULT = sym; - - CUP$parser$result = new java_cup.runtime.Symbol(40/*terminal_id*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 50: // terminal_list ::= terminal_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(32/*terminal_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 49: // terminal_list ::= terminal_list COMMA terminal_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(32/*terminal_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 48: // preced ::= PRECEDENCE NONASSOC NT$9 terminal_list SEMI - { - Object RESULT = null; - // propagate RESULT from NT$9 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(31/*preced*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 47: // NT$9 ::= - { - Object RESULT = null; - - update_precedence(assoc.nonassoc); - - CUP$parser$result = new java_cup.runtime.Symbol(52/*NT$9*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 46: // preced ::= PRECEDENCE RIGHT NT$8 terminal_list SEMI - { - Object RESULT = null; - // propagate RESULT from NT$8 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(31/*preced*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 45: // NT$8 ::= - { - Object RESULT = null; - - update_precedence(assoc.right); - - CUP$parser$result = new java_cup.runtime.Symbol(51/*NT$8*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 44: // preced ::= PRECEDENCE LEFT NT$7 terminal_list SEMI - { - Object RESULT = null; - // propagate RESULT from NT$7 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(31/*preced*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 43: // NT$7 ::= - { - Object RESULT = null; - - update_precedence(assoc.left); - - CUP$parser$result = new java_cup.runtime.Symbol(50/*NT$7*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 42: // precedence_l ::= preced - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(33/*precedence_l*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 41: // precedence_l ::= precedence_l preced - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(33/*precedence_l*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 40: // precedence_list ::= empty - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(30/*precedence_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 39: // precedence_list ::= precedence_l - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(30/*precedence_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 38: // non_term_name_list ::= new_non_term_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(21/*non_term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 37: // non_term_name_list ::= non_term_name_list COMMA new_non_term_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(21/*non_term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 36: // term_name_list ::= new_term_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(20/*term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 35: // term_name_list ::= term_name_list COMMA new_term_id - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(20/*term_name_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 34: // declares_non_term ::= non_term_name_list NT$6 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$6 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(35/*declares_non_term*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 33: // NT$6 ::= - { - Object RESULT = null; - - /* reset the accumulated multipart name */ - multipart_name = new String(); - - CUP$parser$result = new java_cup.runtime.Symbol(49/*NT$6*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 32: // declares_term ::= term_name_list NT$5 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$5 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(34/*declares_term*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 31: // NT$5 ::= - { - Object RESULT = null; - - /* reset the accumulated multipart name */ - multipart_name = new String(); - - CUP$parser$result = new java_cup.runtime.Symbol(48/*NT$5*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 30: // symbol ::= non_terminal error NT$4 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$4 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 29: // NT$4 ::= - { - Object RESULT = null; - - /* reset the accumulated multipart name */ - multipart_name = new String(); - - CUP$parser$result = new java_cup.runtime.Symbol(47/*NT$4*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 28: // symbol ::= TERMINAL error NT$3 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$3 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 27: // NT$3 ::= - { - Object RESULT = null; - - /* reset the accumulated multipart name */ - multipart_name = new String(); - - CUP$parser$result = new java_cup.runtime.Symbol(46/*NT$3*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 26: // symbol ::= non_terminal declares_non_term - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 25: // symbol ::= non_terminal type_id declares_non_term - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 24: // symbol ::= TERMINAL declares_term - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 23: // symbol ::= TERMINAL type_id declares_term - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(18/*symbol*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 22: // symbol_list ::= symbol - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(10/*symbol_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 21: // symbol_list ::= symbol_list symbol - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(10/*symbol_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 20: // scan_code ::= SCAN WITH CODE_STRING opt_semi - { - Object RESULT = null; - int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left; - int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right; - String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - if (emit.scan_code!=null) - lexer.emit_error("Redundant scan code (skipping)"); - else /* save the user code */ - emit.scan_code = user_code; - - CUP$parser$result = new java_cup.runtime.Symbol(17/*scan_code*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 19: // init_code ::= INIT WITH CODE_STRING opt_semi - { - Object RESULT = null; - int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left; - int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right; - String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - if (emit.init_code!=null) - lexer.emit_error("Redundant init code (skipping)"); - else /* save the user code */ - emit.init_code = user_code; - - CUP$parser$result = new java_cup.runtime.Symbol(16/*init_code*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 18: // parser_code_part ::= PARSER CODE CODE_STRING opt_semi - { - Object RESULT = null; - int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left; - int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right; - String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - if (emit.parser_code!=null) - lexer.emit_error("Redundant parser code (skipping)"); - else /* save the user included code string */ - emit.parser_code = user_code; - - CUP$parser$result = new java_cup.runtime.Symbol(9/*parser_code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 17: // action_code_part ::= ACTION CODE CODE_STRING opt_semi - { - Object RESULT = null; - int user_codeleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left; - int user_coderight = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right; - String user_code = (String)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - if (emit.action_code!=null) - lexer.emit_error("Redundant action code (skipping)"); - else /* save the user included code string */ - emit.action_code = user_code; - - CUP$parser$result = new java_cup.runtime.Symbol(4/*action_code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 16: // code_parts ::= code_parts code_part - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(5/*code_parts*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 15: // code_parts ::= - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(5/*code_parts*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 14: // code_part ::= scan_code - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 13: // code_part ::= init_code - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 12: // code_part ::= parser_code_part - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 11: // code_part ::= action_code_part - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(6/*code_part*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 10: // import_spec ::= IMPORT import_id NT$2 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$2 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(14/*import_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 9: // NT$2 ::= - { - Object RESULT = null; - - /* save this import on the imports list */ - emit.import_list.push(multipart_name); - - /* reset the accumulated multipart name */ - multipart_name = new String(); - - CUP$parser$result = new java_cup.runtime.Symbol(45/*NT$2*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 8: // import_list ::= empty - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(3/*import_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 7: // import_list ::= import_list import_spec - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(3/*import_list*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 6: // package_spec ::= empty - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(2/*package_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 5: // package_spec ::= PACKAGE multipart_id NT$1 SEMI - { - Object RESULT = null; - // propagate RESULT from NT$1 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(2/*package_spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 4: // NT$1 ::= - { - Object RESULT = null; - - /* save the package name */ - emit.package_name = multipart_name; - - /* reset the accumulated multipart name */ - multipart_name = new String(); - - CUP$parser$result = new java_cup.runtime.Symbol(44/*NT$1*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 3: // spec ::= error symbol_list precedence_list start_spec production_list - { - Object RESULT = null; - - CUP$parser$result = new java_cup.runtime.Symbol(1/*spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-4)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 2: // spec ::= NT$0 package_spec import_list code_parts symbol_list precedence_list start_spec production_list - { - Object RESULT = null; - // propagate RESULT from NT$0 - if ( ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-7)).value != null ) - RESULT = (Object) ((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-7)).value; - - CUP$parser$result = new java_cup.runtime.Symbol(1/*spec*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-7)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 1: // NT$0 ::= - { - Object RESULT = null; - - /* declare "error" as a terminal */ - symbols.put("error", new symbol_part(terminal.error)); - - /* declare start non terminal */ - non_terms.put("$START", non_terminal.START_nt); - - CUP$parser$result = new java_cup.runtime.Symbol(43/*NT$0*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - return CUP$parser$result; - - /*. . . . . . . . . . . . . . . . . . . .*/ - case 0: // $START ::= spec EOF - { - Object RESULT = null; - int start_valleft = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left; - int start_valright = ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).right; - Object start_val = (Object)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-1)).value; - RESULT = start_val; - CUP$parser$result = new java_cup.runtime.Symbol(0/*$START*/, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$parser$stack.elementAt(CUP$parser$top-0)).right, RESULT); - } - /* ACCEPT */ - CUP$parser$parser.done_parsing(); - return CUP$parser$result; - - /* . . . . . .*/ - default: - throw new Exception( - "Invalid action number found in internal parse table"); - - } - } -} - diff --git a/src/syntaxParser/java_cup/SAVE/production.java b/src/syntaxParser/java_cup/SAVE/production.java deleted file mode 100644 index 4717b8c..0000000 --- a/src/syntaxParser/java_cup/SAVE/production.java +++ /dev/null @@ -1,775 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Hashtable; -import java.util.Enumeration; - -/** This class represents a production in the grammar. It contains - * a LHS non terminal, and an array of RHS symbols. As various - * transformations are done on the RHS of the production, it may shrink. - * As a result a separate length is always maintained to indicate how much - * of the RHS array is still valid.<p> - * - * I addition to construction and manipulation operations, productions provide - * methods for factoring out actions (see remove_embedded_actions()), for - * computing the nullability of the production (i.e., can it derive the empty - * string, see check_nullable()), and operations for computing its first - * set (i.e., the set of terminals that could appear at the beginning of some - * string derived from the production, see check_first_set()). - * - * @see java_cup.production_part - * @see java_cup.symbol_part - * @see java_cup.action_part - */ - -public class production { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. This constructor accepts a LHS non terminal, - * an array of RHS parts (including terminals, non terminals, and - * actions), and a string for a final reduce action. It does several - * manipulations in the process of creating a production object. - * After some validity checking it translates labels that appear in - * actions into code for accessing objects on the runtime parse stack. - * It them merges adjacent actions if they appear and moves any trailing - * action into the final reduce actions string. Next it removes any - * embedded actions by factoring them out with new action productions. - * Finally it assigns a unique index to the production.<p> - * - * Factoring out of actions is accomplished by creating new "hidden" - * non terminals. For example if the production was originally: <pre> - * A ::= B {action} C D - * </pre> - * then it is factored into two productions:<pre> - * A ::= B X C D - * X ::= {action} - * </pre> - * (where X is a unique new non terminal). This has the effect of placing - * all actions at the end where they can be handled as part of a reduce by - * the parser. - */ - public production( - non_terminal lhs_sym, - production_part rhs_parts[], - int rhs_l, - String action_str) - throws internal_error - { - int i; - action_part tail_action; - String declare_str; - int rightlen = rhs_l; - - /* remember the length */ - if (rhs_l >= 0) - _rhs_length = rhs_l; - else if (rhs_parts != null) - _rhs_length = rhs_parts.length; - else - _rhs_length = 0; - - /* make sure we have a valid left-hand-side */ - if (lhs_sym == null) - throw new internal_error( - "Attempt to construct a production with a null LHS"); - - /* I'm not translating labels anymore, I'm adding code to declare - labels as valid variables. This way, the users code string is - untouched - 6/96 frankf */ - - /* check if the last part of the right hand side is an action. If - it is, it won't be on the stack, so we don't want to count it - in the rightlen. Then when we search down the stack for a - Symbol, we don't try to search past action */ - - if (rhs_l > 0) { - if (rhs_parts[rhs_l - 1].is_action()) { - rightlen = rhs_l - 1; - } else { - rightlen = rhs_l; - } - } - - /* get the generated declaration code for the necessary labels. */ - declare_str = declare_labels( - rhs_parts, rightlen, action_str); - - if (action_str == null) - action_str = declare_str; - else - action_str = declare_str + action_str; - - /* count use of lhs */ - lhs_sym.note_use(); - - /* create the part for left-hand-side */ - _lhs = new symbol_part(lhs_sym); - - /* merge adjacent actions (if any) */ - _rhs_length = merge_adjacent_actions(rhs_parts, _rhs_length); - - /* strip off any trailing action */ - tail_action = strip_trailing_action(rhs_parts, _rhs_length); - if (tail_action != null) _rhs_length--; - - /* Why does this run through the right hand side happen - over and over? here a quick combination of two - prior runs plus one I wanted of my own - frankf 6/25/96 */ - /* allocate and copy over the right-hand-side */ - /* count use of each rhs symbol */ - _rhs = new production_part[_rhs_length]; - for (i=0; i<_rhs_length; i++) { - _rhs[i] = rhs_parts[i]; - if (!_rhs[i].is_action()) { - ((symbol_part)_rhs[i]).the_symbol().note_use(); - if (((symbol_part)_rhs[i]).the_symbol() instanceof terminal) { - _rhs_prec = - ((terminal)((symbol_part)_rhs[i]).the_symbol()).precedence_num(); - _rhs_assoc = - ((terminal)((symbol_part)_rhs[i]).the_symbol()).precedence_side(); - } - } - } - - /*now action string is really declaration string, so put it in front! - 6/14/96 frankf */ - if (action_str == null) action_str = ""; - if (tail_action != null && tail_action.code_string() != null) - action_str = action_str + "\t\t" + tail_action.code_string(); - - /* stash the action */ - _action = new action_part(action_str); - - /* rewrite production to remove any embedded actions */ - remove_embedded_actions(); - - /* assign an index */ - _index = next_index++; - - /* put us in the global collection of productions */ - _all.put(new Integer(_index),this); - - /* put us in the production list of the lhs non terminal */ - lhs_sym.add_production(this); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with no action string. */ - public production( - non_terminal lhs_sym, - production_part rhs_parts[], - int rhs_l) - throws internal_error - { - this(lhs_sym,rhs_parts,rhs_l,null); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /* Constructor with precedence and associativity of production - contextually define */ - public production( - non_terminal lhs_sym, - production_part rhs_parts[], - int rhs_l, - String action_str, - int prec_num, - int prec_side) - throws internal_error - { - this(lhs_sym,rhs_parts,rhs_l,action_str); - - /* set the precedence */ - set_precedence_num(prec_num); - set_precedence_side(prec_side); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /* Constructor w/ no action string and contextual precedence - defined */ - public production( - non_terminal lhs_sym, - production_part rhs_parts[], - int rhs_l, - int prec_num, - int prec_side) - throws internal_error - { - this(lhs_sym,rhs_parts,rhs_l,null); - /* set the precedence */ - set_precedence_num(prec_num); - set_precedence_side(prec_side); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - - /** Table of all productions. Elements are stored using their index as - * the key. - */ - protected static Hashtable _all = new Hashtable(); - - /** Access to all productions. */ - public static Enumeration all() {return _all.elements();} - - /** Lookup a production by index. */ - public static production find(int indx) { - return (production) _all.get(new Integer(indx)); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Total number of productions. */ - public static int number() {return _all.size();} - - /** Static counter for assigning unique index numbers. */ - protected static int next_index; - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The left hand side non-terminal. */ - protected symbol_part _lhs; - - /** The left hand side non-terminal. */ - public symbol_part lhs() {return _lhs;} - - - /** The precedence of the rule */ - protected int _rhs_prec = -1; - protected int _rhs_assoc = -1; - - /** Access to the precedence of the rule */ - public int precedence_num() { return _rhs_prec; } - public int precedence_side() { return _rhs_assoc; } - - /** Setting the precedence of a rule */ - public void set_precedence_num(int prec_num) { - _rhs_prec = prec_num; - } - public void set_precedence_side(int prec_side) { - _rhs_assoc = prec_side; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** A collection of parts for the right hand side. */ - protected production_part _rhs[]; - - /** Access to the collection of parts for the right hand side. */ - public production_part rhs(int indx) throws internal_error - { - if (indx >= 0 && indx < _rhs_length) - return _rhs[indx]; - else - throw new internal_error( - "Index out of range for right hand side of production"); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** How much of the right hand side array we are presently using. */ - protected int _rhs_length; - - /** How much of the right hand side array we are presently using. */ - public int rhs_length() {return _rhs_length;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** An action_part containing code for the action to be performed when we - * reduce with this production. - */ - protected action_part _action; - - /** An action_part containing code for the action to be performed when we - * reduce with this production. - */ - public action_part action() {return _action;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Index number of the production. */ - protected int _index; - - /** Index number of the production. */ - public int index() {return _index;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of number of reductions using this production. */ - protected int _num_reductions = 0; - - /** Count of number of reductions using this production. */ - public int num_reductions() {return _num_reductions;} - - /** Increment the count of reductions with this non-terminal */ - public void note_reduction_use() {_num_reductions++;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Is the nullability of the production known or unknown? */ - protected boolean _nullable_known = false; - - /** Is the nullability of the production known or unknown? */ - public boolean nullable_known() {return _nullable_known;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Nullability of the production (can it derive the empty string). */ - protected boolean _nullable = false; - - /** Nullability of the production (can it derive the empty string). */ - public boolean nullable() {return _nullable;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** First set of the production. This is the set of terminals that - * could appear at the front of some string derived from this production. - */ - protected terminal_set _first_set = new terminal_set(); - - /** First set of the production. This is the set of terminals that - * could appear at the front of some string derived from this production. - */ - public terminal_set first_set() {return _first_set;} - - /*-----------------------------------------------------------*/ - /*--- Static Methods ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Determine if a given character can be a label id starter. - * @param c the character in question. - */ - protected static boolean is_id_start(char c) - { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_'); - - //later need to handle non-8-bit chars here - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if a character can be in a label id. - * @param c the character in question. - */ - protected static boolean is_id_char(char c) - { - return is_id_start(c) || (c >= '0' && c <= '9'); - } - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - - /** Return label declaration code - * @param labelname the label name - * @param stack_type the stack type of label? - * @author frankf - */ - protected String make_declaration( - String labelname, - String stack_type, - int offset) - { - String ret; - - /* Put in the left/right value labels */ - if (emit.lr_values()) - ret = "\t\tint " + labelname + "left = ((java_cup.runtime.Symbol)" + - emit.pre("stack") + ".elementAt(" + emit.pre("top") + - "-" + offset + ")).left;\n" + - "\t\tint " + labelname + "right = ((java_cup.runtime.Symbol)" + - emit.pre("stack") + ".elementAt(" + emit.pre("top") + - "-" + offset + ")).right;\n"; - else ret = ""; - - /* otherwise, just declare label. */ - return ret + "\t\t" + stack_type + " " + labelname + " = (" + stack_type + - ")((" + "java_cup.runtime.Symbol) " + emit.pre("stack") + ".elementAt(" + emit.pre("top") - + "-" + offset + ")).value;\n"; - - } - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Declare label names as valid variables within the action string - * @param rhs array of RHS parts. - * @param rhs_len how much of rhs to consider valid. - * @param final_action the final action string of the production. - * @param lhs_type the object type associated with the LHS symbol. - */ - protected String declare_labels( - production_part rhs[], - int rhs_len, - String final_action) - { - String declaration = ""; - - symbol_part part; - action_part act_part; - int pos; - - /* walk down the parts and extract the labels */ - for (pos = 0; pos < rhs_len; pos++) - { - if (!rhs[pos].is_action()) - { - part = (symbol_part)rhs[pos]; - - /* if it has a label, make declaration! */ - if (part.label() != null) - { - declaration = declaration + - make_declaration(part.label(), part.the_symbol().stack_type(), - rhs_len-pos-1); - } - } - } - return declaration; - } - - - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Helper routine to merge adjacent actions in a set of RHS parts - * @param rhs_parts array of RHS parts. - * @param len amount of that array that is valid. - * @return remaining valid length. - */ - protected int merge_adjacent_actions(production_part rhs_parts[], int len) - { - int from_loc, to_loc, merge_cnt; - - /* bail out early if we have no work to do */ - if (rhs_parts == null || len == 0) return 0; - - merge_cnt = 0; - to_loc = -1; - for (from_loc=0; from_loc<len; from_loc++) - { - /* do we go in the current position or one further */ - if (to_loc < 0 || !rhs_parts[to_loc].is_action() - || !rhs_parts[from_loc].is_action()) - { - /* next one */ - to_loc++; - - /* clear the way for it */ - if (to_loc != from_loc) rhs_parts[to_loc] = null; - } - - /* if this is not trivial? */ - if (to_loc != from_loc) - { - /* do we merge or copy? */ - if (rhs_parts[to_loc] != null && rhs_parts[to_loc].is_action() && - rhs_parts[from_loc].is_action()) - { - /* merge */ - rhs_parts[to_loc] = new action_part( - ((action_part)rhs_parts[to_loc]).code_string() + - ((action_part)rhs_parts[from_loc]).code_string()); - merge_cnt++; - } - else - { - /* copy */ - rhs_parts[to_loc] = rhs_parts[from_loc]; - } - } - } - - /* return the used length */ - return len - merge_cnt; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Helper routine to strip a trailing action off rhs and return it - * @param rhs_parts array of RHS parts. - * @param len how many of those are valid. - * @return the removed action part. - */ - protected action_part strip_trailing_action( - production_part rhs_parts[], - int len) - { - action_part result; - - /* bail out early if we have nothing to do */ - if (rhs_parts == null || len == 0) return null; - - /* see if we have a trailing action */ - if (rhs_parts[len-1].is_action()) - { - /* snip it out and return it */ - result = (action_part)rhs_parts[len-1]; - rhs_parts[len-1] = null; - return result; - } - else - return null; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove all embedded actions from a production by factoring them - * out into individual action production using new non terminals. - * if the original production was: <pre> - * A ::= B {action1} C {action2} D - * </pre> - * then it will be factored into: <pre> - * A ::= B NT$1 C NT$2 D - * NT$1 ::= {action1} - * NT$2 ::= {action2} - * </pre> - * where NT$1 and NT$2 are new system created non terminals. - */ - - /* the declarations added to the parent production are also passed along, - as they should be perfectly valid in this code string, since it - was originally a code string in the parent, not on its own. - frank 6/20/96 */ - protected void remove_embedded_actions( - - ) throws internal_error - { - non_terminal new_nt; - production new_prod; - String declare_str; - - /* walk over the production and process each action */ - for (int act_loc = 0; act_loc < rhs_length(); act_loc++) - if (rhs(act_loc).is_action()) - { - - - declare_str = declare_labels( - _rhs, act_loc, ""); - /* create a new non terminal for the action production */ - new_nt = non_terminal.create_new(); - new_nt.is_embedded_action = true; /* 24-Mar-1998, CSA */ - - /* create a new production with just the action */ - new_prod = new action_production(this, new_nt, null, 0, - declare_str + ((action_part)rhs(act_loc)).code_string()); - - /* replace the action with the generated non terminal */ - _rhs[act_loc] = new symbol_part(new_nt); - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Check to see if the production (now) appears to be nullable. - * A production is nullable if its RHS could derive the empty string. - * This results when the RHS is empty or contains only non terminals - * which themselves are nullable. - */ - public boolean check_nullable() throws internal_error - { - production_part part; - symbol sym; - int pos; - - /* if we already know bail out early */ - if (nullable_known()) return nullable(); - - /* if we have a zero size RHS we are directly nullable */ - if (rhs_length() == 0) - { - /* stash and return the result */ - return set_nullable(true); - } - - /* otherwise we need to test all of our parts */ - for (pos=0; pos<rhs_length(); pos++) - { - part = rhs(pos); - - /* only look at non-actions */ - if (!part.is_action()) - { - sym = ((symbol_part)part).the_symbol(); - - /* if its a terminal we are definitely not nullable */ - if (!sym.is_non_term()) - return set_nullable(false); - /* its a non-term, is it marked nullable */ - else if (!((non_terminal)sym).nullable()) - /* this one not (yet) nullable, so we aren't */ - return false; - } - } - - /* if we make it here all parts are nullable */ - return set_nullable(true); - } - - /** set (and return) nullability */ - boolean set_nullable(boolean v) - { - _nullable_known = true; - _nullable = v; - return v; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Update (and return) the first set based on current NT firsts. - * This assumes that nullability has already been computed for all non - * terminals and productions. - */ - public terminal_set check_first_set() throws internal_error - { - int part; - symbol sym; - - /* walk down the right hand side till we get past all nullables */ - for (part=0; part<rhs_length(); part++) - { - /* only look at non-actions */ - if (!rhs(part).is_action()) - { - sym = ((symbol_part)rhs(part)).the_symbol(); - - /* is it a non-terminal?*/ - if (sym.is_non_term()) - { - /* add in current firsts from that NT */ - _first_set.add(((non_terminal)sym).first_set()); - - /* if its not nullable, we are done */ - if (!((non_terminal)sym).nullable()) - break; - } - else - { - /* its a terminal -- add that to the set */ - _first_set.add((terminal)sym); - - /* we are done */ - break; - } - } - } - - /* return our updated first set */ - return first_set(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(production other) - { - if (other == null) return false; - return other._index == _index; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof production)) - return false; - else - return equals((production)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a hash code. */ - public int hashCode() - { - /* just use a simple function of the index */ - return _index*13; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - String result; - - /* catch any internal errors */ - try { - result = "production [" + index() + "]: "; - result += ((lhs() != null) ? lhs().toString() : "$$NULL-LHS$$"); - result += " :: = "; - for (int i = 0; i<rhs_length(); i++) - result += rhs(i) + " "; - result += ";"; - if (action() != null && action().code_string() != null) - result += " {" + action().code_string() + "}"; - - if (nullable_known()) - if (nullable()) - result += "[NULLABLE]"; - else - result += "[NOT NULLABLE]"; - } catch (internal_error e) { - /* crash on internal error since we can't throw it from here (because - superclass does not throw anything. */ - e.crash(); - result = null; - } - - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a simpler string. */ - public String to_simple_string() throws internal_error - { - String result; - - result = ((lhs() != null) ? lhs().the_symbol().name() : "NULL_LHS"); - result += " ::= "; - for (int i = 0; i < rhs_length(); i++) - if (!rhs(i).is_action()) - result += ((symbol_part)rhs(i)).the_symbol().name() + " "; - - return result; - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/production_part.java b/src/syntaxParser/java_cup/SAVE/production_part.java deleted file mode 100644 index 7b90523..0000000 --- a/src/syntaxParser/java_cup/SAVE/production_part.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents one part (either a symbol or an action) of a - * production. In this base class it contains only an optional label - * string that the user can use to refer to the part within actions.<p> - * - * This is an abstract class. - * - * @see java_cup.production - */ -public abstract class production_part { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. */ - public production_part(String lab) - { - _label = lab; - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** Optional label for referring to the part within an action (null for - * no label). - */ - protected String _label; - - /** Optional label for referring to the part within an action (null for - * no label). - */ - public String label() {return _label;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Indicate if this is an action (rather than a symbol). Here in the - * base class, we don't this know yet, so its an abstract method. - */ - public abstract boolean is_action(); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(production_part other) - { - if (other == null) return false; - - /* compare the labels */ - if (label() != null) - return label().equals(other.label()); - else - return other.label() == null; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof production_part)) - return false; - else - return equals((production_part)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a hash code. */ - public int hashCode() - { - return label()==null ? 0 : label().hashCode(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - if (label() != null) - return label() + ":"; - else - return " "; - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/reduce_action.java b/src/syntaxParser/java_cup/SAVE/reduce_action.java deleted file mode 100644 index a7296df..0000000 --- a/src/syntaxParser/java_cup/SAVE/reduce_action.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents a reduce action within the parse table. - * The action simply stores the production that it reduces with and - * responds to queries about its type. - */ -public class reduce_action extends parse_action { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. - * @param prod the production this action reduces with. - */ - public reduce_action(production prod ) throws internal_error - { - /* sanity check */ - if (prod == null) - throw new internal_error( - "Attempt to create a reduce_action with a null production"); - - _reduce_with = prod; - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The production we reduce with. */ - protected production _reduce_with; - - /** The production we reduce with. */ - public production reduce_with() {return _reduce_with;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Quick access to type of action. */ - public int kind() {return REDUCE;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality test. */ - public boolean equals(reduce_action other) - { - return other != null && other.reduce_with() == reduce_with(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality test. */ - public boolean equals(Object other) - { - if (other instanceof reduce_action) - return equals((reduce_action)other); - else - return false; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute a hash code. */ - public int hashCode() - { - /* use the hash code of the production we are reducing with */ - return reduce_with().hashCode(); - } - - - /** Convert to string. */ - public String toString() - { - return "REDUCE(with prod " + reduce_with().index() + ")"; - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/shift_action.java b/src/syntaxParser/java_cup/SAVE/shift_action.java deleted file mode 100644 index 892d6db..0000000 --- a/src/syntaxParser/java_cup/SAVE/shift_action.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents a shift action within the parse table. - * The action simply stores the state that it shifts to and responds - * to queries about its type. - */ -public class shift_action extends parse_action { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Simple constructor. - * @param shft_to the state that this action shifts to. - */ - public shift_action(lalr_state shft_to) throws internal_error - { - /* sanity check */ - if (shft_to == null) - throw new internal_error( - "Attempt to create a shift_action to a null state"); - - _shift_to = shft_to; - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The state we shift to. */ - protected lalr_state _shift_to; - - /** The state we shift to. */ - public lalr_state shift_to() {return _shift_to;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Quick access to type of action. */ - public int kind() {return SHIFT;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality test. */ - public boolean equals(shift_action other) - { - return other != null && other.shift_to() == shift_to(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality test. */ - public boolean equals(Object other) - { - if (other instanceof shift_action) - return equals((shift_action)other); - else - return false; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute a hash code. */ - public int hashCode() - { - /* use the hash code of the state we are shifting to */ - return shift_to().hashCode(); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() {return "SHIFT(to state " + shift_to().index() + ")";} - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/sym.java b/src/syntaxParser/java_cup/SAVE/sym.java deleted file mode 100644 index 470e402..0000000 --- a/src/syntaxParser/java_cup/SAVE/sym.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -//---------------------------------------------------- -// The following code was generated by CUP v0.10k -// Sun Jul 25 13:35:26 EDT 1999 -//---------------------------------------------------- - -package java_cup; - -/** CUP generated class containing symbol constants. */ -public class sym { - /* terminals */ - public static final int NON = 8; - public static final int NONTERMINAL = 27; - public static final int STAR = 15; - public static final int SEMI = 13; - public static final int CODE = 4; - public static final int EOF = 0; - public static final int NONASSOC = 23; - public static final int LEFT = 21; - public static final int PACKAGE = 2; - public static final int COLON = 17; - public static final int WITH = 11; - public static final int IMPORT = 3; - public static final int error = 1; - public static final int COLON_COLON_EQUALS = 18; - public static final int COMMA = 14; - public static final int DOT = 16; - public static final int SCAN = 10; - public static final int ID = 28; - public static final int INIT = 9; - public static final int PARSER = 6; - public static final int TERMINAL = 7; - public static final int PRECEDENCE = 20; - public static final int LBRACK = 25; - public static final int RBRACK = 26; - public static final int PERCENT_PREC = 24; - public static final int START = 12; - public static final int RIGHT = 22; - public static final int BAR = 19; - public static final int ACTION = 5; - public static final int CODE_STRING = 29; -} - diff --git a/src/syntaxParser/java_cup/SAVE/symbol.java b/src/syntaxParser/java_cup/SAVE/symbol.java deleted file mode 100644 index 677d333..0000000 --- a/src/syntaxParser/java_cup/SAVE/symbol.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This abstract class serves as the base class for grammar symbols (i.e., - * both terminals and non-terminals). Each symbol has a name string, and - * a string giving the type of object that the symbol will be represented by - * on the runtime parse stack. In addition, each symbol maintains a use count - * in order to detect symbols that are declared but never used, and an index - * number that indicates where it appears in parse tables (index numbers are - * unique within terminals or non terminals, but not across both). - * - * @see java_cup.terminal - * @see java_cup.non_terminal - */ -public abstract class symbol { - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param nm the name of the symbol. - * @param tp a string with the type name. - */ - public symbol(String nm, String tp) - { - /* sanity check */ - if (nm == null) nm = ""; - - /* apply default if no type given */ - if (tp == null) tp = "Object"; - - _name = nm; - _stack_type = tp; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with default type. - * @param nm the name of the symbol. - */ - public symbol(String nm) - { - this(nm, null); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** String for the human readable name of the symbol. */ - protected String _name; - - /** String for the human readable name of the symbol. */ - public String name() {return _name;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** String for the type of object used for the symbol on the parse stack. */ - protected String _stack_type; - - /** String for the type of object used for the symbol on the parse stack. */ - public String stack_type() {return _stack_type;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Count of how many times the symbol appears in productions. */ - protected int _use_count = 0; - - /** Count of how many times the symbol appears in productions. */ - public int use_count() {return _use_count;} - - /** Increment the use count. */ - public void note_use() {_use_count++;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Index of this symbol (terminal or non terminal) in the parse tables. - * Note: indexes are unique among terminals and unique among non terminals, - * however, a terminal may have the same index as a non-terminal, etc. - */ - protected int _index; - - /** Index of this symbol (terminal or non terminal) in the parse tables. - * Note: indexes are unique among terminals and unique among non terminals, - * however, a terminal may have the same index as a non-terminal, etc. - */ - public int index() {return _index;} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Indicate if this is a non-terminal. Here in the base class we - * don't know, so this is abstract. - */ - public abstract boolean is_non_term(); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - return name(); - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/symbol_part.java b/src/syntaxParser/java_cup/SAVE/symbol_part.java deleted file mode 100644 index 9fa308c..0000000 --- a/src/syntaxParser/java_cup/SAVE/symbol_part.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class represents a part of a production which is a symbol (terminal - * or non terminal). This simply maintains a reference to the symbol in - * question. - * - * @see java_cup.production - */ -public class symbol_part extends production_part { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param sym the symbol that this part is made up of. - * @param lab an optional label string for the part. - */ - public symbol_part(symbol sym, String lab) throws internal_error - { - super(lab); - - if (sym == null) - throw new internal_error( - "Attempt to construct a symbol_part with a null symbol"); - _the_symbol = sym; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with no label. - * @param sym the symbol that this part is made up of. - */ - public symbol_part(symbol sym) throws internal_error - { - this(sym,null); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** The symbol that this part is made up of. */ - protected symbol _the_symbol; - - /** The symbol that this part is made up of. */ - public symbol the_symbol() {return _the_symbol;} - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Respond that we are not an action part. */ - public boolean is_action() { return false; } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(symbol_part other) - { - return other != null && super.equals(other) && - the_symbol().equals(other.the_symbol()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof symbol_part)) - return false; - else - return equals((symbol_part)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Produce a hash code. */ - public int hashCode() - { - return super.hashCode() ^ - (the_symbol()==null ? 0 : the_symbol().hashCode()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - if (the_symbol() != null) - return super.toString() + the_symbol(); - else - return super.toString() + "$$MISSING-SYMBOL$$"; - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/symbol_set.java b/src/syntaxParser/java_cup/SAVE/symbol_set.java deleted file mode 100644 index f833792..0000000 --- a/src/syntaxParser/java_cup/SAVE/symbol_set.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.Hashtable; -import java.util.Enumeration; - -/** This class represents a set of symbols and provides a series of - * set operations to manipulate them. - * - * @see java_cup.symbol - */ -public class symbol_set { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Constructor for an empty set. */ - public symbol_set() { } - - /** Constructor for cloning from another set. - * @param other the set we are cloning from. - */ - public symbol_set(symbol_set other) throws internal_error - { - not_null(other); - _all = (Hashtable)other._all.clone(); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** A hash table to hold the set. Symbols are keyed using their name string. - */ - protected Hashtable _all = new Hashtable(11); - - /** Access to all elements of the set. */ - public Enumeration all() {return _all.elements();} - - /** size of the set */ - public int size() {return _all.size();} - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** Helper function to test for a null object and throw an exception - * if one is found. - * @param obj the object we are testing. - */ - protected void not_null(Object obj) throws internal_error - { - if (obj == null) - throw new internal_error("Null object used in set operation"); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if the set contains a particular symbol. - * @param sym the symbol we are looking for. - */ - public boolean contains(symbol sym) {return _all.containsKey(sym.name());} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if this set is an (improper) subset of another. - * @param other the set we are testing against. - */ - public boolean is_subset_of(symbol_set other) throws internal_error - { - not_null(other); - - /* walk down our set and make sure every element is in the other */ - for (Enumeration e = all(); e.hasMoreElements(); ) - if (!other.contains((symbol)e.nextElement())) - return false; - - /* they were all there */ - return true; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if this set is an (improper) superset of another. - * @param other the set we are are testing against. - */ - public boolean is_superset_of(symbol_set other) throws internal_error - { - not_null(other); - return other.is_subset_of(this); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add a single symbol to the set. - * @param sym the symbol we are adding. - * @return true if this changes the set. - */ - public boolean add(symbol sym) throws internal_error - { - Object previous; - - not_null(sym); - - /* put the object in */ - previous = _all.put(sym.name(),sym); - - /* if we had a previous, this is no change */ - return previous == null; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove a single symbol if it is in the set. - * @param sym the symbol we are removing. - */ - public void remove(symbol sym) throws internal_error - { - not_null(sym); - _all.remove(sym.name()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add (union) in a complete set. - * @param other the set we are adding in. - * @return true if this changes the set. - */ - public boolean add(symbol_set other) throws internal_error - { - boolean result = false; - - not_null(other); - - /* walk down the other set and do the adds individually */ - for (Enumeration e = other.all(); e.hasMoreElements(); ) - result = add((symbol)e.nextElement()) || result; - - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove (set subtract) a complete set. - * @param other the set we are removing. - */ - public void remove(symbol_set other) throws internal_error - { - not_null(other); - - /* walk down the other set and do the removes individually */ - for (Enumeration e = other.all(); e.hasMoreElements(); ) - remove((symbol)e.nextElement()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(symbol_set other) - { - if (other == null || other.size() != size()) return false; - - /* once we know they are the same size, then improper subset does test */ - try { - return is_subset_of(other); - } catch (internal_error e) { - /* can't throw the error (because super class doesn't), so we crash */ - e.crash(); - return false; - } - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof symbol_set)) - return false; - else - return equals((symbol_set)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Compute a hash code. */ - public int hashCode() - { - int result = 0; - int cnt; - Enumeration e; - - /* hash together codes from at most first 5 elements */ - for (e = all(), cnt=0 ; e.hasMoreElements() && cnt<5; cnt++) - result ^= ((symbol)e.nextElement()).hashCode(); - - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - String result; - boolean comma_flag; - - result = "{"; - comma_flag = false; - for (Enumeration e = all(); e.hasMoreElements(); ) - { - if (comma_flag) - result += ", "; - else - comma_flag = true; - - result += ((symbol)e.nextElement()).name(); - } - result += "}"; - - return result; - } - - /*-----------------------------------------------------------*/ - -} - - diff --git a/src/syntaxParser/java_cup/SAVE/terminal.java b/src/syntaxParser/java_cup/SAVE/terminal.java deleted file mode 100644 index 5a32ae8..0000000 --- a/src/syntaxParser/java_cup/SAVE/terminal.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java_cup.assoc; -import java.util.Hashtable; -import java.util.Enumeration; - -/** This class represents a terminal symbol in the grammar. Each terminal - * has a textual name, an index, and a string which indicates the type of - * object it will be implemented with at runtime (i.e. the class of object - * that will be returned by the scanner and pushed on the parse stack to - * represent it). - */ -public class terminal extends symbol { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Full constructor. - * @param nm the name of the terminal. - * @param tp the type of the terminal. - */ - public terminal(String nm, String tp, int precedence_side, int precedence_num) - { - /* superclass does most of the work */ - super(nm, tp); - - /* add to set of all terminals and check for duplicates */ - Object conflict = _all.put(nm,this); - if (conflict != null) - // can't throw an execption here because this is used in static - // initializers, so we do a crash instead - // was: - // throw new internal_error("Duplicate terminal (" + nm + ") created"); - (new internal_error("Duplicate terminal (" + nm + ") created")).crash(); - - /* assign a unique index */ - _index = next_index++; - - /* set the precedence */ - _precedence_num = precedence_num; - _precedence_side = precedence_side; - - /* add to by_index set */ - _all_by_index.put(new Integer(_index), this); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor for non-precedented terminal - */ - - public terminal(String nm, String tp) - { - this(nm, tp, assoc.no_prec, -1); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor with default type. - * @param nm the name of the terminal. - */ - public terminal(String nm) - { - this(nm, null); - } - - /*-----------------------------------------------------------*/ - /*------------------- Class Variables ---------------------*/ - /*-----------------------------------------------------------*/ - - private int _precedence_num; - private int _precedence_side; - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Table of all terminals. Elements are stored using name strings as - * the key - */ - protected static Hashtable _all = new Hashtable(); - - /** Access to all terminals. */ - public static Enumeration all() {return _all.elements();} - - /** Lookup a terminal by name string. */ - public static terminal find(String with_name) - { - if (with_name == null) - return null; - else - return (terminal)_all.get(with_name); - } - - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Table of all terminals indexed by their index number. */ - protected static Hashtable _all_by_index = new Hashtable(); - - /** Lookup a terminal by index. */ - public static terminal find(int indx) - { - Integer the_indx = new Integer(indx); - - return (terminal)_all_by_index.get(the_indx); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Total number of terminals. */ - public static int number() {return _all.size();} - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Static counter to assign unique index. */ - protected static int next_index = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Special terminal for end of input. */ - public static final terminal EOF = new terminal("EOF"); - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** special terminal used for error recovery */ - public static final terminal error = new terminal("error"); - - /*-----------------------------------------------------------*/ - /*--- General Methods ---------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Report this symbol as not being a non-terminal. */ - public boolean is_non_term() - { - return false; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to a string. */ - public String toString() - { - return super.toString() + "[" + index() + "]"; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** get the precedence of a terminal */ - public int precedence_num() { - return _precedence_num; - } - public int precedence_side() { - return _precedence_side; - } - - /** set the precedence of a terminal */ - public void set_precedence(int p, int new_prec) { - _precedence_side = p; - _precedence_num = new_prec; - } - - /*-----------------------------------------------------------*/ - -} diff --git a/src/syntaxParser/java_cup/SAVE/terminal_set.java b/src/syntaxParser/java_cup/SAVE/terminal_set.java deleted file mode 100644 index 56ec4d7..0000000 --- a/src/syntaxParser/java_cup/SAVE/terminal_set.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -import java.util.BitSet; - -/** A set of terminals implemented as a bitset. - */ -public class terminal_set { - - /*-----------------------------------------------------------*/ - /*--- Constructor(s) ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Constructor for an empty set. */ - public terminal_set() - { - /* allocate the bitset at what is probably the right size */ - _elements = new BitSet(terminal.number()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Constructor for cloning from another set. - * @param other the set we are cloning from. - */ - public terminal_set(terminal_set other) - throws internal_error - { - not_null(other); - _elements = (BitSet)other._elements.clone(); - } - - /*-----------------------------------------------------------*/ - /*--- (Access to) Static (Class) Variables ------------------*/ - /*-----------------------------------------------------------*/ - - /** Constant for the empty set. */ - public static final terminal_set EMPTY = new terminal_set(); - - /*-----------------------------------------------------------*/ - /*--- (Access to) Instance Variables ------------------------*/ - /*-----------------------------------------------------------*/ - - /** Bitset to implement the actual set. */ - protected BitSet _elements; - - /*-----------------------------------------------------------*/ - /*--- General Methods ----------------------------------------*/ - /*-----------------------------------------------------------*/ - - /** Helper function to test for a null object and throw an exception if - * one is found. - * @param obj the object we are testing. - */ - protected void not_null(Object obj) throws internal_error - { - if (obj == null) - throw new internal_error("Null object used in set operation"); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if the set is empty. */ - public boolean empty() - { - return equals(EMPTY); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if the set contains a particular terminal. - * @param sym the terminal symbol we are looking for. - */ - public boolean contains(terminal sym) - throws internal_error - { - not_null(sym); - return _elements.get(sym.index()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Given its index determine if the set contains a particular terminal. - * @param indx the index of the terminal in question. - */ - public boolean contains(int indx) - { - return _elements.get(indx); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if this set is an (improper) subset of another. - * @param other the set we are testing against. - */ - public boolean is_subset_of(terminal_set other) - throws internal_error - { - not_null(other); - - /* make a copy of the other set */ - BitSet copy_other = (BitSet)other._elements.clone(); - - /* and or in */ - copy_other.or(_elements); - - /* if it hasn't changed, we were a subset */ - return copy_other.equals(other._elements); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if this set is an (improper) superset of another. - * @param other the set we are testing against. - */ - public boolean is_superset_of(terminal_set other) - throws internal_error - { - not_null(other); - return other.is_subset_of(this); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add a single terminal to the set. - * @param sym the terminal being added. - * @return true if this changes the set. - */ - public boolean add(terminal sym) - throws internal_error - { - boolean result; - - not_null(sym); - - /* see if we already have this */ - result = _elements.get(sym.index()); - - /* if not we add it */ - if (!result) - _elements.set(sym.index()); - - return result; - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Remove a terminal if it is in the set. - * @param sym the terminal being removed. - */ - public void remove(terminal sym) - throws internal_error - { - not_null(sym); - _elements.clear(sym.index()); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Add (union) in a complete set. - * @param other the set being added. - * @return true if this changes the set. - */ - public boolean add(terminal_set other) - throws internal_error - { - not_null(other); - - /* make a copy */ - BitSet copy = (BitSet)_elements.clone(); - - /* or in the other set */ - _elements.or(other._elements); - - /* changed if we are not the same as the copy */ - return !_elements.equals(copy); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Determine if this set intersects another. - * @param other the other set in question. - */ - public boolean intersects(terminal_set other) - throws internal_error - { - not_null(other); - - /* make a copy of the other set */ - BitSet copy = (BitSet)other._elements.clone(); - - /* xor out our values */ - copy.xor(this._elements); - - /* see if its different */ - return !copy.equals(other._elements); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Equality comparison. */ - public boolean equals(terminal_set other) - { - if (other == null) - return false; - else - return _elements.equals(other._elements); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Generic equality comparison. */ - public boolean equals(Object other) - { - if (!(other instanceof terminal_set)) - return false; - else - return equals((terminal_set)other); - } - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Convert to string. */ - public String toString() - { - String result; - boolean comma_flag; - - result = "{"; - comma_flag = false; - for (int t = 0; t < terminal.number(); t++) - { - if (_elements.get(t)) - { - if (comma_flag) - result += ", "; - else - comma_flag = true; - - result += terminal.find(t).name(); - } - } - result += "}"; - - return result; - } - - /*-----------------------------------------------------------*/ - -} - diff --git a/src/syntaxParser/java_cup/SAVE/version.java b/src/syntaxParser/java_cup/SAVE/version.java deleted file mode 100644 index f829655..0000000 --- a/src/syntaxParser/java_cup/SAVE/version.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of Petascope. - * - * Petascope is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * Petascope is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Petascope. If not, see <http://www.gnu.org/licenses/>. - * - * For more information please see <http://www.Petascope.org> - * or contact Peter Baumann via <baumann@rasdaman.com>. - * - * Copyright 2009 Jacobs University Bremen, Peter Baumann. - */ - -package java_cup; - -/** This class contains version and authorship information. - * It contains only static data elements and basically just a central - * place to put this kind of information so it can be updated easily - * for each release. - * - * Version numbers used here are broken into 3 parts: major, minor, and - * update, and are written as v<major>.<minor>.<update> (e.g. v0.10a). - * Major numbers will change at the time of major reworking of some - * part of the system. Minor numbers for each public release or - * change big enough to cause incompatibilities. Finally update - * letter will be incremented for small bug fixes and changes that - * probably wouldn't be noticed by a user. - */ - -public class version { - /** The major version number. */ - public static final int major = 0; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The minor version number. */ - public static final int minor = 10; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The update letter. */ - public static final char update = 'k'; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** String for the current version. */ - public static final String version_str = "v" + major + "." + minor + update; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Full title of the system */ - public static final String title_str = "CUP " + version_str; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** Name of the author */ - public static final String author_str = - "Scott E. Hudson, Frank Flannery, and C. Scott Ananian"; - - /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ - - /** The command name normally used to invoke this program */ - public static final String program_name = "java_cup"; -} |
