summaryrefslogtreecommitdiff
path: root/test/trans.d/trans-java.lm
diff options
context:
space:
mode:
Diffstat (limited to 'test/trans.d/trans-java.lm')
-rw-r--r--test/trans.d/trans-java.lm346
1 files changed, 346 insertions, 0 deletions
diff --git a/test/trans.d/trans-java.lm b/test/trans.d/trans-java.lm
new file mode 100644
index 00000000..99c1b486
--- /dev/null
+++ b/test/trans.d/trans-java.lm
@@ -0,0 +1,346 @@
+int rw_java_factor( Factor: indep::factor )
+{
+ if match Factor [`first_token_char]
+ {
+ send Out "data\[ts\]"
+ }
+ else if match Factor [tk_ident `[ expr `]]
+ {
+ send Out
+ "[$Factor.tk_ident]\[ [rw_java_expr(Factor.expr)] \]
+ }
+ else if match Factor [tk_ident `( expr `)]
+ {
+ send Out
+ "[$Factor.tk_ident]( [rw_java_expr(Factor.expr)] )
+ }
+ elsif match Factor [`< type `> `( expr `)]
+ {
+ send Out
+ "( [rw_java_type(Factor.type)] ) ( [rw_java_expr(Factor.expr)] )
+ }
+ elsif match Factor [`( expr `)]
+ {
+ send Out
+ "( [rw_java_expr(Factor.expr)] )
+ }
+ elsif match Factor ['true']
+ {
+ send Out '1'
+ }
+ elsif match Factor ['false']
+ {
+ send Out '0'
+ }
+ elsif match Factor [`buffer]
+ {
+ send Out
+ "new String( buffer, 0, blen )"
+ }
+ else
+ {
+ send Out [$Factor]
+ }
+}
+
+void rw_java_type( Type: indep::type )
+{
+ if match Type [`int]
+ {
+ send Out "int"
+ }
+ elsif match Type [`bool]
+ {
+ send Out "int"
+ }
+ elsif match Type [`char]
+ {
+ send Out "char"
+ }
+ elsif match Type [`ptr]
+ {
+ send Out "int
+ }
+ elsif match Type [`byte]
+ {
+ send Out "unsigned char"
+ }
+}
+
+void rw_java_abs_expr( Expr: indep::abs_expr )
+{
+ if ( Expr.Op ) {
+ send Out
+ "[rw_java_abs_expr(Expr.E1)] [$Expr.Op] [rw_java_abs_expr( Expr.E2 )]"
+ }
+ else {
+ rw_java_factor( Expr.factor )
+ }
+}
+
+void rw_java_expr( Expr: indep::expr )
+{
+ AbsExpr: indep::abs_expr = indep::abs_comparative( Expr.comparative )
+ rw_java_abs_expr( AbsExpr )
+}
+
+void rw_java_opt_array( OptArr: indep::opt_arr, Type: indep::type )
+{
+ if OptArr.expr {
+ send Out "\[\] = new [rw_java_type( Type )]\[[rw_java_expr( OptArr.expr )]\]"
+ }
+}
+
+int rw_java_var_decl( VarDecl: indep::var_decl )
+{
+ send Out
+ "[rw_java_type( VarDecl.type )] [$VarDecl.tk_ident] [rw_java_opt_array(VarDecl.opt_arr, VarDecl.type)];
+}
+
+void rw_java_opt_sub( OptSub: indep::opt_sub )
+{
+ if ( OptSub.expr )
+ send Out "\[[rw_java_expr(OptSub.expr)]\]"
+}
+
+int rw_java_expr_stmt( ExprStmt: indep::expr_stmt )
+{
+ if match ExprStmt [tk_ident opt_sub `= expr `;]
+ {
+ send Out
+ "[$ExprStmt.tk_ident rw_java_opt_sub(ExprStmt.opt_sub)] = [rw_java_expr(ExprStmt.expr)];
+ }
+ else if match ExprStmt [expr `;]
+ {
+ send Out
+ "[rw_java_expr(ExprStmt.expr)];
+ }
+}
+
+int rw_java_if_stmt( IfStmt: indep::if_stmt )
+{
+ send Out
+ "if ( [rw_java_expr( IfStmt.expr )] )
+ "{
+ " [rw_java_stmt_list( IfStmt._repeat_stmt )]
+ "}
+
+ if ( IfStmt.opt_else._repeat_stmt ) {
+ send Out
+ "else {
+ " [rw_java_stmt_list( IfStmt.opt_else._repeat_stmt )]
+ "}
+ }
+}
+
+int rw_java_print_stmt( Stmt: indep::print_stmt )
+{
+ if match Stmt [`print_int expr `;] {
+ send Out
+ "System.out.print( [rw_java_expr(Stmt.expr)] );
+ }
+ else if match Stmt [`print_buf E1: expr `, E2: expr `;]
+ {
+ send Out
+ "_s = new String( [rw_java_expr(E1)], 0, [rw_java_expr(E2)] );
+ "System.out.print( _s );
+ }
+ else if match Stmt [`print_str expr `;]
+ {
+ send Out
+ "System.out.print( [rw_java_expr( Stmt.expr )] );
+ }
+ else if match Stmt [`print_token `;]
+ {
+ send Out
+ "_s = new String( data, ts, te - ts );
+ "System.out.print( _s );
+ }
+}
+
+void rw_java_buf_stmt( BufStmt: indep::buf_stmt )
+{
+ switch BufStmt
+ case [`buf_clear `( `) `;] {
+ send Out
+ " blen = 0;
+ }
+ case [`buf_append `( `) `;] {
+ send Out
+ " buffer\[blen\] = fc;
+ " blen += 1;
+ }
+}
+
+
+int rw_java_ragel_stmt( Stmt: indep::ragel_stmt )
+{
+ send Out
+ [$Stmt]
+}
+
+int rw_java_stmt( Stmt: indep::stmt )
+{
+ if match Stmt [var_decl]
+ rw_java_var_decl( Stmt.var_decl )
+ else if match Stmt [expr_stmt]
+ rw_java_expr_stmt( Stmt.expr_stmt )
+ else if match Stmt [if_stmt]
+ rw_java_if_stmt( Stmt.if_stmt )
+ else if match Stmt [print_stmt]
+ rw_java_print_stmt( Stmt.print_stmt )
+ else if match Stmt [buf_stmt]
+ rw_java_buf_stmt( Stmt.buf_stmt )
+ else if match Stmt [ragel_stmt]
+ rw_java_ragel_stmt( Stmt.ragel_stmt )
+}
+
+void rw_java_stmt_list( StmtList: indep::stmt* )
+{
+ for Stmt: indep::stmt in repeat( StmtList )
+ rw_java_stmt( Stmt )
+}
+
+int rw_java_action_block( ActionBlock: indep::action_block )
+{
+ Out = new parser<out_code::lines>()
+ if match ActionBlock [`{ stmt* `}] {
+ send Out
+ "{[rw_java_stmt_list( ActionBlock._repeat_stmt )]}
+ }
+ else if match ActionBlock [`{ expr `}] {
+ send Out
+ "{[rw_java_expr( ActionBlock.expr )]}
+ }
+ send Out [] eos
+}
+
+void rw_java( Output: stream )
+{
+ # Translate action blocks.
+ Section: indep::section = RagelTree.section
+ for Action: ragel::action_block in Section {
+ # Reparse as lang-independent code.
+ parse IndepActionBlock: indep::action_block[$Action]
+ if ( !IndepActionBlock ) {
+ print( error, '\n', Action )
+ exit(1)
+ }
+
+ rw_java_action_block( IndepActionBlock )
+
+ # Reparse back to ragel action block.
+ Action = parse ragel::action_block[$Out->tree]
+ if ( !Action ) {
+ print( error, '\n' )
+ exit(1)
+ }
+ }
+
+ send Output
+ "/*
+ " * @LANG: java
+ " * @GENERATED: true
+
+ if ProhibitGenflags {
+ send Output
+ " * @PROHIBIT_GENFLAGS:[ProhibitGenflags]
+ }
+
+ send Output
+ " */
+ "
+ "
+ "class [ClassName]
+ "{
+
+ Init: indep::stmt* = RagelTree.Init
+ for Stmt: indep::stmt in Init {
+ if match Stmt [Decl: var_decl] {
+ Out = new parser<out_code::lines>()
+ rw_java_var_decl( Decl )
+ send Out [] eos
+ send Output [Out->tree]
+ }
+ }
+
+ send Output
+ "
+ "[@Section]
+ "
+ "%% write data;
+ "int cs;
+ "
+ "void init()
+ "{
+
+ for Stmt: indep::stmt in Init {
+ if match Stmt [ExprStmt: expr_stmt] {
+ Out = new parser<out_code::lines>()
+ rw_java_expr_stmt( ExprStmt )
+ send Out [] eos
+ send Output [Out->tree]
+ }
+ }
+
+ send Output
+ " %% write init;
+ "}
+ "
+ "void exec( char data\[\], int len )
+ "{
+ " char buffer \[\] = new char\[1024\];
+ " int blen = 0;
+ " int p = 0;
+ " int pe = len;
+ "
+
+ if NeedsEof {
+ send Output
+ " int eof = len;
+ }
+
+ send Output
+ " String _s;
+ " %% write exec;
+ "}
+ "
+ "void finish( )
+ "{
+ " if ( cs >= [MachineName.word]_first_final )
+ " System.out.println( \"ACCEPT\" );
+ " else
+ " System.out.println( \"FAIL\" );
+ "}
+ "
+
+ send Output
+ "static final String inp\[\] = {
+
+ NR: int = 0
+ for InputString: indep::input_string in RagelTree {
+ send Output
+ [^InputString ",\n"]
+ NR = NR + 1
+ }
+
+ send Output
+ "};
+ "
+
+ send Output
+ "static final int inplen = [NR];
+ "
+
+ send Output
+ "public static void main (String\[\] args)
+ "{
+ " [ClassName] machine = new [ClassName]();
+ " for ( int i = 0; i < inplen; i++ ) {
+ " machine.init();
+ " machine.exec( inp\[i\].toCharArray(), inp\[i\].length() );
+ " machine.finish();
+ " }
+ "}
+ "}
+}