//
// Generated by JTB 1.2.2
//

options {
   STATIC = false;
   JAVA_UNICODE_ESCAPE = true;
}

PARSER_BEGIN(JavaTreeParser)
package xtc.lang.javacc;

import xtc.lang.javacc.syntaxtree.*;
import java.util.Vector;


public class JavaTreeParser 
{
   public static void main(String[] args)
   {
      JavaTreeParser parser;
      String filename = null;
      long initTime = 0;
      long parseTime = 0;
      long startTime = 0;
      long stopTime = 0;
      if ( args.length == 0 )
      {
         System.out.println("Java Parser Version 1.1 (for Java1.4 code):  Reading from standard input . . .");
         parser = new JavaTreeParser(System.in);
      }
      else
         if ( args.length == 1 )
         {
            filename = args[0];
            System.out.println("Java Parser Version 1.1 (for Java1.4 code):  Reading from file " + filename+ " . . .");
            try
            {
               startTime = System.currentTimeMillis();
               parser = new JavaTreeParser(new java.io.FileInputStream(filename));
               stopTime = System.currentTimeMillis();
               initTime = stopTime - startTime;
            }
            catch (java.io.FileNotFoundException e)
            {
               System.out.println("Java Parser Version 1.1 (for Java1.4 code):  File " + filename+ " not found.");
               return;
            }
         }
         else
         {
            System.out.println("Java Parser Version 1.1 (for Java1.4 code):  Usage is one of:");
            System.out.println("         java JavaTreeParser < inputfile");
            System.out.println("OR");
            System.out.println("         java JavaTreeParser inputfile");
            return;
         }
      try
      {
         startTime = System.currentTimeMillis();
         parser.CompilationUnit();
         stopTime = System.currentTimeMillis();
         parseTime = stopTime - startTime;
         System.out.println("Java Parser Version 1.1 (for Java1.4 code): ");
         System.out.println("   Java program parsed " + filename+ " successfully in "+ (initTime + parseTime)+ " ms.");
         System.out.println("      parser initialization time was " + initTime+ " ms.");
         System.out.println("      parser parse time was " + parseTime+ " ms.");
      }
      catch (ParseException e)
      {
         System.out.println(e.getMessage());
         System.out.println("Java Parser Version 1.1 (for Java1.4 code):  Encountered errors during parse.");
      }
   }
}

class JTBToolkit {
   static NodeToken makeNodeToken(Token t) {
      return new NodeToken(t.image.intern(), t.kind, t.beginLine, t.beginColumn, t.endLine, t.endColumn);
   }
}


PARSER_END(JavaTreeParser)

SKIP :
{
   " "
   | "\t"
   | "\n"
   | "\r"
   | "\f"
}

MORE :
{
   "//" : IN_SINGLE_LINE_COMMENT
   | <"/**" ~["/"]>
      {
         input_stream.backup(1);
      } : IN_FORMAL_COMMENT
   | "/*" : IN_MULTI_LINE_COMMENT
}

<IN_SINGLE_LINE_COMMENT> SPECIAL_TOKEN :
{
   <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n"> : DEFAULT
}

<IN_FORMAL_COMMENT> SPECIAL_TOKEN :
{
   <FORMAL_COMMENT: "*/"> : DEFAULT
}

<IN_MULTI_LINE_COMMENT> SPECIAL_TOKEN :
{
   <MULTI_LINE_COMMENT: "*/"> : DEFAULT
}

<IN_SINGLE_LINE_COMMENT, IN_FORMAL_COMMENT, IN_MULTI_LINE_COMMENT> MORE :
{
   <~[]>
}

TOKEN :
{
   <ABSTRACT: "abstract">
   | <BOOLEAN: "boolean">
   | <BREAK: "break">
   | <BYTE: "byte">
   | <CASE: "case">
   | <CATCH: "catch">
   | <CHAR: "char">
   | <CLASS: "class">
   | <CONST: "const">
   | <CONTINUE: "continue">
   | <_DEFAULT: "default">
   | <DO: "do">
   | <DOUBLE: "double">
   | <ELSE: "else">
   | <EXTENDS: "extends">
   | <FALSE: "false">
   | <FINAL: "final">
   | <FINALLY: "finally">
   | <FLOAT: "float">
   | <FOR: "for">
   | <GOTO: "goto">
   | <IF: "if">
   | <IMPLEMENTS: "implements">
   | <IMPORT: "import">
   | <INSTANCEOF: "instanceof">
   | <INT: "int">
   | <INTERFACE: "interface">
   | <LONG: "long">
   | <NATIVE: "native">
   | <NEW: "new">
   | <NULL: "null">
   | <PACKAGE: "package">
   | <PRIVATE: "private">
   | <PROTECTED: "protected">
   | <PUBLIC: "public">
   | <RETURN: "return">
   | <SHORT: "short">
   | <STATIC: "static">
   | <SUPER: "super">
   | <SWITCH: "switch">
   | <SYNCHRONIZED: "synchronized">
   | <THIS: "this">
   | <THROW: "throw">
   | <THROWS: "throws">
   | <TRANSIENT: "transient">
   | <TRUE: "true">
   | <TRY: "try">
   | <VOID: "void">
   | <VOLATILE: "volatile">
   | <WHILE: "while">
   | <STRICTFP: "strictfp">
   | <ASSERT: "assert">
}

TOKEN :
{
   <INTEGER_LITERAL: <DECIMAL_LITERAL> (["l", "L"])? | <HEX_LITERAL> (["l", "L"])? | <OCTAL_LITERAL> (["l", "L"])?>
   | <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*>
   | <#HEX_LITERAL: "0" ["x", "X"] (["0"-"9", "a"-"f", "A"-"F"])+>
   | <#OCTAL_LITERAL: "0" (["0"-"7"])*>
   | <FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f", "F", "d", "D"])? | "." (["0"-"9"])+ (<EXPONENT>)? (["f", "F", "d", "D"])? | (["0"-"9"])+ <EXPONENT> (["f", "F", "d", "D"])? | (["0"-"9"])+ (<EXPONENT>)? ["f", "F", "d", "D"]>
   | <#EXPONENT: ["e", "E"] (["+", "-"])? (["0"-"9"])+>
   | <CHARACTER_LITERAL: "'" ((~["'", "\\", "\n", "\r"]) | ("\\" (["n", "t", "b", "r", "f", "\\", "'", "\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))) "'">
   | <STRING_LITERAL: "\"" ((~["\"", "\\", "\n", "\r"]) | ("\\" (["n", "t", "b", "r", "f", "\\", "'", "\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"])))* "\"">
}

TOKEN :
{
   <IDENTIFIER: <LETTER> (<LETTER> | <DIGIT>)*>
   | <#LETTER: ["$", "A"-"Z", "_", "a"-"z", "\u00c0"-"\u00d6", "\u00d8"-"\u00f6", "\u00f8"-"\u00ff", "\u0100"-"\u1fff", "\u3040"-"\u318f", "\u3300"-"\u337f", "\u3400"-"\u3d2d", "\u4e00"-"\u9fff", "\uf900"-"\ufaff"]>
   | <#DIGIT: ["0"-"9", "\u0660"-"\u0669", "\u06f0"-"\u06f9", "\u0966"-"\u096f", "\u09e6"-"\u09ef", "\u0a66"-"\u0a6f", "\u0ae6"-"\u0aef", "\u0b66"-"\u0b6f", "\u0be7"-"\u0bef", "\u0c66"-"\u0c6f", "\u0ce6"-"\u0cef", "\u0d66"-"\u0d6f", "\u0e50"-"\u0e59", "\u0ed0"-"\u0ed9", "\u1040"-"\u1049"]>
}

TOKEN :
{
   <LPAREN: "(">
   | <RPAREN: ")">
   | <LBRACE: "{">
   | <RBRACE: "}">
   | <LBRACKET: "[">
   | <RBRACKET: "]">
   | <SEMICOLON: ";">
   | <COMMA: ",">
   | <DOT: ".">
}

TOKEN :
{
   <ASSIGN: "=">
   | <GT: ">">
   | <LT: "<">
   | <BANG: "!">
   | <TILDE: "~">
   | <HOOK: "?">
   | <COLON: ":">
   | <EQ: "==">
   | <LE: "<=">
   | <GE: ">=">
   | <NE: "!=">
   | <SC_OR: "||">
   | <SC_AND: "&&">
   | <INCR: "++">
   | <DECR: "--">
   | <PLUS: "+">
   | <MINUS: "-">
   | <STAR: "*">
   | <SLASH: "/">
   | <BIT_AND: "&">
   | <BIT_OR: "|">
   | <XOR: "^">
   | <REM: "%">
   | <LSHIFT: "<<">
   | <RSIGNEDSHIFT: ">>">
   | <RUNSIGNEDSHIFT: ">>>">
   | <PLUSASSIGN: "+=">
   | <MINUSASSIGN: "-=">
   | <STARASSIGN: "*=">
   | <SLASHASSIGN: "/=">
   | <ANDASSIGN: "&=">
   | <ORASSIGN: "|=">
   | <XORASSIGN: "^=">
   | <REMASSIGN: "%=">
   | <LSHIFTASSIGN: "<<=">
   | <RSIGNEDSHIFTASSIGN: ">>=">
   | <RUNSIGNEDSHIFTASSIGN: ">>>=">
}

CompilationUnit CompilationUnit() :
{
   NodeOptional n0 = new NodeOptional();
   PackageDeclaration n1;
   NodeListOptional n2 = new NodeListOptional();
   ImportDeclaration n3;
   NodeListOptional n4 = new NodeListOptional();
   TypeDeclaration n5;
   NodeToken n6;
   Token n7;

   {
   }
}
{
   (
      n1=PackageDeclaration()
      { n0.addNode(n1); }
   )?
   (
      n3=ImportDeclaration()
      { n2.addNode(n3); }
   )*
   { n2.nodes.trimToSize(); }
   (
      n5=TypeDeclaration()
      { n4.addNode(n5); }
   )*
   { n4.nodes.trimToSize(); }
   n7=<EOF> { 
      n7.beginColumn++; n7.endColumn++;
      n6 = JTBToolkit.makeNodeToken(n7);
   }
   
   { return new CompilationUnit(n0,n2,n4,n6); }
}

PackageDeclaration PackageDeclaration() :
{
   NodeToken n0;
   Token n1;
   Name n2;
   NodeToken n3;
   Token n4;

   {
   }
}
{
   n1="package" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=Name()
   n4=";" { n3 = JTBToolkit.makeNodeToken(n4); }
   
   { return new PackageDeclaration(n0,n2,n3); }
}

ImportDeclaration ImportDeclaration() :
{
   NodeToken n0;
   Token n1;
   Name n2;
   NodeOptional n3 = new NodeOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;

   {
   }
}
{
   n1="import" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=Name()
   (
      { n4 = new NodeSequence(2); }
      n6="." { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8="*" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      { n3.addNode(n4); }
   )?
   n10=";" { n9 = JTBToolkit.makeNodeToken(n10); }
   
   { return new ImportDeclaration(n0,n2,n3,n9); }
}

TypeDeclaration TypeDeclaration() :
{
   NodeChoice n0;
   ClassDeclaration n1;
   InterfaceDeclaration n2;
   NodeToken n3;
   Token n4;

   {
   }
}
{
   (
      LOOKAHEAD(( "abstract" | "final" | "public" | "strictfp" )* "class")
      n1=ClassDeclaration()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=InterfaceDeclaration()
      { n0 = new NodeChoice(n2, 1); }
   |
      n4=";" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 2); }
   )
   
   { return new TypeDeclaration(n0); }
}

ClassDeclaration ClassDeclaration() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   UnmodifiedClassDeclaration n10;

   {
   }
}
{
   (
      (
         n3="abstract" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="final" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="public" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      |
         n9="strictfp" { n8 = JTBToolkit.makeNodeToken(n9); }
         { n1 = new NodeChoice(n8, 3); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n10=UnmodifiedClassDeclaration()
   
   { return new ClassDeclaration(n0,n10); }
}

UnmodifiedClassDeclaration UnmodifiedClassDeclaration() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   NodeOptional n4 = new NodeOptional();
   NodeSequence n5;
   NodeToken n6;
   Token n7;
   Name n8;
   NodeOptional n9 = new NodeOptional();
   NodeSequence n10;
   NodeToken n11;
   Token n12;
   NameList n13;
   ClassBody n14;

   {
   }
}
{
   n1="class" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3=<IDENTIFIER> { n2 = JTBToolkit.makeNodeToken(n3); }
   (
      { n5 = new NodeSequence(2); }
      n7="extends" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n5.addNode(n6); }
      n8=Name()
      { n5.addNode(n8); }
      { n4.addNode(n5); }
   )?
   (
      { n10 = new NodeSequence(2); }
      n12="implements" { n11 = JTBToolkit.makeNodeToken(n12); }
      { n10.addNode(n11); }
      n13=NameList()
      { n10.addNode(n13); }
      { n9.addNode(n10); }
   )?
   n14=ClassBody()
   
   { return new UnmodifiedClassDeclaration(n0,n2,n4,n9,n14); }
}

ClassBody ClassBody() :
{
   NodeToken n0;
   Token n1;
   NodeListOptional n2 = new NodeListOptional();
   ClassBodyDeclaration n3;
   NodeToken n4;
   Token n5;

   {
   }
}
{
   n1="{" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      n3=ClassBodyDeclaration()
      { n2.addNode(n3); }
   )*
   { n2.nodes.trimToSize(); }
   n5="}" { n4 = JTBToolkit.makeNodeToken(n5); }
   
   { return new ClassBody(n0,n2,n4); }
}

NestedClassDeclaration NestedClassDeclaration() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   NodeToken n12;
   Token n13;
   NodeToken n14;
   Token n15;
   UnmodifiedClassDeclaration n16;

   {
   }
}
{
   (
      (
         n3="static" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="abstract" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="final" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      |
         n9="public" { n8 = JTBToolkit.makeNodeToken(n9); }
         { n1 = new NodeChoice(n8, 3); }
      |
         n11="protected" { n10 = JTBToolkit.makeNodeToken(n11); }
         { n1 = new NodeChoice(n10, 4); }
      |
         n13="private" { n12 = JTBToolkit.makeNodeToken(n13); }
         { n1 = new NodeChoice(n12, 5); }
      |
         n15="strictfp" { n14 = JTBToolkit.makeNodeToken(n15); }
         { n1 = new NodeChoice(n14, 6); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n16=UnmodifiedClassDeclaration()
   
   { return new NestedClassDeclaration(n0,n16); }
}

ClassBodyDeclaration ClassBodyDeclaration() :
{
   NodeChoice n0;
   Initializer n1;
   NestedClassDeclaration n2;
   NestedInterfaceDeclaration n3;
   ConstructorDeclaration n4;
   MethodDeclaration n5;
   FieldDeclaration n6;
   NodeToken n7;
   Token n8;

   {
   }
}
{
   (
      LOOKAHEAD(2)
      n1=Initializer()
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "class")
      n2=NestedClassDeclaration()
      { n0 = new NodeChoice(n2, 1); }
   |
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface")
      n3=NestedInterfaceDeclaration()
      { n0 = new NodeChoice(n3, 2); }
   |
      LOOKAHEAD([ "public" | "protected" | "private" ] Name() "(")
      n4=ConstructorDeclaration()
      { n0 = new NodeChoice(n4, 3); }
   |
      LOOKAHEAD(MethodDeclarationLookahead())
      n5=MethodDeclaration()
      { n0 = new NodeChoice(n5, 4); }
   |
      n6=FieldDeclaration()
      { n0 = new NodeChoice(n6, 5); }
   |
      n8=";" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n0 = new NodeChoice(n7, 6); }
   )
   
   { return new ClassBodyDeclaration(n0); }
}

MethodDeclarationLookahead MethodDeclarationLookahead() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   NodeToken n12;
   Token n13;
   NodeToken n14;
   Token n15;
   NodeToken n16;
   Token n17;
   NodeToken n18;
   Token n19;
   ResultType n20;
   NodeToken n21;
   Token n22;
   NodeToken n23;
   Token n24;

   {
   }
}
{
   (
      (
         n3="public" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="protected" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="private" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      |
         n9="static" { n8 = JTBToolkit.makeNodeToken(n9); }
         { n1 = new NodeChoice(n8, 3); }
      |
         n11="abstract" { n10 = JTBToolkit.makeNodeToken(n11); }
         { n1 = new NodeChoice(n10, 4); }
      |
         n13="final" { n12 = JTBToolkit.makeNodeToken(n13); }
         { n1 = new NodeChoice(n12, 5); }
      |
         n15="native" { n14 = JTBToolkit.makeNodeToken(n15); }
         { n1 = new NodeChoice(n14, 6); }
      |
         n17="synchronized" { n16 = JTBToolkit.makeNodeToken(n17); }
         { n1 = new NodeChoice(n16, 7); }
      |
         n19="strictfp" { n18 = JTBToolkit.makeNodeToken(n19); }
         { n1 = new NodeChoice(n18, 8); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n20=ResultType()
   n22=<IDENTIFIER> { n21 = JTBToolkit.makeNodeToken(n22); }
   n24="(" { n23 = JTBToolkit.makeNodeToken(n24); }
   
   { return new MethodDeclarationLookahead(n0,n20,n21,n23); }
}

InterfaceDeclaration InterfaceDeclaration() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   UnmodifiedInterfaceDeclaration n8;

   {
   }
}
{
   (
      (
         n3="abstract" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="public" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="strictfp" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n8=UnmodifiedInterfaceDeclaration()
   
   { return new InterfaceDeclaration(n0,n8); }
}

NestedInterfaceDeclaration NestedInterfaceDeclaration() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   NodeToken n12;
   Token n13;
   NodeToken n14;
   Token n15;
   UnmodifiedInterfaceDeclaration n16;

   {
   }
}
{
   (
      (
         n3="static" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="abstract" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="final" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      |
         n9="public" { n8 = JTBToolkit.makeNodeToken(n9); }
         { n1 = new NodeChoice(n8, 3); }
      |
         n11="protected" { n10 = JTBToolkit.makeNodeToken(n11); }
         { n1 = new NodeChoice(n10, 4); }
      |
         n13="private" { n12 = JTBToolkit.makeNodeToken(n13); }
         { n1 = new NodeChoice(n12, 5); }
      |
         n15="strictfp" { n14 = JTBToolkit.makeNodeToken(n15); }
         { n1 = new NodeChoice(n14, 6); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n16=UnmodifiedInterfaceDeclaration()
   
   { return new NestedInterfaceDeclaration(n0,n16); }
}

UnmodifiedInterfaceDeclaration UnmodifiedInterfaceDeclaration() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   NodeOptional n4 = new NodeOptional();
   NodeSequence n5;
   NodeToken n6;
   Token n7;
   NameList n8;
   NodeToken n9;
   Token n10;
   NodeListOptional n11 = new NodeListOptional();
   InterfaceMemberDeclaration n12;
   NodeToken n13;
   Token n14;

   {
   }
}
{
   n1="interface" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3=<IDENTIFIER> { n2 = JTBToolkit.makeNodeToken(n3); }
   (
      { n5 = new NodeSequence(2); }
      n7="extends" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n5.addNode(n6); }
      n8=NameList()
      { n5.addNode(n8); }
      { n4.addNode(n5); }
   )?
   n10="{" { n9 = JTBToolkit.makeNodeToken(n10); }
   (
      n12=InterfaceMemberDeclaration()
      { n11.addNode(n12); }
   )*
   { n11.nodes.trimToSize(); }
   n14="}" { n13 = JTBToolkit.makeNodeToken(n14); }
   
   { return new UnmodifiedInterfaceDeclaration(n0,n2,n4,n9,n11,n13); }
}

InterfaceMemberDeclaration InterfaceMemberDeclaration() :
{
   NodeChoice n0;
   NestedClassDeclaration n1;
   NestedInterfaceDeclaration n2;
   MethodDeclaration n3;
   FieldDeclaration n4;
   NodeToken n5;
   Token n6;

   {
   }
}
{
   (
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "class")
      n1=NestedClassDeclaration()
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )* "interface")
      n2=NestedInterfaceDeclaration()
      { n0 = new NodeChoice(n2, 1); }
   |
      LOOKAHEAD(MethodDeclarationLookahead())
      n3=MethodDeclaration()
      { n0 = new NodeChoice(n3, 2); }
   |
      n4=FieldDeclaration()
      { n0 = new NodeChoice(n4, 3); }
   |
      n6=";" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n0 = new NodeChoice(n5, 4); }
   )
   
   { return new InterfaceMemberDeclaration(n0); }
}

FieldDeclaration FieldDeclaration() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   NodeToken n12;
   Token n13;
   NodeToken n14;
   Token n15;
   Type n16;
   VariableDeclarator n17;
   NodeListOptional n18 = new NodeListOptional();
   NodeSequence n19;
   NodeToken n20;
   Token n21;
   VariableDeclarator n22;
   NodeToken n23;
   Token n24;

   {
   }
}
{
   (
      (
         n3="public" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="protected" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="private" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      |
         n9="static" { n8 = JTBToolkit.makeNodeToken(n9); }
         { n1 = new NodeChoice(n8, 3); }
      |
         n11="final" { n10 = JTBToolkit.makeNodeToken(n11); }
         { n1 = new NodeChoice(n10, 4); }
      |
         n13="transient" { n12 = JTBToolkit.makeNodeToken(n13); }
         { n1 = new NodeChoice(n12, 5); }
      |
         n15="volatile" { n14 = JTBToolkit.makeNodeToken(n15); }
         { n1 = new NodeChoice(n14, 6); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n16=Type()
   n17=VariableDeclarator()
   (
      { n19 = new NodeSequence(2); }
      n21="," { n20 = JTBToolkit.makeNodeToken(n21); }
      { n19.addNode(n20); }
      n22=VariableDeclarator()
      { n19.addNode(n22); }
      { n18.addNode(n19); }
   )*
   { n18.nodes.trimToSize(); }
   n24=";" { n23 = JTBToolkit.makeNodeToken(n24); }
   
   { return new FieldDeclaration(n0,n16,n17,n18,n23); }
}

VariableDeclarator VariableDeclarator() :
{
   VariableDeclaratorId n0;
   NodeOptional n1 = new NodeOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   VariableInitializer n5;

   {
   }
}
{
   n0=VariableDeclaratorId()
   (
      { n2 = new NodeSequence(2); }
      n4="=" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=VariableInitializer()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )?
   
   { return new VariableDeclarator(n0,n1); }
}

VariableDeclaratorId VariableDeclaratorId() :
{
   NodeToken n0;
   Token n1;
   NodeListOptional n2 = new NodeListOptional();
   NodeSequence n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;

   {
   }
}
{
   n1=<IDENTIFIER> { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      { n3 = new NodeSequence(2); }
      n5="[" { n4 = JTBToolkit.makeNodeToken(n5); }
      { n3.addNode(n4); }
      n7="]" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n3.addNode(n6); }
      { n2.addNode(n3); }
   )*
   { n2.nodes.trimToSize(); }
   
   { return new VariableDeclaratorId(n0,n2); }
}

VariableInitializer VariableInitializer() :
{
   NodeChoice n0;
   ArrayInitializer n1;
   Expression n2;

   {
   }
}
{
   (
      n1=ArrayInitializer()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=Expression()
      { n0 = new NodeChoice(n2, 1); }
   )
   
   { return new VariableInitializer(n0); }
}

ArrayInitializer ArrayInitializer() :
{
   NodeToken n0;
   Token n1;
   NodeOptional n2 = new NodeOptional();
   NodeSequence n3;
   VariableInitializer n4;
   NodeListOptional n5;
   NodeSequence n6;
   NodeToken n7;
   Token n8;
   VariableInitializer n9;
   NodeOptional n10 = new NodeOptional();
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;

   {
   }
}
{
   n1="{" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      { n5 = new NodeListOptional(); }
      { n3 = new NodeSequence(2); }
      n4=VariableInitializer()
      { n3.addNode(n4); }
      (
         LOOKAHEAD(2)
         { n6 = new NodeSequence(2); }
         n8="," { n7 = JTBToolkit.makeNodeToken(n8); }
         { n6.addNode(n7); }
         n9=VariableInitializer()
         { n6.addNode(n9); }
         { n5.addNode(n6); }
      )*
      { n5.nodes.trimToSize(); }
      { n3.addNode(n5); }
      { n2.addNode(n3); }
   )?
   (
      n12="," { n11 = JTBToolkit.makeNodeToken(n12); }
      { n10.addNode(n11); }
   )?
   n14="}" { n13 = JTBToolkit.makeNodeToken(n14); }
   
   { return new ArrayInitializer(n0,n2,n10,n13); }
}

MethodDeclaration MethodDeclaration() :
{
   NodeListOptional n0 = new NodeListOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   NodeToken n12;
   Token n13;
   NodeToken n14;
   Token n15;
   NodeToken n16;
   Token n17;
   NodeToken n18;
   Token n19;
   ResultType n20;
   MethodDeclarator n21;
   NodeOptional n22 = new NodeOptional();
   NodeSequence n23;
   NodeToken n24;
   Token n25;
   NameList n26;
   NodeChoice n27;
   Block n28;
   NodeToken n29;
   Token n30;

   {
   }
}
{
   (
      (
         n3="public" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="protected" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="private" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      |
         n9="static" { n8 = JTBToolkit.makeNodeToken(n9); }
         { n1 = new NodeChoice(n8, 3); }
      |
         n11="abstract" { n10 = JTBToolkit.makeNodeToken(n11); }
         { n1 = new NodeChoice(n10, 4); }
      |
         n13="final" { n12 = JTBToolkit.makeNodeToken(n13); }
         { n1 = new NodeChoice(n12, 5); }
      |
         n15="native" { n14 = JTBToolkit.makeNodeToken(n15); }
         { n1 = new NodeChoice(n14, 6); }
      |
         n17="synchronized" { n16 = JTBToolkit.makeNodeToken(n17); }
         { n1 = new NodeChoice(n16, 7); }
      |
         n19="strictfp" { n18 = JTBToolkit.makeNodeToken(n19); }
         { n1 = new NodeChoice(n18, 8); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n20=ResultType()
   n21=MethodDeclarator()
   (
      { n23 = new NodeSequence(2); }
      n25="throws" { n24 = JTBToolkit.makeNodeToken(n25); }
      { n23.addNode(n24); }
      n26=NameList()
      { n23.addNode(n26); }
      { n22.addNode(n23); }
   )?
   (
      (
         n28=Block()
         { n27 = new NodeChoice(n28, 0); }
      |
         n30=";" { n29 = JTBToolkit.makeNodeToken(n30); }
         { n27 = new NodeChoice(n29, 1); }
      )
      
   )
   
   { return new MethodDeclaration(n0,n20,n21,n22,n27); }
}

MethodDeclarator MethodDeclarator() :
{
   NodeToken n0;
   Token n1;
   FormalParameters n2;
   NodeListOptional n3 = new NodeListOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;

   {
   }
}
{
   n1=<IDENTIFIER> { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=FormalParameters()
   (
      { n4 = new NodeSequence(2); }
      n6="[" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8="]" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      { n3.addNode(n4); }
   )*
   { n3.nodes.trimToSize(); }
   
   { return new MethodDeclarator(n0,n2,n3); }
}

FormalParameters FormalParameters() :
{
   NodeToken n0;
   Token n1;
   NodeOptional n2 = new NodeOptional();
   NodeSequence n3;
   FormalParameter n4;
   NodeListOptional n5;
   NodeSequence n6;
   NodeToken n7;
   Token n8;
   FormalParameter n9;
   NodeToken n10;
   Token n11;

   {
   }
}
{
   n1="(" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      { n5 = new NodeListOptional(); }
      { n3 = new NodeSequence(2); }
      n4=FormalParameter()
      { n3.addNode(n4); }
      (
         { n6 = new NodeSequence(2); }
         n8="," { n7 = JTBToolkit.makeNodeToken(n8); }
         { n6.addNode(n7); }
         n9=FormalParameter()
         { n6.addNode(n9); }
         { n5.addNode(n6); }
      )*
      { n5.nodes.trimToSize(); }
      { n3.addNode(n5); }
      { n2.addNode(n3); }
   )?
   n11=")" { n10 = JTBToolkit.makeNodeToken(n11); }
   
   { return new FormalParameters(n0,n2,n10); }
}

FormalParameter FormalParameter() :
{
   NodeOptional n0 = new NodeOptional();
   NodeToken n1;
   Token n2;
   Type n3;
   VariableDeclaratorId n4;

   {
   }
}
{
   (
      n2="final" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0.addNode(n1); }
   )?
   n3=Type()
   n4=VariableDeclaratorId()
   
   { return new FormalParameter(n0,n3,n4); }
}

ConstructorDeclaration ConstructorDeclaration() :
{
   NodeOptional n0 = new NodeOptional();
   NodeChoice n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   FormalParameters n10;
   NodeOptional n11 = new NodeOptional();
   NodeSequence n12;
   NodeToken n13;
   Token n14;
   NameList n15;
   NodeToken n16;
   Token n17;
   NodeOptional n18 = new NodeOptional();
   ExplicitConstructorInvocation n19;
   NodeListOptional n20 = new NodeListOptional();
   BlockStatement n21;
   NodeToken n22;
   Token n23;

   {
   }
}
{
   (
      (
         n3="public" { n2 = JTBToolkit.makeNodeToken(n3); }
         { n1 = new NodeChoice(n2, 0); }
      |
         n5="protected" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n1 = new NodeChoice(n4, 1); }
      |
         n7="private" { n6 = JTBToolkit.makeNodeToken(n7); }
         { n1 = new NodeChoice(n6, 2); }
      )
      { n0.addNode(n1); }
   )?
   n9=<IDENTIFIER> { n8 = JTBToolkit.makeNodeToken(n9); }
   n10=FormalParameters()
   (
      { n12 = new NodeSequence(2); }
      n14="throws" { n13 = JTBToolkit.makeNodeToken(n14); }
      { n12.addNode(n13); }
      n15=NameList()
      { n12.addNode(n15); }
      { n11.addNode(n12); }
   )?
   n17="{" { n16 = JTBToolkit.makeNodeToken(n17); }
   (
      LOOKAHEAD(ExplicitConstructorInvocation())
      n19=ExplicitConstructorInvocation()
      { n18.addNode(n19); }
   )?
   (
      n21=BlockStatement()
      { n20.addNode(n21); }
   )*
   { n20.nodes.trimToSize(); }
   n23="}" { n22 = JTBToolkit.makeNodeToken(n23); }
   
   { return new ConstructorDeclaration(n0,n8,n10,n11,n16,n18,n20,n22); }
}

ExplicitConstructorInvocation ExplicitConstructorInvocation() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   Arguments n4;
   NodeToken n5;
   Token n6;
   NodeSequence n7;
   NodeOptional n8 = new NodeOptional();
   NodeSequence n9;
   PrimaryExpression n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   Arguments n15;
   NodeToken n16;
   Token n17;

   {
   }
}
{
   (
      LOOKAHEAD("this" Arguments() ";")
      { n1 = new NodeSequence(4); }
      n3="this" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n4=Arguments()
      { n1.addNode(n4); }
      n6=";" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n1.addNode(n5); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n7 = new NodeSequence(4); }
      (
         LOOKAHEAD(2)
         { n9 = new NodeSequence(2); }
         n10=PrimaryExpression()
         { n9.addNode(n10); }
         n12="." { n11 = JTBToolkit.makeNodeToken(n12); }
         { n9.addNode(n11); }
         { n8.addNode(n9); }
      )?
      { n7.addNode(n8); }
      n14="super" { n13 = JTBToolkit.makeNodeToken(n14); }
      { n7.addNode(n13); }
      n15=Arguments()
      { n7.addNode(n15); }
      n17=";" { n16 = JTBToolkit.makeNodeToken(n17); }
      { n7.addNode(n16); }
      { n0 = new NodeChoice(n7, 1); }
   )
   
   { return new ExplicitConstructorInvocation(n0); }
}

Initializer Initializer() :
{
   NodeOptional n0 = new NodeOptional();
   NodeToken n1;
   Token n2;
   Block n3;

   {
   }
}
{
   (
      n2="static" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0.addNode(n1); }
   )?
   n3=Block()
   
   { return new Initializer(n0,n3); }
}

Type Type() :
{
   NodeChoice n0;
   PrimitiveType n1;
   Name n2;
   NodeListOptional n3 = new NodeListOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;

   {
   }
}
{
   (
      (
         n1=PrimitiveType()
         { n0 = new NodeChoice(n1, 0); }
      |
         n2=Name()
         { n0 = new NodeChoice(n2, 1); }
      )
      
   )
   (
      { n4 = new NodeSequence(2); }
      n6="[" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8="]" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      { n3.addNode(n4); }
   )*
   { n3.nodes.trimToSize(); }
   
   { return new Type(n0,n3); }
}

PrimitiveType PrimitiveType() :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   NodeToken n15;
   Token n16;

   {
   }
}
{
   (
      n2="boolean" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n4="char" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 1); }
   |
      n6="byte" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n0 = new NodeChoice(n5, 2); }
   |
      n8="short" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n0 = new NodeChoice(n7, 3); }
   |
      n10="int" { n9 = JTBToolkit.makeNodeToken(n10); }
      { n0 = new NodeChoice(n9, 4); }
   |
      n12="long" { n11 = JTBToolkit.makeNodeToken(n12); }
      { n0 = new NodeChoice(n11, 5); }
   |
      n14="float" { n13 = JTBToolkit.makeNodeToken(n14); }
      { n0 = new NodeChoice(n13, 6); }
   |
      n16="double" { n15 = JTBToolkit.makeNodeToken(n16); }
      { n0 = new NodeChoice(n15, 7); }
   )
   
   { return new PrimitiveType(n0); }
}

ResultType ResultType() :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   Type n3;

   {
   }
}
{
   (
      n2="void" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n3=Type()
      { n0 = new NodeChoice(n3, 1); }
   )
   
   { return new ResultType(n0); }
}

Name Name() :
{
   NodeToken n0;
   Token n1;
   NodeListOptional n2 = new NodeListOptional();
   NodeSequence n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;

   {
   }
}
{
   n1=<IDENTIFIER> { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      LOOKAHEAD(2)
      { n3 = new NodeSequence(2); }
      n5="." { n4 = JTBToolkit.makeNodeToken(n5); }
      { n3.addNode(n4); }
      n7=<IDENTIFIER> { n6 = JTBToolkit.makeNodeToken(n7); }
      { n3.addNode(n6); }
      { n2.addNode(n3); }
   )*
   { n2.nodes.trimToSize(); }
   
   { return new Name(n0,n2); }
}

NameList NameList() :
{
   Name n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   Name n5;

   {
   }
}
{
   n0=Name()
   (
      { n2 = new NodeSequence(2); }
      n4="," { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=Name()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new NameList(n0,n1); }
}

Expression Expression() :
{
   ConditionalExpression n0;
   NodeOptional n1 = new NodeOptional();
   NodeSequence n2;
   AssignmentOperator n3;
   Expression n4;

   {
   }
}
{
   n0=ConditionalExpression()
   (
      { n2 = new NodeSequence(2); }
      n3=AssignmentOperator()
      { n2.addNode(n3); }
      n4=Expression()
      { n2.addNode(n4); }
      { n1.addNode(n2); }
   )?
   
   { return new Expression(n0,n1); }
}

AssignmentOperator AssignmentOperator() :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   NodeToken n15;
   Token n16;
   NodeToken n17;
   Token n18;
   NodeToken n19;
   Token n20;
   NodeToken n21;
   Token n22;
   NodeToken n23;
   Token n24;

   {
   }
}
{
   (
      n2="=" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n4="*=" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 1); }
   |
      n6="/=" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n0 = new NodeChoice(n5, 2); }
   |
      n8="%=" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n0 = new NodeChoice(n7, 3); }
   |
      n10="+=" { n9 = JTBToolkit.makeNodeToken(n10); }
      { n0 = new NodeChoice(n9, 4); }
   |
      n12="-=" { n11 = JTBToolkit.makeNodeToken(n12); }
      { n0 = new NodeChoice(n11, 5); }
   |
      n14="<<=" { n13 = JTBToolkit.makeNodeToken(n14); }
      { n0 = new NodeChoice(n13, 6); }
   |
      n16=">>=" { n15 = JTBToolkit.makeNodeToken(n16); }
      { n0 = new NodeChoice(n15, 7); }
   |
      n18=">>>=" { n17 = JTBToolkit.makeNodeToken(n18); }
      { n0 = new NodeChoice(n17, 8); }
   |
      n20="&=" { n19 = JTBToolkit.makeNodeToken(n20); }
      { n0 = new NodeChoice(n19, 9); }
   |
      n22="^=" { n21 = JTBToolkit.makeNodeToken(n22); }
      { n0 = new NodeChoice(n21, 10); }
   |
      n24="|=" { n23 = JTBToolkit.makeNodeToken(n24); }
      { n0 = new NodeChoice(n23, 11); }
   )
   
   { return new AssignmentOperator(n0); }
}

ConditionalExpression ConditionalExpression() :
{
   ConditionalOrExpression n0;
   NodeOptional n1 = new NodeOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   Expression n5;
   NodeToken n6;
   Token n7;
   ConditionalExpression n8;

   {
   }
}
{
   n0=ConditionalOrExpression()
   (
      { n2 = new NodeSequence(4); }
      n4="?" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=Expression()
      { n2.addNode(n5); }
      n7=":" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n2.addNode(n6); }
      n8=ConditionalExpression()
      { n2.addNode(n8); }
      { n1.addNode(n2); }
   )?
   
   { return new ConditionalExpression(n0,n1); }
}

ConditionalOrExpression ConditionalOrExpression() :
{
   ConditionalAndExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   ConditionalAndExpression n5;

   {
   }
}
{
   n0=ConditionalAndExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="||" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=ConditionalAndExpression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new ConditionalOrExpression(n0,n1); }
}

ConditionalAndExpression ConditionalAndExpression() :
{
   InclusiveOrExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   InclusiveOrExpression n5;

   {
   }
}
{
   n0=InclusiveOrExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="&&" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=InclusiveOrExpression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new ConditionalAndExpression(n0,n1); }
}

InclusiveOrExpression InclusiveOrExpression() :
{
   ExclusiveOrExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   ExclusiveOrExpression n5;

   {
   }
}
{
   n0=ExclusiveOrExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="|" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=ExclusiveOrExpression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new InclusiveOrExpression(n0,n1); }
}

ExclusiveOrExpression ExclusiveOrExpression() :
{
   AndExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   AndExpression n5;

   {
   }
}
{
   n0=AndExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="^" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=AndExpression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new ExclusiveOrExpression(n0,n1); }
}

AndExpression AndExpression() :
{
   EqualityExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   EqualityExpression n5;

   {
   }
}
{
   n0=EqualityExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="&" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=EqualityExpression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new AndExpression(n0,n1); }
}

EqualityExpression EqualityExpression() :
{
   InstanceOfExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeChoice n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   InstanceOfExpression n8;

   {
   }
}
{
   n0=InstanceOfExpression()
   (
      { n2 = new NodeSequence(2); }
      (
         (
            n5="==" { n4 = JTBToolkit.makeNodeToken(n5); }
            { n3 = new NodeChoice(n4, 0); }
         |
            n7="!=" { n6 = JTBToolkit.makeNodeToken(n7); }
            { n3 = new NodeChoice(n6, 1); }
         )
         
      )
      { n2.addNode(n3); }
      n8=InstanceOfExpression()
      { n2.addNode(n8); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new EqualityExpression(n0,n1); }
}

InstanceOfExpression InstanceOfExpression() :
{
   RelationalExpression n0;
   NodeOptional n1 = new NodeOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   Type n5;

   {
   }
}
{
   n0=RelationalExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="instanceof" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=Type()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )?
   
   { return new InstanceOfExpression(n0,n1); }
}

RelationalExpression RelationalExpression() :
{
   ShiftExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeChoice n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   ShiftExpression n12;

   {
   }
}
{
   n0=ShiftExpression()
   (
      { n2 = new NodeSequence(2); }
      (
         (
            n5="<" { n4 = JTBToolkit.makeNodeToken(n5); }
            { n3 = new NodeChoice(n4, 0); }
         |
            n7=">" { n6 = JTBToolkit.makeNodeToken(n7); }
            { n3 = new NodeChoice(n6, 1); }
         |
            n9="<=" { n8 = JTBToolkit.makeNodeToken(n9); }
            { n3 = new NodeChoice(n8, 2); }
         |
            n11=">=" { n10 = JTBToolkit.makeNodeToken(n11); }
            { n3 = new NodeChoice(n10, 3); }
         )
         
      )
      { n2.addNode(n3); }
      n12=ShiftExpression()
      { n2.addNode(n12); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new RelationalExpression(n0,n1); }
}

ShiftExpression ShiftExpression() :
{
   AdditiveExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeChoice n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   AdditiveExpression n10;

   {
   }
}
{
   n0=AdditiveExpression()
   (
      { n2 = new NodeSequence(2); }
      (
         (
            n5="<<" { n4 = JTBToolkit.makeNodeToken(n5); }
            { n3 = new NodeChoice(n4, 0); }
         |
            n7=">>" { n6 = JTBToolkit.makeNodeToken(n7); }
            { n3 = new NodeChoice(n6, 1); }
         |
            n9=">>>" { n8 = JTBToolkit.makeNodeToken(n9); }
            { n3 = new NodeChoice(n8, 2); }
         )
         
      )
      { n2.addNode(n3); }
      n10=AdditiveExpression()
      { n2.addNode(n10); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new ShiftExpression(n0,n1); }
}

AdditiveExpression AdditiveExpression() :
{
   MultiplicativeExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeChoice n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   MultiplicativeExpression n8;

   {
   }
}
{
   n0=MultiplicativeExpression()
   (
      { n2 = new NodeSequence(2); }
      (
         (
            n5="+" { n4 = JTBToolkit.makeNodeToken(n5); }
            { n3 = new NodeChoice(n4, 0); }
         |
            n7="-" { n6 = JTBToolkit.makeNodeToken(n7); }
            { n3 = new NodeChoice(n6, 1); }
         )
         
      )
      { n2.addNode(n3); }
      n8=MultiplicativeExpression()
      { n2.addNode(n8); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new AdditiveExpression(n0,n1); }
}

MultiplicativeExpression MultiplicativeExpression() :
{
   UnaryExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeChoice n3;
   NodeToken n4;
   Token n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   UnaryExpression n10;

   {
   }
}
{
   n0=UnaryExpression()
   (
      { n2 = new NodeSequence(2); }
      (
         (
            n5="*" { n4 = JTBToolkit.makeNodeToken(n5); }
            { n3 = new NodeChoice(n4, 0); }
         |
            n7="/" { n6 = JTBToolkit.makeNodeToken(n7); }
            { n3 = new NodeChoice(n6, 1); }
         |
            n9="%" { n8 = JTBToolkit.makeNodeToken(n9); }
            { n3 = new NodeChoice(n8, 2); }
         )
         
      )
      { n2.addNode(n3); }
      n10=UnaryExpression()
      { n2.addNode(n10); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new MultiplicativeExpression(n0,n1); }
}

UnaryExpression UnaryExpression() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeChoice n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   UnaryExpression n7;
   PreIncrementExpression n8;
   PreDecrementExpression n9;
   UnaryExpressionNotPlusMinus n10;

   {
   }
}
{
   (
      { n1 = new NodeSequence(2); }
      (
         (
            n4="+" { n3 = JTBToolkit.makeNodeToken(n4); }
            { n2 = new NodeChoice(n3, 0); }
         |
            n6="-" { n5 = JTBToolkit.makeNodeToken(n6); }
            { n2 = new NodeChoice(n5, 1); }
         )
         
      )
      { n1.addNode(n2); }
      n7=UnaryExpression()
      { n1.addNode(n7); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n8=PreIncrementExpression()
      { n0 = new NodeChoice(n8, 1); }
   |
      n9=PreDecrementExpression()
      { n0 = new NodeChoice(n9, 2); }
   |
      n10=UnaryExpressionNotPlusMinus()
      { n0 = new NodeChoice(n10, 3); }
   )
   
   { return new UnaryExpression(n0); }
}

PreIncrementExpression PreIncrementExpression() :
{
   NodeToken n0;
   Token n1;
   PrimaryExpression n2;

   {
   }
}
{
   n1="++" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=PrimaryExpression()
   
   { return new PreIncrementExpression(n0,n2); }
}

PreDecrementExpression PreDecrementExpression() :
{
   NodeToken n0;
   Token n1;
   PrimaryExpression n2;

   {
   }
}
{
   n1="--" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=PrimaryExpression()
   
   { return new PreDecrementExpression(n0,n2); }
}

UnaryExpressionNotPlusMinus UnaryExpressionNotPlusMinus() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeChoice n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   UnaryExpression n7;
   CastExpression n8;
   PostfixExpression n9;

   {
   }
}
{
   (
      { n1 = new NodeSequence(2); }
      (
         (
            n4="~" { n3 = JTBToolkit.makeNodeToken(n4); }
            { n2 = new NodeChoice(n3, 0); }
         |
            n6="!" { n5 = JTBToolkit.makeNodeToken(n6); }
            { n2 = new NodeChoice(n5, 1); }
         )
         
      )
      { n1.addNode(n2); }
      n7=UnaryExpression()
      { n1.addNode(n7); }
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(CastLookahead())
      n8=CastExpression()
      { n0 = new NodeChoice(n8, 1); }
   |
      n9=PostfixExpression()
      { n0 = new NodeChoice(n9, 2); }
   )
   
   { return new UnaryExpressionNotPlusMinus(n0); }
}

CastLookahead CastLookahead() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   PrimitiveType n4;
   NodeSequence n5;
   NodeToken n6;
   Token n7;
   Name n8;
   NodeToken n9;
   Token n10;
   NodeToken n11;
   Token n12;
   NodeSequence n13;
   NodeToken n14;
   Token n15;
   Name n16;
   NodeToken n17;
   Token n18;
   NodeChoice n19;
   NodeToken n20;
   Token n21;
   NodeToken n22;
   Token n23;
   NodeToken n24;
   Token n25;
   NodeToken n26;
   Token n27;
   NodeToken n28;
   Token n29;
   NodeToken n30;
   Token n31;
   NodeToken n32;
   Token n33;
   Literal n34;

   {
   }
}
{
   (
      LOOKAHEAD(2)
      { n1 = new NodeSequence(3); }
      n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n4=PrimitiveType()
      { n1.addNode(n4); }
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD("(" Name() "[")
      { n5 = new NodeSequence(5); }
      n7="(" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n5.addNode(n6); }
      n8=Name()
      { n5.addNode(n8); }
      n10="[" { n9 = JTBToolkit.makeNodeToken(n10); }
      { n5.addNode(n9); }
      n12="]" { n11 = JTBToolkit.makeNodeToken(n12); }
      { n5.addNode(n11); }
      { n0 = new NodeChoice(n5, 1); }
   |
      { n13 = new NodeSequence(4); }
      n15="(" { n14 = JTBToolkit.makeNodeToken(n15); }
      { n13.addNode(n14); }
      n16=Name()
      { n13.addNode(n16); }
      n18=")" { n17 = JTBToolkit.makeNodeToken(n18); }
      { n13.addNode(n17); }
      (
         (
            n21="~" { n20 = JTBToolkit.makeNodeToken(n21); }
            { n19 = new NodeChoice(n20, 0); }
         |
            n23="!" { n22 = JTBToolkit.makeNodeToken(n23); }
            { n19 = new NodeChoice(n22, 1); }
         |
            n25="(" { n24 = JTBToolkit.makeNodeToken(n25); }
            { n19 = new NodeChoice(n24, 2); }
         |
            n27=<IDENTIFIER> { n26 = JTBToolkit.makeNodeToken(n27); }
            { n19 = new NodeChoice(n26, 3); }
         |
            n29="this" { n28 = JTBToolkit.makeNodeToken(n29); }
            { n19 = new NodeChoice(n28, 4); }
         |
            n31="super" { n30 = JTBToolkit.makeNodeToken(n31); }
            { n19 = new NodeChoice(n30, 5); }
         |
            n33="new" { n32 = JTBToolkit.makeNodeToken(n33); }
            { n19 = new NodeChoice(n32, 6); }
         |
            n34=Literal()
            { n19 = new NodeChoice(n34, 7); }
         )
         
      )
      { n13.addNode(n19); }
      { n0 = new NodeChoice(n13, 2); }
   )
   
   { return new CastLookahead(n0); }
}

PostfixExpression PostfixExpression() :
{
   PrimaryExpression n0;
   NodeOptional n1 = new NodeOptional();
   NodeChoice n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;

   {
   }
}
{
   n0=PrimaryExpression()
   (
      (
         n4="++" { n3 = JTBToolkit.makeNodeToken(n4); }
         { n2 = new NodeChoice(n3, 0); }
      |
         n6="--" { n5 = JTBToolkit.makeNodeToken(n6); }
         { n2 = new NodeChoice(n5, 1); }
      )
      { n1.addNode(n2); }
   )?
   
   { return new PostfixExpression(n0,n1); }
}

CastExpression CastExpression() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   Type n4;
   NodeToken n5;
   Token n6;
   UnaryExpression n7;
   NodeSequence n8;
   NodeToken n9;
   Token n10;
   Type n11;
   NodeToken n12;
   Token n13;
   UnaryExpressionNotPlusMinus n14;

   {
   }
}
{
   (
      LOOKAHEAD("(" PrimitiveType())
      { n1 = new NodeSequence(5); }
      n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n4=Type()
      { n1.addNode(n4); }
      n6=")" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n1.addNode(n5); }
      n7=UnaryExpression()
      { n1.addNode(n7); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n8 = new NodeSequence(4); }
      n10="(" { n9 = JTBToolkit.makeNodeToken(n10); }
      { n8.addNode(n9); }
      n11=Type()
      { n8.addNode(n11); }
      n13=")" { n12 = JTBToolkit.makeNodeToken(n13); }
      { n8.addNode(n12); }
      n14=UnaryExpressionNotPlusMinus()
      { n8.addNode(n14); }
      { n0 = new NodeChoice(n8, 1); }
   )
   
   { return new CastExpression(n0); }
}

PrimaryExpression PrimaryExpression() :
{
   PrimaryPrefix n0;
   NodeListOptional n1 = new NodeListOptional();
   PrimarySuffix n2;

   {
   }
}
{
   n0=PrimaryPrefix()
   (
      LOOKAHEAD(2)
      n2=PrimarySuffix()
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new PrimaryExpression(n0,n1); }
}

PrimaryPrefix PrimaryPrefix() :
{
   NodeChoice n0;
   Literal n1;
   NodeToken n2;
   Token n3;
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;
   NodeSequence n11;
   NodeToken n12;
   Token n13;
   Expression n14;
   NodeToken n15;
   Token n16;
   AllocationExpression n17;
   NodeSequence n18;
   ResultType n19;
   NodeToken n20;
   Token n21;
   NodeToken n22;
   Token n23;
   Name n24;

   {
   }
}
{
   (
      n1=Literal()
      { n0 = new NodeChoice(n1, 0); }
   |
      n3="this" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n0 = new NodeChoice(n2, 1); }
   |
      { n4 = new NodeSequence(3); }
      n6="super" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8="." { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      n10=<IDENTIFIER> { n9 = JTBToolkit.makeNodeToken(n10); }
      { n4.addNode(n9); }
      { n0 = new NodeChoice(n4, 2); }
   |
      { n11 = new NodeSequence(3); }
      n13="(" { n12 = JTBToolkit.makeNodeToken(n13); }
      { n11.addNode(n12); }
      n14=Expression()
      { n11.addNode(n14); }
      n16=")" { n15 = JTBToolkit.makeNodeToken(n16); }
      { n11.addNode(n15); }
      { n0 = new NodeChoice(n11, 3); }
   |
      n17=AllocationExpression()
      { n0 = new NodeChoice(n17, 4); }
   |
      LOOKAHEAD(ResultType() "." "class")
      { n18 = new NodeSequence(4); }
      n19=ResultType()
      { n18.addNode(n19); }
      n21="." { n20 = JTBToolkit.makeNodeToken(n21); }
      { n18.addNode(n20); }
      n23="class" { n22 = JTBToolkit.makeNodeToken(n23); }
      { n18.addNode(n22); }
      { n0 = new NodeChoice(n18, 5); }
   |
      n24=Name()
      { n0 = new NodeChoice(n24, 6); }
   )
   
   { return new PrimaryPrefix(n0); }
}

PrimarySuffix PrimarySuffix() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   NodeToken n4;
   Token n5;
   NodeSequence n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;
   NodeSequence n11;
   NodeToken n12;
   Token n13;
   AllocationExpression n14;
   NodeSequence n15;
   NodeToken n16;
   Token n17;
   Expression n18;
   NodeToken n19;
   Token n20;
   NodeSequence n21;
   NodeToken n22;
   Token n23;
   NodeToken n24;
   Token n25;
   Arguments n26;

   {
   }
}
{
   (
      LOOKAHEAD(2)
      { n1 = new NodeSequence(3); }
      n3="." { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n5="this" { n4 = JTBToolkit.makeNodeToken(n5); }
      { n1.addNode(n4); }
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(2)
      { n6 = new NodeSequence(3); }
      n8="." { n7 = JTBToolkit.makeNodeToken(n8); }
      { n6.addNode(n7); }
      n10="super" { n9 = JTBToolkit.makeNodeToken(n10); }
      { n6.addNode(n9); }
      { n0 = new NodeChoice(n6, 1); }
   |
      LOOKAHEAD(2)
      { n11 = new NodeSequence(3); }
      n13="." { n12 = JTBToolkit.makeNodeToken(n13); }
      { n11.addNode(n12); }
      n14=AllocationExpression()
      { n11.addNode(n14); }
      { n0 = new NodeChoice(n11, 2); }
   |
      { n15 = new NodeSequence(3); }
      n17="[" { n16 = JTBToolkit.makeNodeToken(n17); }
      { n15.addNode(n16); }
      n18=Expression()
      { n15.addNode(n18); }
      n20="]" { n19 = JTBToolkit.makeNodeToken(n20); }
      { n15.addNode(n19); }
      { n0 = new NodeChoice(n15, 3); }
   |
      { n21 = new NodeSequence(2); }
      n23="." { n22 = JTBToolkit.makeNodeToken(n23); }
      { n21.addNode(n22); }
      n25=<IDENTIFIER> { n24 = JTBToolkit.makeNodeToken(n25); }
      { n21.addNode(n24); }
      { n0 = new NodeChoice(n21, 4); }
   |
      n26=Arguments()
      { n0 = new NodeChoice(n26, 5); }
   )
   
   { return new PrimarySuffix(n0); }
}

Literal Literal() :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   BooleanLiteral n9;
   NullLiteral n10;

   {
   }
}
{
   (
      n2=<INTEGER_LITERAL> { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n4=<FLOATING_POINT_LITERAL> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 1); }
   |
      n6=<CHARACTER_LITERAL> { n5 = JTBToolkit.makeNodeToken(n6); }
      { n0 = new NodeChoice(n5, 2); }
   |
      n8=<STRING_LITERAL> { n7 = JTBToolkit.makeNodeToken(n8); }
      { n0 = new NodeChoice(n7, 3); }
   |
      n9=BooleanLiteral()
      { n0 = new NodeChoice(n9, 4); }
   |
      n10=NullLiteral()
      { n0 = new NodeChoice(n10, 5); }
   )
   
   { return new Literal(n0); }
}

BooleanLiteral BooleanLiteral() :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   NodeToken n3;
   Token n4;

   {
   }
}
{
   (
      n2="true" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n4="false" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 1); }
   )
   
   { return new BooleanLiteral(n0); }
}

NullLiteral NullLiteral() :
{
   NodeToken n0;
   Token n1;

   {
   }
}
{
   n1="null" { n0 = JTBToolkit.makeNodeToken(n1); }
   
   { return new NullLiteral(n0); }
}

Arguments Arguments() :
{
   NodeToken n0;
   Token n1;
   NodeOptional n2 = new NodeOptional();
   ArgumentList n3;
   NodeToken n4;
   Token n5;

   {
   }
}
{
   n1="(" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      n3=ArgumentList()
      { n2.addNode(n3); }
   )?
   n5=")" { n4 = JTBToolkit.makeNodeToken(n5); }
   
   { return new Arguments(n0,n2,n4); }
}

ArgumentList ArgumentList() :
{
   Expression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   Expression n5;

   {
   }
}
{
   n0=Expression()
   (
      { n2 = new NodeSequence(2); }
      n4="," { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=Expression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new ArgumentList(n0,n1); }
}

AllocationExpression AllocationExpression() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   PrimitiveType n4;
   ArrayDimsAndInits n5;
   NodeSequence n6;
   NodeToken n7;
   Token n8;
   Name n9;
   NodeChoice n10;
   ArrayDimsAndInits n11;
   NodeSequence n12;
   Arguments n13;
   NodeOptional n14 = new NodeOptional();
   ClassBody n15;

   {
   }
}
{
   (
      LOOKAHEAD(2)
      { n1 = new NodeSequence(4); }
      n3="new" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n4=PrimitiveType()
      { n1.addNode(n4); }
      n5=ArrayDimsAndInits()
      { n1.addNode(n5); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n6 = new NodeSequence(3); }
      n8="new" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n6.addNode(n7); }
      n9=Name()
      { n6.addNode(n9); }
      (
         (
            n11=ArrayDimsAndInits()
            { n10 = new NodeChoice(n11, 0); }
         |
            { n12 = new NodeSequence(2); }
            n13=Arguments()
            { n12.addNode(n13); }
            (
               n15=ClassBody()
               { n14.addNode(n15); }
            )?
            { n12.addNode(n14); }
            { n10 = new NodeChoice(n12, 1); }
         )
         
      )
      { n6.addNode(n10); }
      { n0 = new NodeChoice(n6, 1); }
   )
   
   { return new AllocationExpression(n0); }
}

ArrayDimsAndInits ArrayDimsAndInits() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeList n2 = new NodeList();
   NodeSequence n3;
   NodeToken n4;
   Token n5;
   Expression n6;
   NodeToken n7;
   Token n8;
   NodeListOptional n9 = new NodeListOptional();
   NodeSequence n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   NodeSequence n15;
   NodeList n16 = new NodeList();
   NodeSequence n17;
   NodeToken n18;
   Token n19;
   NodeToken n20;
   Token n21;
   ArrayInitializer n22;

   {
   }
}
{
   (
      LOOKAHEAD(2)
      { n1 = new NodeSequence(3); }
      (
         LOOKAHEAD(2)
         { n3 = new NodeSequence(3); }
         n5="[" { n4 = JTBToolkit.makeNodeToken(n5); }
         { n3.addNode(n4); }
         n6=Expression()
         { n3.addNode(n6); }
         n8="]" { n7 = JTBToolkit.makeNodeToken(n8); }
         { n3.addNode(n7); }
         { n2.addNode(n3); }
      )+
      { n2.nodes.trimToSize(); }
      { n1.addNode(n2); }
      (
         LOOKAHEAD(2)
         { n10 = new NodeSequence(2); }
         n12="[" { n11 = JTBToolkit.makeNodeToken(n12); }
         { n10.addNode(n11); }
         n14="]" { n13 = JTBToolkit.makeNodeToken(n14); }
         { n10.addNode(n13); }
         { n9.addNode(n10); }
      )*
      { n9.nodes.trimToSize(); }
      { n1.addNode(n9); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n15 = new NodeSequence(2); }
      (
         { n17 = new NodeSequence(2); }
         n19="[" { n18 = JTBToolkit.makeNodeToken(n19); }
         { n17.addNode(n18); }
         n21="]" { n20 = JTBToolkit.makeNodeToken(n21); }
         { n17.addNode(n20); }
         { n16.addNode(n17); }
      )+
      { n16.nodes.trimToSize(); }
      { n15.addNode(n16); }
      n22=ArrayInitializer()
      { n15.addNode(n22); }
      { n0 = new NodeChoice(n15, 1); }
   )
   
   { return new ArrayDimsAndInits(n0); }
}

Statement Statement() :
{
   NodeChoice n0;
   LabeledStatement n1;
   Block n2;
   EmptyStatement n3;
   NodeSequence n4;
   StatementExpression n5;
   NodeToken n6;
   Token n7;
   SwitchStatement n8;
   IfStatement n9;
   WhileStatement n10;
   DoStatement n11;
   ForStatement n12;
   BreakStatement n13;
   ContinueStatement n14;
   ReturnStatement n15;
   ThrowStatement n16;
   SynchronizedStatement n17;
   TryStatement n18;
   AssertStatement n19;

   {
   }
}
{
   (
      LOOKAHEAD(2)
      n1=LabeledStatement()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=Block()
      { n0 = new NodeChoice(n2, 1); }
   |
      n3=EmptyStatement()
      { n0 = new NodeChoice(n3, 2); }
   |
      { n4 = new NodeSequence(2); }
      n5=StatementExpression()
      { n4.addNode(n5); }
      n7=";" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n4.addNode(n6); }
      { n0 = new NodeChoice(n4, 3); }
   |
      n8=SwitchStatement()
      { n0 = new NodeChoice(n8, 4); }
   |
      n9=IfStatement()
      { n0 = new NodeChoice(n9, 5); }
   |
      n10=WhileStatement()
      { n0 = new NodeChoice(n10, 6); }
   |
      n11=DoStatement()
      { n0 = new NodeChoice(n11, 7); }
   |
      n12=ForStatement()
      { n0 = new NodeChoice(n12, 8); }
   |
      n13=BreakStatement()
      { n0 = new NodeChoice(n13, 9); }
   |
      n14=ContinueStatement()
      { n0 = new NodeChoice(n14, 10); }
   |
      n15=ReturnStatement()
      { n0 = new NodeChoice(n15, 11); }
   |
      n16=ThrowStatement()
      { n0 = new NodeChoice(n16, 12); }
   |
      n17=SynchronizedStatement()
      { n0 = new NodeChoice(n17, 13); }
   |
      n18=TryStatement()
      { n0 = new NodeChoice(n18, 14); }
   |
      n19=AssertStatement()
      { n0 = new NodeChoice(n19, 15); }
   )
   
   { return new Statement(n0); }
}

LabeledStatement LabeledStatement() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   Statement n4;

   {
   }
}
{
   n1=<IDENTIFIER> { n0 = JTBToolkit.makeNodeToken(n1); }
   n3=":" { n2 = JTBToolkit.makeNodeToken(n3); }
   n4=Statement()
   
   { return new LabeledStatement(n0,n2,n4); }
}

Block Block() :
{
   NodeToken n0;
   Token n1;
   NodeListOptional n2 = new NodeListOptional();
   BlockStatement n3;
   NodeToken n4;
   Token n5;

   {
   }
}
{
   n1="{" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      n3=BlockStatement()
      { n2.addNode(n3); }
   )*
   { n2.nodes.trimToSize(); }
   n5="}" { n4 = JTBToolkit.makeNodeToken(n5); }
   
   { return new Block(n0,n2,n4); }
}

BlockStatement BlockStatement() :
{
   NodeChoice n0;
   NodeSequence n1;
   LocalVariableDeclaration n2;
   NodeToken n3;
   Token n4;
   Statement n5;
   UnmodifiedClassDeclaration n6;
   UnmodifiedInterfaceDeclaration n7;

   {
   }
}
{
   (
      LOOKAHEAD([ "final" ] Type() <IDENTIFIER>)
      { n1 = new NodeSequence(3); }
      n2=LocalVariableDeclaration()
      { n1.addNode(n2); }
      n4=";" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n1.addNode(n3); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n5=Statement()
      { n0 = new NodeChoice(n5, 1); }
   |
      n6=UnmodifiedClassDeclaration()
      { n0 = new NodeChoice(n6, 2); }
   |
      n7=UnmodifiedInterfaceDeclaration()
      { n0 = new NodeChoice(n7, 3); }
   )
   
   { return new BlockStatement(n0); }
}

LocalVariableDeclaration LocalVariableDeclaration() :
{
   NodeOptional n0 = new NodeOptional();
   NodeToken n1;
   Token n2;
   Type n3;
   VariableDeclarator n4;
   NodeListOptional n5 = new NodeListOptional();
   NodeSequence n6;
   NodeToken n7;
   Token n8;
   VariableDeclarator n9;

   {
   }
}
{
   (
      n2="final" { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0.addNode(n1); }
   )?
   n3=Type()
   n4=VariableDeclarator()
   (
      { n6 = new NodeSequence(2); }
      n8="," { n7 = JTBToolkit.makeNodeToken(n8); }
      { n6.addNode(n7); }
      n9=VariableDeclarator()
      { n6.addNode(n9); }
      { n5.addNode(n6); }
   )*
   { n5.nodes.trimToSize(); }
   
   { return new LocalVariableDeclaration(n0,n3,n4,n5); }
}

EmptyStatement EmptyStatement() :
{
   NodeToken n0;
   Token n1;

   {
   }
}
{
   n1=";" { n0 = JTBToolkit.makeNodeToken(n1); }
   
   { return new EmptyStatement(n0); }
}

StatementExpression StatementExpression() :
{
   NodeChoice n0;
   PreIncrementExpression n1;
   PreDecrementExpression n2;
   NodeSequence n3;
   PrimaryExpression n4;
   NodeOptional n5 = new NodeOptional();
   NodeChoice n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;
   NodeSequence n11;
   AssignmentOperator n12;
   Expression n13;

   {
   }
}
{
   (
      n1=PreIncrementExpression()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=PreDecrementExpression()
      { n0 = new NodeChoice(n2, 1); }
   |
      { n3 = new NodeSequence(2); }
      n4=PrimaryExpression()
      { n3.addNode(n4); }
      (
         (
            n8="++" { n7 = JTBToolkit.makeNodeToken(n8); }
            { n6 = new NodeChoice(n7, 0); }
         |
            n10="--" { n9 = JTBToolkit.makeNodeToken(n10); }
            { n6 = new NodeChoice(n9, 1); }
         |
            { n11 = new NodeSequence(2); }
            n12=AssignmentOperator()
            { n11.addNode(n12); }
            n13=Expression()
            { n11.addNode(n13); }
            { n6 = new NodeChoice(n11, 2); }
         )
         { n5.addNode(n6); }
      )?
      { n3.addNode(n5); }
      { n0 = new NodeChoice(n3, 2); }
   )
   
   { return new StatementExpression(n0); }
}

SwitchStatement SwitchStatement() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   Expression n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   NodeListOptional n9 = new NodeListOptional();
   NodeSequence n10;
   SwitchLabel n11;
   NodeListOptional n12;
   BlockStatement n13;
   NodeToken n14;
   Token n15;

   {
   }
}
{
   n1="switch" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
   n4=Expression()
   n6=")" { n5 = JTBToolkit.makeNodeToken(n6); }
   n8="{" { n7 = JTBToolkit.makeNodeToken(n8); }
   (
      { n12 = new NodeListOptional(); }
      { n10 = new NodeSequence(2); }
      n11=SwitchLabel()
      { n10.addNode(n11); }
      (
         n13=BlockStatement()
         { n12.addNode(n13); }
      )*
      { n12.nodes.trimToSize(); }
      { n10.addNode(n12); }
      { n9.addNode(n10); }
   )*
   { n9.nodes.trimToSize(); }
   n15="}" { n14 = JTBToolkit.makeNodeToken(n15); }
   
   { return new SwitchStatement(n0,n2,n4,n5,n7,n9,n14); }
}

SwitchLabel SwitchLabel() :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   Expression n4;
   NodeToken n5;
   Token n6;
   NodeSequence n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;

   {
   }
}
{
   (
      { n1 = new NodeSequence(3); }
      n3="case" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n4=Expression()
      { n1.addNode(n4); }
      n6=":" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n1.addNode(n5); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n7 = new NodeSequence(2); }
      n9="default" { n8 = JTBToolkit.makeNodeToken(n9); }
      { n7.addNode(n8); }
      n11=":" { n10 = JTBToolkit.makeNodeToken(n11); }
      { n7.addNode(n10); }
      { n0 = new NodeChoice(n7, 1); }
   )
   
   { return new SwitchLabel(n0); }
}

IfStatement IfStatement() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   Expression n4;
   NodeToken n5;
   Token n6;
   Statement n7;
   NodeOptional n8 = new NodeOptional();
   NodeSequence n9;
   NodeToken n10;
   Token n11;
   Statement n12;

   {
   }
}
{
   n1="if" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
   n4=Expression()
   n6=")" { n5 = JTBToolkit.makeNodeToken(n6); }
   n7=Statement()
   (
      LOOKAHEAD(1)
      { n9 = new NodeSequence(2); }
      n11="else" { n10 = JTBToolkit.makeNodeToken(n11); }
      { n9.addNode(n10); }
      n12=Statement()
      { n9.addNode(n12); }
      { n8.addNode(n9); }
   )?
   
   { return new IfStatement(n0,n2,n4,n5,n7,n8); }
}

WhileStatement WhileStatement() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   Expression n4;
   NodeToken n5;
   Token n6;
   Statement n7;

   {
   }
}
{
   n1="while" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
   n4=Expression()
   n6=")" { n5 = JTBToolkit.makeNodeToken(n6); }
   n7=Statement()
   
   { return new WhileStatement(n0,n2,n4,n5,n7); }
}

DoStatement DoStatement() :
{
   NodeToken n0;
   Token n1;
   Statement n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   Expression n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;

   {
   }
}
{
   n1="do" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=Statement()
   n4="while" { n3 = JTBToolkit.makeNodeToken(n4); }
   n6="(" { n5 = JTBToolkit.makeNodeToken(n6); }
   n7=Expression()
   n9=")" { n8 = JTBToolkit.makeNodeToken(n9); }
   n11=";" { n10 = JTBToolkit.makeNodeToken(n11); }
   
   { return new DoStatement(n0,n2,n3,n5,n7,n8,n10); }
}

ForStatement ForStatement() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   NodeOptional n4 = new NodeOptional();
   ForInit n5;
   NodeToken n6;
   Token n7;
   NodeOptional n8 = new NodeOptional();
   Expression n9;
   NodeToken n10;
   Token n11;
   NodeOptional n12 = new NodeOptional();
   ForUpdate n13;
   NodeToken n14;
   Token n15;
   Statement n16;

   {
   }
}
{
   n1="for" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
   (
      n5=ForInit()
      { n4.addNode(n5); }
   )?
   n7=";" { n6 = JTBToolkit.makeNodeToken(n7); }
   (
      n9=Expression()
      { n8.addNode(n9); }
   )?
   n11=";" { n10 = JTBToolkit.makeNodeToken(n11); }
   (
      n13=ForUpdate()
      { n12.addNode(n13); }
   )?
   n15=")" { n14 = JTBToolkit.makeNodeToken(n15); }
   n16=Statement()
   
   { return new ForStatement(n0,n2,n4,n6,n8,n10,n12,n14,n16); }
}

ForInit ForInit() :
{
   NodeChoice n0;
   LocalVariableDeclaration n1;
   StatementExpressionList n2;

   {
   }
}
{
   (
      LOOKAHEAD([ "final" ] Type() <IDENTIFIER>)
      n1=LocalVariableDeclaration()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=StatementExpressionList()
      { n0 = new NodeChoice(n2, 1); }
   )
   
   { return new ForInit(n0); }
}

StatementExpressionList StatementExpressionList() :
{
   StatementExpression n0;
   NodeListOptional n1 = new NodeListOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   StatementExpression n5;

   {
   }
}
{
   n0=StatementExpression()
   (
      { n2 = new NodeSequence(2); }
      n4="," { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=StatementExpression()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
   
   { return new StatementExpressionList(n0,n1); }
}

ForUpdate ForUpdate() :
{
   StatementExpressionList n0;

   {
   }
}
{
   n0=StatementExpressionList()
   
   { return new ForUpdate(n0); }
}

BreakStatement BreakStatement() :
{
   NodeToken n0;
   Token n1;
   NodeOptional n2 = new NodeOptional();
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;

   {
   }
}
{
   n1="break" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      n4=<IDENTIFIER> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
   )?
   n6=";" { n5 = JTBToolkit.makeNodeToken(n6); }
   
   { return new BreakStatement(n0,n2,n5); }
}

ContinueStatement ContinueStatement() :
{
   NodeToken n0;
   Token n1;
   NodeOptional n2 = new NodeOptional();
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;

   {
   }
}
{
   n1="continue" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      n4=<IDENTIFIER> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
   )?
   n6=";" { n5 = JTBToolkit.makeNodeToken(n6); }
   
   { return new ContinueStatement(n0,n2,n5); }
}

ReturnStatement ReturnStatement() :
{
   NodeToken n0;
   Token n1;
   NodeOptional n2 = new NodeOptional();
   Expression n3;
   NodeToken n4;
   Token n5;

   {
   }
}
{
   n1="return" { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      n3=Expression()
      { n2.addNode(n3); }
   )?
   n5=";" { n4 = JTBToolkit.makeNodeToken(n5); }
   
   { return new ReturnStatement(n0,n2,n4); }
}

ThrowStatement ThrowStatement() :
{
   NodeToken n0;
   Token n1;
   Expression n2;
   NodeToken n3;
   Token n4;

   {
   }
}
{
   n1="throw" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=Expression()
   n4=";" { n3 = JTBToolkit.makeNodeToken(n4); }
   
   { return new ThrowStatement(n0,n2,n3); }
}

SynchronizedStatement SynchronizedStatement() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   Expression n4;
   NodeToken n5;
   Token n6;
   Block n7;

   {
   }
}
{
   n1="synchronized" { n0 = JTBToolkit.makeNodeToken(n1); }
   n3="(" { n2 = JTBToolkit.makeNodeToken(n3); }
   n4=Expression()
   n6=")" { n5 = JTBToolkit.makeNodeToken(n6); }
   n7=Block()
   
   { return new SynchronizedStatement(n0,n2,n4,n5,n7); }
}

TryStatement TryStatement() :
{
   NodeToken n0;
   Token n1;
   Block n2;
   NodeListOptional n3 = new NodeListOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   FormalParameter n9;
   NodeToken n10;
   Token n11;
   Block n12;
   NodeOptional n13 = new NodeOptional();
   NodeSequence n14;
   NodeToken n15;
   Token n16;
   Block n17;

   {
   }
}
{
   n1="try" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=Block()
   (
      { n4 = new NodeSequence(5); }
      n6="catch" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8="(" { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      n9=FormalParameter()
      { n4.addNode(n9); }
      n11=")" { n10 = JTBToolkit.makeNodeToken(n11); }
      { n4.addNode(n10); }
      n12=Block()
      { n4.addNode(n12); }
      { n3.addNode(n4); }
   )*
   { n3.nodes.trimToSize(); }
   (
      { n14 = new NodeSequence(2); }
      n16="finally" { n15 = JTBToolkit.makeNodeToken(n16); }
      { n14.addNode(n15); }
      n17=Block()
      { n14.addNode(n17); }
      { n13.addNode(n14); }
   )?
   
   { return new TryStatement(n0,n2,n3,n13); }
}

AssertStatement AssertStatement() :
{
   NodeToken n0;
   Token n1;
   Expression n2;
   NodeOptional n3 = new NodeOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   Expression n7;
   NodeToken n8;
   Token n9;

   {
   }
}
{
   n1="assert" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=Expression()
   (
      { n4 = new NodeSequence(2); }
      n6=":" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n7=Expression()
      { n4.addNode(n7); }
      { n3.addNode(n4); }
   )?
   n9=";" { n8 = JTBToolkit.makeNodeToken(n9); }
   
   { return new AssertStatement(n0,n2,n3,n8); }
}
