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