1optional_indent(Data,Indent,Data1) -->
    2	    {
    3                indent_data(Indent,Data,Data1)
    4        },
    5        optional_indent(Data,Indent),!.
    6
    7statement(Data,Type1,function(Name,Type,Params1,Body)) -->
    8        %put this at the beginning of each statement without a semicolon
    9		namespace(Data,Data1,Name1,Indent),
   10		function_(Data,[
   11			function_name(Data,Type,Name,Params1),
   12			type(Data,Type),
   13			parameters(Data1,Params1),
   14			statements(Data1,Type,Body),
   15			Indent
   16		]),!.
   17
   18%java-like class statements
   19statement(Data,Name,class(Name,Body)) -->
   20		optional_indent(Data,Indent,Data1),
   21		class_(Data,[
   22		        symbol(Name),
   23                class_statements(Data1,Name,Body),
   24				Indent
   25		]),!.
   26
   27statement(Data,C1,class_extends(C2,B)) -->
   28        namespace(Data,Data1,C1,Indent),
   29        class_extends_(Data,[
   30			    symbol(C1),
   31                symbol(C2),
   32                class_statements(Data1,C1,B),
   33                Indent
   34        ]),!.
   35
   36statement(Data,Return_type,semicolon(A)) -->
   37		{Data = [_,_,_,Indent],offside_rule_langs(Offside_rule_langs)},
   38        optional_indent(Data,Indent,_),
   39        semicolon_(Data,[
   40			statement_with_semicolon(Data,Return_type,A)
   41		]),!.
   42
   43statement(Data,Return_type,for(Statement1,Expr,Statement2,Body)) -->
   44        optional_indent(Data,Indent,Data1),
   45        for_(Data,[
   46			    statement_with_semicolon(Data,Return_type,Statement1),
   47                expr(Data,bool,Expr),
   48                statement_with_semicolon(Data,Return_type,Statement2),
   49                statements(Data1,Return_type,Body),
   50				Indent
   51		]),!.
   52
   53statement(Data,Return_type,foreach_with_index(Array,Var,Index,Body,Type)) -->
   54        optional_indent(Data,Indent,Data1),
   55        foreach_with_index_(Data,[
   56			    expr(Data,[array,Type],Array),
   57                var_name_(Data,Type,Var),
   58                expr(Data,int,Index),
   59                type(Data,Type),
   60                statements(Data1,Return_type,Body),
   61				Indent
   62		]),!.
   63
   64statement(Data,Return_type,foreach(Array,Var,Body,Type)) -->
   65        optional_indent(Data,Indent,Data1),
   66        foreach_(Data,[
   67                expr(Data,[array,Type],Array),
   68                var_name_(Data,Type,Var),
   69                type(Data,Type),
   70                statements(Data1,Return_type,Body),
   71				Indent
   72		]),!.
   73
   74statement(Data,Return_type,try_catch(Body1,Name,Body2)) -->
   75        optional_indent(Data,Indent,Data1),
   76        try_catch_(Data,[
   77			statements(Data1,Return_type,Body1),
   78			var_name_(Data1,int,Name),
   79			statements(Data1,Return_type,Body2),
   80			Indent
   81		]),!.
   82
   83statement(Data,Return_type,while(Expr,Body)) -->
   84        optional_indent(Data,Indent,Data1),
   85        while_(Data,[
   86			expr(Data,bool,Expr),
   87			statements(Data1,Return_type,Body),
   88			Indent
   89		]),!.
   90
   91statement(Data,Return_type,do_while(Expr,Body)) -->
   92        optional_indent(Data,Indent,Data1),
   93        do_while_(Data,[
   94			expr(Data,bool,Expr),
   95			statements(Data1,Return_type,Body),
   96			Indent
   97		]),!.
   98
   99
  100statement(Data,Return_type,if(Expr_,Statements_,Elif_or_else_,Else_)) -->
  101        optional_indent(Data,Indent,Data1),
  102        if(Data,[
  103                expr(Data,bool,Expr_),
  104                statements(Data1,Return_type,Statements_),
  105                elif_statements(Data,Return_type,Elif_or_else_),
  106                else(Data,Return_type,Else_),
  107				Indent
  108        ]),!.
  109
  110statement(Data,Return_type,if_without_else(Expr_,Statements_,Elif_or_else_,Else_)) -->
  111        optional_indent(Data,Indent,Data1),
  112        if_without_else_(Data,[
  113                expr(Data,bool,Expr_),
  114                statements(Data1,Return_type,Statements_),
  115				Indent
  116        ]),!.
  117
  118statement(Data,Return_type, switch(Expr_,Expr1_,Statements_,Case_or_default_)) -->
  119		optional_indent(Data,Indent,Data1),
  120		switch_(Data,[
  121			parentheses_expr(Data,int,Expr_),
  122			first_case(Data1,Return_type,Expr_,int,[Expr1_,Statements_,Case_or_default_]),
  123			Indent
  124		]),!