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 79416853b16d91deed0d225981d03f5a84c3079c..b0b50b077f36e348116bf610bd20d2eff88b8d6c 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 fb7c76448ccae81ebe0dccac95424f79ba48e445..2947306e324e8213e60c712e4987b32ebd42931a 100644 (file)
Binary files a/Robust/cup/java_cup/Main.class and b/Robust/cup/java_cup/Main.class differ
index f17bf08cd85647a0f5c97dd3d0462e1bf5d36928..d465825c1599b16fdd1f5cead1824b49ff52a13a 100644 (file)
Binary files a/Robust/cup/java_cup/emit.class and b/Robust/cup/java_cup/emit.class differ
index 9db9014ab4cb9513dc93978f7a89dc6b1233105d..f8d04346a7d1d40b572e0ad8705381acc80f1cf3 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 275e77eeb7fbaa4f632192c2049f8bd8e3d751ae..2d539f93bc017b708b428c81a2329971556e6a41 100644 (file)
Binary files a/Robust/cup/java_cup/lalr_item.class and b/Robust/cup/java_cup/lalr_item.class differ
index 5ba11c5f62d65a2f98ce521f9ca256b3d8561f6d..ff554882d34797b0220c0e1597e85276195e3794 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 79705a2547ca604441e5f1621e15be251f73520b..ce9b2bd33d028a16b09c702ce8e5388dcb1296ca 100644 (file)
Binary files a/Robust/cup/java_cup/lalr_state.class and b/Robust/cup/java_cup/lalr_state.class differ
index e633ff282a6d27e856a76e888110dfa377d78340..87e007345ed7ea03d4309c0fec70a27948e4ff52 100644 (file)
Binary files a/Robust/cup/java_cup/lexer.class and b/Robust/cup/java_cup/lexer.class differ
index e5988e7fe2a1abd5975bf4523a4001d325911ac4..047e002ae77c8cdb52a47e1907a04133fc1bd82a 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 88d8183d47aabd1996554613763d8ed4bf167b1c..ba6079c22faf45d34e071c389cecc3430b5573ef 100644 (file)
Binary files a/Robust/cup/java_cup/non_terminal.class and b/Robust/cup/java_cup/non_terminal.class differ
index f30b638bd5d067e882735c928c70ec64b00ab857..43bfea81ddb97ab6107c56c22e9087b589009851 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 e689e1c78b2838a40eb4619c299d3b22ef2046d6..eb46236404be7e2076a5b9fc488920bb093b44b5 100644 (file)
Binary files a/Robust/cup/java_cup/production.class and b/Robust/cup/java_cup/production.class differ
index f26071a1cd2d99d8926c85b0d4d61e61c3f3675f..903718d3f734ea8a0849d3db9c988e1e04402f2f 100644 (file)
Binary files a/Robust/cup/java_cup/symbol_set.class and b/Robust/cup/java_cup/symbol_set.class differ