[PATCH]: improvements to rlgen-java
David Waite
dwa... at gmail.com
Wed Dec 26 20:32:50 UTC 2007
The following patch changes the Java generation a bit:
- Array row/max are changed slightly to 12/8184 based on 80 column
display. This was just my own preference (some might prefer 10
columns, some would prefer the power-of-2-edness of 8 columns). Toss
it if desired.
- Arrays are generated with an array constructor rather than a large
block of statement constructors. This reduced my packaged JAR size by
14k for a relatively simple JSON vocabulary with 68 states.
- Arrays are generated with whitespace padding in code for
readability.
- Array overflow (over the SAIIC limit) is done by creating multiple
functions with numbered prefixes, then generating a combine_<name>
function which builds a new array using new and arraycopy over all the
previous init_<name>_<number> functions.
-David Waite
Index: rlgen-java/javacodegen.cpp
===================================================================
--- rlgen-java/javacodegen.cpp (revision 346)
+++ rlgen-java/javacodegen.cpp (working copy)
@@ -28,11 +28,11 @@
#include <sstream>
/* Integer array line length. */
-#define IALL 8
+#define IALL 12
/* Static array initialization item count
* (should be multiple of IALL). */
-#define SAIIC 8192
+#define SAIIC 8184
#define _resume 1
#define _again 2
@@ -40,11 +40,11 @@
#define _test_eof 4
#define _out 5
-using std::ostream;
+using std::setw;
+using std::ios;
using std::ostringstream;
using std::string;
using std::cerr;
-using std::endl;
void lineDirective( ostream &out, char *fileName, int line )
{
@@ -1125,54 +1125,59 @@
item_count = 0;
div_count = 1;
- out <<
- "private static void init_" << name << "_0( " << type << "[] r )\n"
- "{\n\t";
-
+ out << "private static " << type << "[] init_" << name << "_0( )\n"
+ "{\n\t"
+ "return new " << type << " [] {\n\t";
return out;
}
std::ostream &JavaTabCodeGen::ARRAY_ITEM( string item, bool last )
{
- out << "r[" << item_count << "]=" << item << "; ";
+ item_count++;
- item_count += 1;
+ out << setw(5) << setiosflags(ios::right) << item;
if ( !last ) {
if ( item_count % SAIIC == 0 ) {
- out << "\n}\n\n";
- out << "private static void init_" << array_name << "_" <<
div_count <<
- "( " << array_type << "[] r )\n{\n\t";
- div_count += 1;
+ out << "\n\t};\n};\n"
+ "private static "<< array_type << "[] init_" <<
+ array_name << "_" << div_count << "( )\n"
+ "{\n\t"
+ "return new " << array_type << " [] {\n\t";
+ div_count++;
+ } else if (item_count % IALL == 0) {
+ out << ",\n\t";
+ } else {
+ out << ",";
}
- else if ( item_count % IALL == 0 )
- out << "\n\t";
}
-
return out;
}
std::ostream &JavaTabCodeGen::CLOSE_ARRAY()
{
- out << "\n}\n\n";
+ out << "\n\t};\n}\n\n";
- out <<
- "private static " << array_type << "[] create_" << array_name <<
"( )\n"
- "{\n"
- " " << array_type << "[] r = new " << array_type << "[" <<
item_count << "];\n";
-
- for ( int i = 0; i < div_count; i++ )
- out << " init_" << array_name << "_" << i << "( r );\n";
-
- out <<
- " return r;\n"
- "}\n"
- "\n";
-
- out <<
- "private static final " << array_type << " " << array_name <<
- "[] = create_" << array_name << "();\n\n";
-
+ if (item_count < SAIIC) {
+ out << "private static final " << array_type << " " << array_name
<<
+ "[] = init_" << array_name << "_0();\n\n";
+ } else {
+ out << "private static final " << array_type << " [] combine_" <<
array_name
+ << " () {\n\t"
+ << array_type << " [] combined = new " << array_type <<
+ " [ " << item_count << " ];\n\t";
+ int block = 0;
+ int max_block = item_count / SAIIC;
+ for (;block < max_block; ++block) {
+ out << "System.arraycopy ( init_" << array_name << "_" << block
<<
+ " ( ), 0, combined, " << SAIIC * block << ", " << SAIIC << " );\n
\t";
+ }
+ out << "System.arraycopy ( init_" << array_name << "_" << block <<
+ " ( ), 0, combined, " << SAIIC * block << ", " << (item_count %
SAIIC) << " );\n\t";
+ out << "return combined;\n}\n";
+ out << "private static final " << array_type << " [] " <<
array_name <<
+ " = combine_" << array_name << "();";
+ }
return out;
}
More information about the ragel-users
mailing list