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