has a hack on java_cup parser generator: divides a gigantic do_action method into...
authoryeom <yeom>
Tue, 26 Apr 2011 22:44:26 +0000 (22:44 +0000)
committeryeom <yeom>
Tue, 26 Apr 2011 22:44:26 +0000 (22:44 +0000)
13 files changed:
Robust/cup/java_cup/CUP$parser$actions.class
Robust/cup/java_cup/Main.class
Robust/cup/java_cup/emit.class
Robust/cup/java_cup/emit.java
Robust/cup/java_cup/lalr_item.class
Robust/cup/java_cup/lalr_item_set.class
Robust/cup/java_cup/lalr_state.class
Robust/cup/java_cup/lexer.class
Robust/cup/java_cup/lr_item_core.class
Robust/cup/java_cup/non_terminal.class
Robust/cup/java_cup/parse_action_table.class
Robust/cup/java_cup/production.class
Robust/cup/java_cup/symbol_set.class

index 7941685..b0b50b0 100644 (file)
Binary files a/Robust/cup/java_cup/CUP$parser$actions.class and b/Robust/cup/java_cup/CUP$parser$actions.class differ
index fb7c764..2947306 100644 (file)
Binary files a/Robust/cup/java_cup/Main.class and b/Robust/cup/java_cup/Main.class differ
index f17bf08..d465825 100644 (file)
Binary files a/Robust/cup/java_cup/emit.class and b/Robust/cup/java_cup/emit.class differ
index 9db9014..f8d0434 100644 (file)
@@ -1,6 +1,11 @@
 package java_cup;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
 import java.util.Stack;
 import java.util.Enumeration;
 import java.util.Date;
@@ -312,8 +317,6 @@ public class emit {
   protected static void emit_action_code(PrintWriter out, production start_prod)
     throws internal_error
     {
-      production prod;
-
       long start_time = System.currentTimeMillis();
 
       /* class header */
@@ -359,15 +362,67 @@ public class emit {
       out.println("      java_cup.runtime.Symbol " + pre("result") + ";");
       out.println();
 
+      // hack: divide a production table into halves and generates two methods of switch cases
+      // since we have an issue with Java 64K size limitation.      
+      int median=production.number()/2;   
+      // divide production table 
+      List firsthalf=new ArrayList();
+      List secondhalf=new ArrayList();
+      for(int i=0;i<median;i++){
+        firsthalf.add(production.find(i));
+      }      
+      for(int i=median;i<production.number();i++){
+        secondhalf.add(production.find(i));
+      }   
+      
+      // invoke emit_switch_code
+      out.println("    if("+pre("act_num")+" < "+median+" )");
+      out.println("       "+pre("result=")+pre("do_action")+"_1("+ pre("act_num,") +pre("parser,")+ pre("stack,")+ pre("top)")+";");
+      out.println("    else");
+      out.println("       "+pre("result=")+pre("do_action")+"_2("+ pre("act_num,") +pre("parser,") +pre("stack,")+ pre("top)")+";");
+      
+      out.println();
+      out.println("     return "+pre("result")+";");
+      out.println("     }");
+      out.println();
+      
+      emit_switch_code(1,out,start_prod,firsthalf);      
+      emit_switch_code(2,out,start_prod,secondhalf);
+      
+      /* end of class */
+      out.println("}");
+      out.println();
+      
+      action_code_time = System.currentTimeMillis() - start_time;
+    }
+  
+  protected static void emit_switch_code(int funcIdx, PrintWriter out, production start_prod, List prodList)   throws internal_error{
+   
+
+    out.println("  /** Method with the generated switch code. */");
+    out.println("  public final java_cup.runtime.Symbol " + 
+       pre("do_action")+"_"+funcIdx + "(");
+    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("    {");
+    
+    out.println("      /* Symbol object for return from actions */");
+    out.println("      java_cup.runtime.Symbol " + pre("result") + ";");
+    out.println();
+    
+    production prod;
+
       /* 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();
+ for (Iterator iterator = prodList.iterator(); iterator.hasNext();) {
+     prod = (production) iterator.next();
 
          /* case label */
           out.println("          /*. . . . . . . . . . . . . . . . . . . .*/");
@@ -467,15 +522,10 @@ public class emit {
                                  "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;
     }
 
   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
index 275e77e..2d539f9 100644 (file)
Binary files a/Robust/cup/java_cup/lalr_item.class and b/Robust/cup/java_cup/lalr_item.class differ
index 5ba11c5..ff55488 100644 (file)
Binary files a/Robust/cup/java_cup/lalr_item_set.class and b/Robust/cup/java_cup/lalr_item_set.class differ
index 79705a2..ce9b2bd 100644 (file)
Binary files a/Robust/cup/java_cup/lalr_state.class and b/Robust/cup/java_cup/lalr_state.class differ
index e633ff2..87e0073 100644 (file)
Binary files a/Robust/cup/java_cup/lexer.class and b/Robust/cup/java_cup/lexer.class differ
index e5988e7..047e002 100644 (file)
Binary files a/Robust/cup/java_cup/lr_item_core.class and b/Robust/cup/java_cup/lr_item_core.class differ
index 88d8183..ba6079c 100644 (file)
Binary files a/Robust/cup/java_cup/non_terminal.class and b/Robust/cup/java_cup/non_terminal.class differ
index f30b638..43bfea8 100644 (file)
Binary files a/Robust/cup/java_cup/parse_action_table.class and b/Robust/cup/java_cup/parse_action_table.class differ
index e689e1c..eb46236 100644 (file)
Binary files a/Robust/cup/java_cup/production.class and b/Robust/cup/java_cup/production.class differ
index f26071a..903718d 100644 (file)
Binary files a/Robust/cup/java_cup/symbol_set.class and b/Robust/cup/java_cup/symbol_set.class differ