]> git.saurik.com Git - bison.git/commitdiff
Work around Java's ``code too large'' problem for parser tables.
authorDi-an Jan <dianj@freeshell.org>
Mon, 10 Nov 2008 13:34:36 +0000 (14:34 +0100)
committerPaolo Bonzini <bonzini@gnu.org>
Mon, 10 Nov 2008 13:34:53 +0000 (14:34 +0100)
* data/java.m4 (b4_typed_parser_table, b4_integral_parser_table): New.
* data/lalr1.java (yypact_, yydefact_, yypgoto_, yydefgoto_,
yytable_, yycheck_, yystos_, yytoken_number_, yyr1_, yyr2_, yyrhs_
yyprhs_, yyrline_, yytranslate_table_): Use b4_integral_parser_table.
(yytname_): Use b4_typed_parser_table.
* doc/bison.texinfo (Java Bison Interface): Add note on Java's
``code too large'' error.

ChangeLog
data/java.m4
data/lalr1.java
doc/bison.texinfo

index cadffe54e1075d70f7247710ee7674af8247919d..1af3ef25f3aac57857a5738fc193c924b0a011c9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-11-10  Di-an Jan  <dianj@freeshell.org>
+
+       Workaround Java's ``code too large'' problem for parser tables
+       in most cases, by using one function per initialization.
+       * data/java.m4 (b4_typed_parser_table, b4_integral_parser_table): New.
+       * data/lalr1.java (yypact_, yydefact_, yypgoto_, yydefgoto_,
+       yytable_, yycheck_, yystos_, yytoken_number_, yyr1_, yyr2_, yyrhs_
+       yyprhs_, yyrline_, yytranslate_table_): Use b4_integral_parser_table.
+       (yytname_): Use b4_typed_parser_table.
+       * doc/bison.texinfo (Java Bison Interface): Add note on Java's
+       ``code too large'' error.
+
 2008-11-10  Di-an Jan  <dianj@freeshell.org>
 
        * NEWS: Document them.
index 9c2835d86c59a8e5b06c7e18b6f5e691ad880409..fc8f86806ffe2aa9b45aab21123bd45d51a1235a 100644 (file)
@@ -117,6 +117,25 @@ m4_define([b4_int_type_for],
 m4_define([b4_null], [null])
 
 
+# b4_typed_parser_table(TYPE, NAME, DATA)
+# ---------------------------------------
+m4_define([b4_typed_parser_table],
+[[private static final ]$1[ $2[] = $2init();
+  private static final ]$1[[] $2init()
+  {
+    return new ]$1[[]
+    {
+  ]$3[
+    };
+  }]])
+
+
+# b4_integral_parser_table(NAME, DATA)
+#-------------------------------------
+m4_define([b4_integral_parser_table],
+[b4_typed_parser_table([b4_int_type_for([$2])], [$1], [$2])])
+
+
 ## ------------------------- ##
 ## Assigning token numbers.  ##
 ## ------------------------- ##
index f09667c2da10de496aedf80df3ab815897dff26f..3358545d226afd5bc104ab4173434ec8847a9458 100644 (file)
@@ -762,104 +762,55 @@ m4_popdef([b4_at_dollar])])dnl
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
   private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
-  private static final ]b4_int_type_for([b4_pact])[ yypact_[] =
-  {
-    ]b4_pact[
-  };
+  ]b4_integral_parser_table([yypact_], [b4_pact])[
 
   /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
      doesn't specify something else to do.  Zero means the default is an
      error.  */
-  private static final ]b4_int_type_for([b4_defact])[ yydefact_[] =
-  {
-    ]b4_defact[
-  };
+  ]b4_integral_parser_table([yydefact_], [b4_defact])[
 
   /* YYPGOTO[NTERM-NUM].  */
-  private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] =
-  {
-    ]b4_pgoto[
-  };
+  ]b4_integral_parser_table([yypgoto_], [b4_pgoto])[
 
   /* YYDEFGOTO[NTERM-NUM].  */
-  private static final ]b4_int_type_for([b4_defgoto])[
-  yydefgoto_[] =
-  {
-    ]b4_defgoto[
-  };
+  ]b4_integral_parser_table([yydefgoto_], [b4_defgoto])[
 
   /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
      positive, shift that token.  If negative, reduce the rule which
      number is the opposite.  If zero, do what YYDEFACT says.  */
   private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
-  private static final ]b4_int_type_for([b4_table])[
-  yytable_[] =
-  {
-    ]b4_table[
-  };
+  ]b4_integral_parser_table([yytable_], [b4_table])[
 
   /* YYCHECK.  */
-  private static final ]b4_int_type_for([b4_check])[
-  yycheck_[] =
-  {
-    ]b4_check[
-  };
+  ]b4_integral_parser_table([yycheck_], [b4_check])[
 
   /* STOS_[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
-  private static final ]b4_int_type_for([b4_stos])[
-  yystos_[] =
-  {
-    ]b4_stos[
-  };
+  ]b4_integral_parser_table([yystos_], [b4_stos])[
 
   /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
      to YYLEX-NUM.  */
-  private static final ]b4_int_type_for([b4_toknum])[
-  yytoken_number_[] =
-  {
-    ]b4_toknum[
-  };
+  ]b4_integral_parser_table([yytoken_number_], [b4_toknum])[
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-  private static final ]b4_int_type_for([b4_r1])[
-  yyr1_[] =
-  {
-    ]b4_r1[
-  };
+  ]b4_integral_parser_table([yyr1_], [b4_r1])[
 
   /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-  private static final ]b4_int_type_for([b4_r2])[
-  yyr2_[] =
-  {
-    ]b4_r2[
-  };
+  ]b4_integral_parser_table([yyr2_], [b4_r2])[
 
   /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
      First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
-  private static final String yytname_[] =
-  {
-    ]b4_tname[
-  };
+  ]b4_typed_parser_table([String], [yytname_], [b4_tname])[
 
   /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-  private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] =
-  {
-    ]b4_rhs[
-  };
+  ]b4_integral_parser_table([yyrhs_], [b4_rhs])[
 
   /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
      YYRHS.  */
-  private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] =
-  {
-    ]b4_prhs[
-  };
+  ]b4_integral_parser_table([yyprhs_], [b4_prhs])[
 
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-  private static final ]b4_int_type_for([b4_rline])[ yyrline_[] =
-  {
-    ]b4_rline[
-  };
+  ]b4_integral_parser_table([yyrline_], [b4_rline])[
 
   // Report on the debug stream that the rule yyrule is going to be reduced.
   private void yy_reduce_print (int yyrule, YYStack yystack)
@@ -882,10 +833,7 @@ m4_popdef([b4_at_dollar])])dnl
   }
 
   /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-  private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] =
-  {
-    ]b4_translate[
-  };
+  ]b4_integral_parser_table([yytranslate_table_], [b4_translate])[
 
   private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
   {
index d61d0b7f12dd88e3f3e9c3923d55fbbb175c2740..ae3dc4b014d55f104072a921aa4f36561717a5f2 100644 (file)
@@ -8854,6 +8854,12 @@ if needed.  Also, in the future the
 @code{%token-table} directive might enable a public interface to
 access the token names and codes.
 
+Getting a ``code too large'' error from the Java compiler means the code
+hit the 64KB bytecode per method limination of the Java class file.
+Try reducing the amount of code in actions and static initializers;
+otherwise, report a bug so that the parser skeleton will be improved.
+
+
 @node Java Semantic Values
 @subsection Java Semantic Values
 @c - No %union, specify type in %type/%token.