java parser jj

来源:互联网 发布:k线图 蜡烛图源码 编辑:程序博客网 时间:2024/04/29 01:45

// Generated by JTB 1.1
// zfzheng 2006-07-11
// 1) @see http://www.cs.purdue.edu/jtb/index.html
// 2) 生成树CMD:
//      jtb -tk -f -pp -w -printer -p com.xxx.toolkit.java.parser jtb.jj
// 3)修改说明:
//     3.1 增加注释收集(全局收集,注释无处不在,不适合放在产生式中),支持多线程解析。
//     3.2 把UnicodeConverter类内嵌,修改convertString(屏蔽),只需本单独jj文件即可产生完整的java parser。
//      3.3 PrimaryPrefix()增加Type的选择,以支持类似“boolean.class,int[].class”语句。
//      3.4 ClassBody()增加";"以支持类体声明中多余的分号。


options {
 STATIC=false;
 JAVA_UNICODE_ESCAPE = true;
// DEBUG_LOOKAHEAD=true;
// DEBUG_PARSER=true;
// DEBUG_TOKEN_MANAGER=true; 
}

PARSER_BEGIN(JTBParser)
package com.xxx.toolkit.java.parser;

import com.xxx.toolkit.java.parser.syntaxtree.*;
import java.util.*;


public class JTBParser {
 private static Map map=new HashMap();
 
 public Node parse() throws ParseException {
  return CompilationUnit();
 }

 public synchronized static List getCommentList(){
  List list=(List)map.get(Thread.currentThread());
  if(list==null){
   list=new ArrayList();
   map.put(Thread.currentThread(),list);
  }
  return list;
 }
 //记录注释
 static void addComment(String value){
  getCommentList().add(value);
 }
}

class JTBToolkit {
   static NodeToken makeNodeToken(Token t) {
      return new NodeToken(t.image.intern(), t.kind, t.beginLine, t.beginColumn, t.endLine, t.endColumn);
   }
}
class UnicodeConverter {
   public static void printout (String s)   {
      System.out.print(convertString(s));
   }

   public static boolean isASCII(char c) {
      return ((int)c>=32 && (int)c<=126) || (c=='/r') || (c=='/n') || (c=='/t');
   }

   public static char hexToChar (int hex) {
      if (hex < 10)  return (char)(hex + (int)'0');
      else           return (char)(hex - 10 + (int)'a');
   }

   public static char[] unicodeToString(char c) {
      char[] ca = { '//', 'u', '/0', '/0', '/0', '/0' };
      ca[2] = hexToChar(((int)c >> 12) & 0x0f);
      ca[3] = hexToChar(((int)c >>  8) & 0x0f);
      ca[4] = hexToChar(((int)c >>  4) & 0x0f);
      ca[5] = hexToChar(((int)c      ) & 0x0f);
      return ca;
   }

   public static String convertString(String s) {
//      int len = s.length();
//      StringBuffer sb = new StringBuffer();
//      for (int i=0; i<len; i++) {
//         char c = s.charAt(i);
//         if (isASCII(c)) sb.append(c);
//         else sb.append(unicodeToString(c));
//      }
//      return sb.toString();
  return s;
   }
}

PARSER_END(JTBParser)

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

SPECIAL_TOKEN :
//TOKEN:
{
   <#SINGLE_LINE_COMMENT: "//" (~["/n", "/r"])* ("/n" | "/r" | "/r/n")>
   | <#FORMAL_COMMENT: "/**" (~["*"])* "*" ("*" | (~["*", "/"] (~["*"])* "*"))* "/">
   | <#MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*", "/"] (~["*"])* "*"))* "/">
   |<COMMENT: (<SINGLE_LINE_COMMENT>)|(<FORMAL_COMMENT>)|(<MULTI_LINE_COMMENT>) > {
     JTBParser.addComment(matchedToken.image);
   }
}

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">
}

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"]))) "'">
      {
         matchedToken.image = UnicodeConverter.convertString(image.toString());
      }
   | <STRING_LITERAL: "/"" ((~["/"", "//", "/n", "/r"]) | ("//" (["n", "t", "b", "r", "f", "//", "'", "/""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"])))* "/"">
      {
         matchedToken.image = UnicodeConverter.convertString(image.toString());
      }
}

TOKEN :
{
   <#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: ">>>=">
}

//Comment Comment():{
//   NodeList list=new NodeList();
//   NodeToken n;
//   Token t;
//}
//{
// (t=<COMMENT>{
//  n = JTBToolkit.makeNodeToken(t);
//  list.addNode(n);
// })+
// {
//  System.out.println(list);
//  return new Comment(list);
// }
//}

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

   {
   }
}
{
   (
      n1=PackageDeclaration()
      { n0.addNode(n1); }
   )?
   (
      n3=ImportDeclaration()
      { n2.addNode(n3); }
   )*
   { n2.nodes.trimToSize(); }
   (
      n5=TypeDeclaration()
      { n4.addNode(n5); }
   )*
   { n4.nodes.trimToSize(); }
 
   { return new CompilationUnit(n0,n2,n4); }
}

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" )* "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;
   UnmodifiedClassDeclaration n8;

   {
   }
}
{
   (
      (
         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); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n8=UnmodifiedClassDeclaration()
 
   { return new ClassDeclaration(n0,n8); }
}

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;
   UnmodifiedClassDeclaration n14;

   {
   }
}
{
   (
      (
         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); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n14=UnmodifiedClassDeclaration()
 
   { return new NestedClassDeclaration(n0,n14); }
}

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

   {
   }
}
{
   (
      LOOKAHEAD(2)
      n1=Initializer()
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class")
      n2=NestedClassDeclaration()
      { n0 = new NodeChoice(n2, 1); }
   |
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "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); }
   )
 
   { 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;
   ResultType n18;
   NodeToken n19;
   Token n20;
   NodeToken n21;
   Token n22;

   {
   }
}
{
   (
      (
         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); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n18=ResultType()
   n20=<IDENTIFIER> { n19 = JTBToolkit.makeNodeToken(n20); }
   n22="(" { n21 = JTBToolkit.makeNodeToken(n22); }
 
   { return new MethodDeclarationLookahead(n0,n18,n19,n21); }
}

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

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

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;
   UnmodifiedInterfaceDeclaration n14;

   {
   }
}
{
   (
      (
         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); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n14=UnmodifiedInterfaceDeclaration()
 
   { return new NestedInterfaceDeclaration(n0,n14); }
}

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;

   {
   }
}
{
   (
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class")
      n1=NestedClassDeclaration()
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface")
      n2=NestedInterfaceDeclaration()
      { n0 = new NodeChoice(n2, 1); }
   |
      LOOKAHEAD(MethodDeclarationLookahead())
      n3=MethodDeclaration()
      { n0 = new NodeChoice(n3, 2); }
   |
      n4=FieldDeclaration()
      { n0 = new NodeChoice(n4, 3); }
   )
 
   { 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=BLOCKED 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;
   ResultType n18;
   MethodDeclarator n19;
   NodeOptional n20 = new NodeOptional();
   NodeSequence n21;
   NodeToken n22;
   Token n23;
   NameList n24;
   NodeChoice n25;
   Block n26;
   NodeToken n27;
   Token n28;

   {
   }
}
{
   (
      (
         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); }
      )
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
   n18=ResultType()
   n19=MethodDeclarator()
   (
      { n21 = new NodeSequence(2); }
      n23="throws" { n22 = JTBToolkit.makeNodeToken(n23); }
      { n21.addNode(n22); }
      n24=NameList()
      { n21.addNode(n24); }
      { n20.addNode(n21); }
   )?
   (
      (
         n26=Block()
         { n25 = new NodeChoice(n26, 0); }
      |
         n28=";" { n27 = JTBToolkit.makeNodeToken(n28); }
         { n25 = new NodeChoice(n27, 1); }
      )
    
   )
 
   { return new MethodDeclaration(n0,n18,n19,n20,n25); }
}

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=PrimaryBLOCKED EXPRESSION
         { 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 BLOCKED EXPRESSION :
{
   NodeChoice n0;
   Assignment n1;
   ConditionalExpression n2;

   {
   }
}
{
   (
      LOOKAHEAD(PrimaryBLOCKED EXPRESSION AssignmentOperator())
      n1=Assignment()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=ConditionalBLOCKED EXPRESSION
      { n0 = new NodeChoice(n2, 1); }
   )
 
   { return new Expression(n0); }
}

Assignment Assignment() :
{
   PrimaryExpression n0;
   AssignmentOperator n1;
   Expression n2;

   {
   }
}
{
   n0=PrimaryBLOCKED EXPRESSION
   n1=AssignmentOperator()
   n2=BLOCKED EXPRESSION
 
   { return new Assignment(n0,n1,n2); }
}

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 ConditionalBLOCKED EXPRESSION :
{
   ConditionalOrExpression n0;
   NodeOptional n1 = new NodeOptional();
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   Expression n5;
   NodeToken n6;
   Token n7;
   ConditionalExpression n8;

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

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

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

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

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

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

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

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

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

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

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

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

   {
   }
}
{
   n0=InstanceOfBLOCKED EXPRESSION
   (
      { 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=InstanceOfBLOCKED EXPRESSION
      { n2.addNode(n8); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new EqualityExpression(n0,n1); }
}

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

   {
   }
}
{
   n0=RelationalBLOCKED EXPRESSION
   (
      { 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 RelationalBLOCKED EXPRESSION :
{
   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=ShiftBLOCKED EXPRESSION
   (
      { 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=ShiftBLOCKED EXPRESSION
      { n2.addNode(n12); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new RelationalExpression(n0,n1); }
}

ShiftExpression ShiftBLOCKED EXPRESSION :
{
   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=AdditiveBLOCKED EXPRESSION
   (
      { 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=AdditiveBLOCKED EXPRESSION
      { n2.addNode(n10); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new ShiftExpression(n0,n1); }
}

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

   {
   }
}
{
   n0=MultiplicativeBLOCKED EXPRESSION
   (
      { 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=MultiplicativeBLOCKED EXPRESSION
      { n2.addNode(n8); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new AdditiveExpression(n0,n1); }
}

MultiplicativeExpression MultiplicativeBLOCKED EXPRESSION :
{
   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=UnaryBLOCKED EXPRESSION
   (
      { 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=UnaryBLOCKED EXPRESSION
      { n2.addNode(n10); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new MultiplicativeExpression(n0,n1); }
}

UnaryExpression UnaryBLOCKED EXPRESSION :
{
   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=UnaryBLOCKED EXPRESSION
      { n1.addNode(n7); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n8=PreIncrementBLOCKED EXPRESSION
      { n0 = new NodeChoice(n8, 1); }
   |
      n9=PreDecrementBLOCKED EXPRESSION
      { n0 = new NodeChoice(n9, 2); }
   |
      n10=UnaryExpressionNotPlusMinus()
      { n0 = new NodeChoice(n10, 3); }
   )
 
   { return new UnaryExpression(n0); }
}

PreIncrementExpression PreIncrementBLOCKED EXPRESSION :
{
   NodeToken n0;
   Token n1;
   PrimaryExpression n2;

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

PreDecrementExpression PreDecrementBLOCKED EXPRESSION :
{
   NodeToken n0;
   Token n1;
   PrimaryExpression n2;

   {
   }
}
{
   n1="--" { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=PrimaryBLOCKED EXPRESSION
 
   { 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=UnaryBLOCKED EXPRESSION
      { n1.addNode(n7); }
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(CastLookahead())
      n8=CastBLOCKED EXPRESSION
      { n0 = new NodeChoice(n8, 1); }
   |
      n9=PostfixBLOCKED EXPRESSION
      { 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 PostfixBLOCKED EXPRESSION :
{
   PrimaryExpression n0;
   NodeOptional n1 = new NodeOptional();
   NodeChoice n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;

   {
   }
}
{
   n0=PrimaryBLOCKED EXPRESSION
   (
      (
         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 CastBLOCKED EXPRESSION :
{
   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=UnaryBLOCKED EXPRESSION
      { n1.addNode(n7); }
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD("(" Name())
      { n8 = new NodeSequence(5); }
      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 PrimaryBLOCKED EXPRESSION :
{
   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;
   Name n2;
   NodeToken n3;
   Token n4;
   NodeSequence n5;
   NodeToken n6;
   Token n7;
   NodeToken n8;
   Token n9;
   NodeToken n10;
   Token n11;
   NodeSequence n12;
   NodeToken n13;
   Token n14;
   Expression n15;
   NodeToken n16;
   Token n17;
   AllocationExpression n18;
   Type n19;
 
   {
   }
}
{
   (
      n1=Literal()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=Name()
      { n0 = new NodeChoice(n2, 1); }
   |
      n4="this" { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 2); }
   |
      { n5 = new NodeSequence(3); }
      n7="super" { n6 = JTBToolkit.makeNodeToken(n7); }
      { n5.addNode(n6); }
      n9="." { n8 = JTBToolkit.makeNodeToken(n9); }
      { n5.addNode(n8); }
      n11=<IDENTIFIER> { n10 = JTBToolkit.makeNodeToken(n11); }
      { n5.addNode(n10); }
      { n0 = new NodeChoice(n5, 3); }
   |
      { n12 = new NodeSequence(3); }
      n14="(" { n13 = JTBToolkit.makeNodeToken(n14); }
      { n12.addNode(n13); }
      n15=BLOCKED EXPRESSION
      { n12.addNode(n15); }
      n17=")" { n16 = JTBToolkit.makeNodeToken(n17); }
      { n12.addNode(n16); }
      { n0 = new NodeChoice(n12, 4); }
   |
      n18=AllocationBLOCKED EXPRESSION
      { n0 = new NodeChoice(n18, 5); }
   |
   n19=Type()
      { n0 = new NodeChoice(n19, 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="class" { 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=AllocationBLOCKED EXPRESSION
      { n11.addNode(n14); }
      { n0 = new NodeChoice(n11, 2); }
   |
      { n15 = new NodeSequence(3); }
      n17="[" { n16 = JTBToolkit.makeNodeToken(n17); }
      { n15.addNode(n16); }
      n18=BLOCKED 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=BLOCKED EXPRESSION
   (
      { n2 = new NodeSequence(2); }
      n4="," { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=BLOCKED EXPRESSION
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new ArgumentList(n0,n1); }
}

AllocationExpression AllocationBLOCKED EXPRESSION :
{
   NodeChoice n0;
   NodeSequence n1;
   NodeToken n2;
   Token n3;
   PrimitiveType n4;
   ArrayDimensions n5;
   NodeOptional n6 = new NodeOptional();
   ArrayInitializer n7;
   NodeSequence n8;
   NodeToken n9;
   Token n10;
   Name n11;
   NodeChoice n12;
   NodeSequence n13;
   ArrayDimensions n14;
   NodeOptional n15 = new NodeOptional();
   ArrayInitializer n16;
   NodeSequence n17;
   Arguments n18;
   NodeOptional n19 = new NodeOptional();
   ClassBody n20;

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

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

   {
   }
}
{
   (
      LOOKAHEAD(2)
      { n1 = new NodeSequence(3); }
      n3="[" { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      (
       n4=BLOCKED EXPRESSION{ n1.addNode(n4); }
       )?
      n6="]" { n5 = JTBToolkit.makeNodeToken(n6); }
      { n1.addNode(n5); }
      { n0.addNode(n1); }
   )+
   { n0.nodes.trimToSize(); }
   (
      LOOKAHEAD(2)
      { n8 = new NodeSequence(2); }
      n10="[" { n9 = JTBToolkit.makeNodeToken(n10); }
      { n8.addNode(n9); }
      n12="]" { n11 = JTBToolkit.makeNodeToken(n12); }
      { n8.addNode(n11); }
      { n7.addNode(n8); }
   )*
   { n7.nodes.trimToSize(); }
 
   { return new ArrayDimensions(n0,n7); }
}

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;

   {
   }
}
{
   (
      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=StatementBLOCKED EXPRESSION
      { 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); }
   )
 
   { 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;

   {
   }
}
{
   (
      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); }
   )
 
   { 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 StatementBLOCKED EXPRESSION :
{
   NodeChoice n0;
   PreIncrementExpression n1;
   PreDecrementExpression n2;
   Assignment n3;
   PostfixExpression n4;

   {
   }
}
{
   (
      n1=PreIncrementBLOCKED EXPRESSION
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=PreDecrementBLOCKED EXPRESSION
      { n0 = new NodeChoice(n2, 1); }
   |
      LOOKAHEAD(PrimaryBLOCKED EXPRESSION AssignmentOperator())
      n3=Assignment()
      { n0 = new NodeChoice(n3, 2); }
   |
      n4=PostfixBLOCKED EXPRESSION
      { n0 = new NodeChoice(n4, 3); }
   )
 
   { 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=BLOCKED 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=BLOCKED 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=BLOCKED 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=BLOCKED 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=BLOCKED 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=BLOCKED 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=StatementBLOCKED EXPRESSION
   (
      { n2 = new NodeSequence(2); }
      n4="," { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=StatementBLOCKED EXPRESSION
      { 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=BLOCKED 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=BLOCKED 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=BLOCKED 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); }
}

TOKEN :
{
   <EOF_TK: "EOF">
   | <IGNORE_CASE_TK: "IGNORE_CASE">
   | <JAVACODE_TK: "JAVACODE">
   | <LOOKAHEAD_TK: "LOOKAHEAD">
   | <MORE_TK: "MORE">
   | <OPTIONS_TK: "options">
   | <PARSER_BEGIN_TK: "PARSER_BEGIN">
   | <PARSER_END_TK: "PARSER_END">
   | <SKIP_TK: "SKIP">
   | <SPECIAL_TOKEN_TK: "SPECIAL_TOKEN">
   | <TOKEN_TK: "TOKEN">
   | <TOKEN_MGR_DECLS_TK: "TOKEN_MGR_DECLS">
}

TOKEN :
{
   <IDENTIFIER: <LETTER> (<LETTER> | <DIGIT>)* >
}

TOKEN :
{
   <POUND: "#">
}

JavaCCInput JavaCCInput() :
{
   JavaCCOptions n0;
   NodeToken n1;
   Token n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   CompilationUnit n9;
   NodeToken n10;
   Token n11;
   NodeToken n12;
   Token n13;
   NodeToken n14;
   Token n15;
   NodeToken n16;
   Token n17;
   NodeListOptional n18 = new NodeListOptional();
   Production n19;
   NodeToken n20;
   Token n21;

   {
   }
}
{
   n0=JavaCCOptions()
   n2=<PARSER_BEGIN_TK> { n1 = JTBToolkit.makeNodeToken(n2); }
   n4=<LPAREN> { n3 = JTBToolkit.makeNodeToken(n4); }
   n6=<IDENTIFIER> { n5 = JTBToolkit.makeNodeToken(n6); }
   n8=<RPAREN> { n7 = JTBToolkit.makeNodeToken(n8); }
   n9=CompilationUnit()
   n11=<PARSER_END_TK> { n10 = JTBToolkit.makeNodeToken(n11); }
   n13=<LPAREN> { n12 = JTBToolkit.makeNodeToken(n13); }
   n15=<IDENTIFIER> { n14 = JTBToolkit.makeNodeToken(n15); }
   n17=<RPAREN> { n16 = JTBToolkit.makeNodeToken(n17); }
   (
      n19=Production()
      { n18.addNode(n19); }
   )*
   { n18.nodes.trimToSize(); }
   n21=<EOF> { n20 = JTBToolkit.makeNodeToken(n21); }
 
   { return new JavaCCInput(n0,n1,n3,n5,n7,n9,n10,n12,n14,n16,n18,n20); }
}

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

   {
   }
}
{
   (
      { n6 = new NodeListOptional(); }
      { n1 = new NodeSequence(4); }
      n3=<OPTIONS_TK> { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n5=<LBRACE> { n4 = JTBToolkit.makeNodeToken(n5); }
      { n1.addNode(n4); }
      (
         n7=OptionBinding()
         { n6.addNode(n7); }
      )*
      { n6.nodes.trimToSize(); }
      { n1.addNode(n6); }
      n9=<RBRACE> { n8 = JTBToolkit.makeNodeToken(n9); }
      { n1.addNode(n8); }
      { n0.addNode(n1); }
   )?
 
   { return new JavaCCOptions(n0); }
}

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

   {
   }
}
{
   (
      (
         n2=<IDENTIFIER> { n1 = JTBToolkit.makeNodeToken(n2); }
         { n0 = new NodeChoice(n1, 0); }
      |
         n4=<LOOKAHEAD_TK> { n3 = JTBToolkit.makeNodeToken(n4); }
         { n0 = new NodeChoice(n3, 1); }
      |
         n6=<IGNORE_CASE_TK> { n5 = JTBToolkit.makeNodeToken(n6); }
         { n0 = new NodeChoice(n5, 2); }
      |
         n8=<STATIC> { n7 = JTBToolkit.makeNodeToken(n8); }
         { n0 = new NodeChoice(n7, 3); }
      )
    
   )
   n10=<ASSIGN> { n9 = JTBToolkit.makeNodeToken(n10); }
   (
      (
         n13=<INTEGER_LITERAL> { n12 = JTBToolkit.makeNodeToken(n13); }
         { n11 = new NodeChoice(n12, 0); }
      |
         n14=BooleanLiteral()
         { n11 = new NodeChoice(n14, 1); }
      |
         n16=<STRING_LITERAL> { n15 = JTBToolkit.makeNodeToken(n16); }
         { n11 = new NodeChoice(n15, 2); }
      )
    
   )
   n18=<SEMICOLON> { n17 = JTBToolkit.makeNodeToken(n18); }
 
   { return new OptionBinding(n0,n9,n11,n17); }
}

Production Production() :
{
   NodeChoice n0;
   JavaCodeProduction n1;
   RegularExprProduction n2;
   BNFProduction n3;
   TokenManagerDecls n4;

   {
   }
}
{
   (
      n1=JavaCodeProduction()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=RegularExprProduction()
      { n0 = new NodeChoice(n2, 1); }
   |
      n3=BNFProduction()
      { n0 = new NodeChoice(n3, 2); }
   |
      n4=TokenManagerDecls()
      { n0 = new NodeChoice(n4, 3); }
   )
 
   { return new Production(n0); }
}

JavaCodeProduction JavaCodeProduction() :
{
   NodeToken n0;
   Token n1;
   ResultType n2;
   NodeToken n3;
   Token n4;
   FormalParameters n5;
   Block n6;

   {
   }
}
{
   n1=<JAVACODE_TK> { n0 = JTBToolkit.makeNodeToken(n1); }
   n2=ResultType()
   n4=<IDENTIFIER> { n3 = JTBToolkit.makeNodeToken(n4); }
   n5=FormalParameters()
   n6=Block()
 
   { return new JavaCodeProduction(n0,n2,n3,n5,n6); }
}

BNFProduction BNFProduction() :
{
   ResultType n0;
   NodeToken n1;
   Token n2;
   FormalParameters n3;
   NodeToken n4;
   Token n5;
   Block n6;
   NodeToken n7;
   Token n8;
   ExpansionChoices n9;
   NodeToken n10;
   Token n11;

   {
   }
}
{
   n0=ResultType()
   n2=<IDENTIFIER> { n1 = JTBToolkit.makeNodeToken(n2); }
   n3=FormalParameters()
   n5=<COLON> { n4 = JTBToolkit.makeNodeToken(n5); }
   n6=Block()
   n8=<LBRACE> { n7 = JTBToolkit.makeNodeToken(n8); }
   n9=ExpansionChoices()
   n11=<RBRACE> { n10 = JTBToolkit.makeNodeToken(n11); }
 
   { return new BNFProduction(n0,n1,n3,n4,n6,n7,n9,n10); }
}

RegularExprProduction RegularExprProduction() :
{
   NodeOptional n0 = new NodeOptional();
   LexicalStateList n1;
   RegExprKind n2;
   NodeOptional n3 = new NodeOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;
   NodeToken n9;
   Token n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   RegExprSpec n15;
   NodeListOptional n16 = new NodeListOptional();
   NodeSequence n17;
   NodeToken n18;
   Token n19;
   RegExprSpec n20;
   NodeToken n21;
   Token n22;

   {
   }
}
{
   (
      n1=LexicalStateList()
      { n0.addNode(n1); }
   )?
   n2=RegExprKind()
   (
      { n4 = new NodeSequence(3); }
      n6=<LBRACKET> { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8=<IGNORE_CASE_TK> { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      n10=<RBRACKET> { n9 = JTBToolkit.makeNodeToken(n10); }
      { n4.addNode(n9); }
      { n3.addNode(n4); }
   )?
   n12=<COLON> { n11 = JTBToolkit.makeNodeToken(n12); }
   n14=<LBRACE> { n13 = JTBToolkit.makeNodeToken(n14); }
   n15=RegExprSpec()
   (
      { n17 = new NodeSequence(2); }
      n19=<BIT_OR> { n18 = JTBToolkit.makeNodeToken(n19); }
      { n17.addNode(n18); }
      n20=RegExprSpec()
      { n17.addNode(n20); }
      { n16.addNode(n17); }
   )*
   { n16.nodes.trimToSize(); }
   n22=<RBRACE> { n21 = JTBToolkit.makeNodeToken(n22); }
 
   { return new RegularExprProduction(n0,n2,n3,n11,n13,n15,n16,n21); }
}

TokenManagerDecls TokenManagerDecls() :
{
   NodeToken n0;
   Token n1;
   NodeToken n2;
   Token n3;
   ClassBody n4;

   {
   }
}
{
   n1=<TOKEN_MGR_DECLS_TK> { n0 = JTBToolkit.makeNodeToken(n1); }
   n3=<COLON> { n2 = JTBToolkit.makeNodeToken(n3); }
   n4=ClassBody()
 
   { return new TokenManagerDecls(n0,n2,n4); }
}

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

   {
   }
}
{
   (
      LOOKAHEAD(2)
      { n1 = new NodeSequence(4); }
      n3=<LT> { n2 = JTBToolkit.makeNodeToken(n3); }
      { n1.addNode(n2); }
      n5=<STAR> { n4 = JTBToolkit.makeNodeToken(n5); }
      { n1.addNode(n4); }
      n7=<GT> { n6 = JTBToolkit.makeNodeToken(n7); }
      { n1.addNode(n6); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n8 = new NodeSequence(4); }
      n10=<LT> { n9 = JTBToolkit.makeNodeToken(n10); }
      { n8.addNode(n9); }
      n12=<IDENTIFIER> { n11 = JTBToolkit.makeNodeToken(n12); }
      { n8.addNode(n11); }
      (
         { n14 = new NodeSequence(2); }
         n16=<COMMA> { n15 = JTBToolkit.makeNodeToken(n16); }
         { n14.addNode(n15); }
         n18=<IDENTIFIER> { n17 = JTBToolkit.makeNodeToken(n18); }
         { n14.addNode(n17); }
         { n13.addNode(n14); }
      )*
      { n13.nodes.trimToSize(); }
      { n8.addNode(n13); }
      n20=<GT> { n19 = JTBToolkit.makeNodeToken(n20); }
      { n8.addNode(n19); }
      { n0 = new NodeChoice(n8, 1); }
   )
 
   { return new LexicalStateList(n0); }
}

RegExprKind RegExprKind() :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   NodeToken n3;
   Token n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;

   {
   }
}
{
   (
      n2=<TOKEN_TK> { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      n4=<SPECIAL_TOKEN_TK> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n0 = new NodeChoice(n3, 1); }
   |
      n6=<SKIP_TK> { n5 = JTBToolkit.makeNodeToken(n6); }
      { n0 = new NodeChoice(n5, 2); }
   |
      n8=<MORE_TK> { n7 = JTBToolkit.makeNodeToken(n8); }
      { n0 = new NodeChoice(n7, 3); }
   )
 
   { return new RegExprKind(n0); }
}

RegExprSpec RegExprSpec() :
{
   RegularExpression n0;
   NodeOptional n1 = new NodeOptional();
   Block n2;
   NodeOptional n3 = new NodeOptional();
   NodeSequence n4;
   NodeToken n5;
   Token n6;
   NodeToken n7;
   Token n8;

   {
   }
}
{
   n0=RegularBLOCKED EXPRESSION
   (
      n2=Block()
      { n1.addNode(n2); }
   )?
   (
      { n4 = new NodeSequence(2); }
      n6=<COLON> { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
      n8=<IDENTIFIER> { n7 = JTBToolkit.makeNodeToken(n8); }
      { n4.addNode(n7); }
      { n3.addNode(n4); }
   )?
 
   { return new RegExprSpec(n0,n1,n3); }
}

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

   {
   }
}
{
   n0=Expansion()
   (
      { n2 = new NodeSequence(2); }
      n4=<BIT_OR> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=Expansion()
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new ExpansionChoices(n0,n1); }
}

Expansion Expansion() :
{
   NodeListOptional n0 = new NodeListOptional();
   ExpansionUnit n1;

   {
   }
}
{
   (
      LOOKAHEAD(ExpansionUnit())
      n1=ExpansionUnit()
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
 
   { return new Expansion(n0); }
}

ExpansionUnit ExpansionUnit() :
{
   NodeChoice n0;
   LocalLookahead n1;
   Block n2;
   NodeSequence n3;
   NodeToken n4;
   Token n5;
   ExpansionChoices n6;
   NodeToken n7;
   Token n8;
   NodeOptional n9 = new NodeOptional();
   NodeChoice n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   NodeToken n15;
   Token n16;
   NodeSequence n17;
   NodeToken n18;
   Token n19;
   ExpansionChoices n20;
   NodeToken n21;
   Token n22;
   NodeSequence n23;
   NodeOptional n24 = new NodeOptional();
   NodeSequence n25;
   PrimaryExpression n26;
   NodeToken n27;
   Token n28;
   ExpansionUnitTerm n29;

   {
   }
}
{
   (
      n1=LocalLookahead()
      { n0 = new NodeChoice(n1, 0); }
   |
      n2=Block()
      { n0 = new NodeChoice(n2, 1); }
   |
      LOOKAHEAD(3)
      { n3 = new NodeSequence(5); }
      n5=<LPAREN> { n4 = JTBToolkit.makeNodeToken(n5); }
      { n3.addNode(n4); }
      n6=ExpansionChoices()
      { n3.addNode(n6); }
      n8=<RPAREN> { n7 = JTBToolkit.makeNodeToken(n8); }
      { n3.addNode(n7); }
      (
         (
            n12=<PLUS> { n11 = JTBToolkit.makeNodeToken(n12); }
            { n10 = new NodeChoice(n11, 0); }
         |
            n14=<STAR> { n13 = JTBToolkit.makeNodeToken(n14); }
            { n10 = new NodeChoice(n13, 1); }
         |
            n16=<HOOK> { n15 = JTBToolkit.makeNodeToken(n16); }
            { n10 = new NodeChoice(n15, 2); }
         )
         { n9.addNode(n10); }
      )?
      { n3.addNode(n9); }
      { n0 = new NodeChoice(n3, 2); }
   |
      { n17 = new NodeSequence(3); }
      n19=<LBRACKET> { n18 = JTBToolkit.makeNodeToken(n19); }
      { n17.addNode(n18); }
      n20=ExpansionChoices()
      { n17.addNode(n20); }
      n22=<RBRACKET> { n21 = JTBToolkit.makeNodeToken(n22); }
      { n17.addNode(n21); }
      { n0 = new NodeChoice(n17, 3); }
   |
      { n23 = new NodeSequence(2); }
      (
         LOOKAHEAD(2000000000)
         { n25 = new NodeSequence(2); }
         n26=PrimaryBLOCKED EXPRESSION
         { n25.addNode(n26); }
         n28=<ASSIGN> { n27 = JTBToolkit.makeNodeToken(n28); }
         { n25.addNode(n27); }
         { n24.addNode(n25); }
      )?
      { n23.addNode(n24); }
      n29=ExpansionUnitTerm()
      { n23.addNode(n29); }
      { n0 = new NodeChoice(n23, 4); }
   )
 
   { return new ExpansionUnit(n0); }
}

ExpansionUnitTerm ExpansionUnitTerm() :
{
   NodeChoice n0;
   RegularExpression n1;
   NodeSequence n2;
   NodeToken n3;
   Token n4;
   Arguments n5;

   {
   }
}
{
   (
      n1=RegularBLOCKED EXPRESSION
      { n0 = new NodeChoice(n1, 0); }
   |
      { n2 = new NodeSequence(2); }
      n4=<IDENTIFIER> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=Arguments()
      { n2.addNode(n5); }
      { n0 = new NodeChoice(n2, 1); }
   )
 
   { return new ExpansionUnitTerm(n0); }
}

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

   {
   }
}
{
   n1=<LOOKAHEAD_TK> { n0 = JTBToolkit.makeNodeToken(n1); }
   n3=<LPAREN> { n2 = JTBToolkit.makeNodeToken(n3); }
   (
      LOOKAHEAD(2)
      n6=<INTEGER_LITERAL> { n5 = JTBToolkit.makeNodeToken(n6); }
      { n4.addNode(n5); }
   )?
   (
      LOOKAHEAD(2)
      n9=<COMMA> { n8 = JTBToolkit.makeNodeToken(n9); }
      { n7.addNode(n8); }
   )?
   n10=ExpansionChoices()
   (
      n13=<COMMA> { n12 = JTBToolkit.makeNodeToken(n13); }
      { n11.addNode(n12); }
   )?
   (
      { n15 = new NodeSequence(3); }
      n17=<LBRACE> { n16 = JTBToolkit.makeNodeToken(n17); }
      { n15.addNode(n16); }
      n18=BLOCKED EXPRESSION
      { n15.addNode(n18); }
      n20=<RBRACE> { n19 = JTBToolkit.makeNodeToken(n20); }
      { n15.addNode(n19); }
      { n14.addNode(n15); }
   )?
   n22=<RPAREN> { n21 = JTBToolkit.makeNodeToken(n22); }
 
   { return new LocalLookahead(n0,n2,n4,n7,n10,n11,n14,n21); }
}

RegularExpression RegularBLOCKED EXPRESSION :
{
   NodeChoice n0;
   NodeToken n1;
   Token n2;
   NodeSequence n3;
   NodeToken n4;
   Token n5;
   NodeOptional n6 = new NodeOptional();
   NodeSequence n7;
   NodeOptional n8;
   NodeToken n9;
   Token n10;
   NodeToken n11;
   Token n12;
   NodeToken n13;
   Token n14;
   ComplexRegularExpressionChoices n15;
   NodeToken n16;
   Token n17;
   NodeSequence n18;
   NodeToken n19;
   Token n20;
   NodeToken n21;
   Token n22;
   NodeToken n23;
   Token n24;
   NodeSequence n25;
   NodeToken n26;
   Token n27;
   NodeToken n28;
   Token n29;
   NodeToken n30;
   Token n31;

   {
   }
}
{
   (
      n2=<STRING_LITERAL> { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      LOOKAHEAD(3)
      { n3 = new NodeSequence(5); }
      n5=<LT> { n4 = JTBToolkit.makeNodeToken(n5); }
      { n3.addNode(n4); }
      (
         { n8 = new NodeOptional(); }
         { n7 = new NodeSequence(3); }
         (
            n10=<POUND> { n9 = JTBToolkit.makeNodeToken(n10); }
            { n8.addNode(n9); }
         )?
         { n7.addNode(n8); }
         n12=<IDENTIFIER> { n11 = JTBToolkit.makeNodeToken(n12); }
         { n7.addNode(n11); }
         n14=<COLON> { n13 = JTBToolkit.makeNodeToken(n14); }
         { n7.addNode(n13); }
         { n6.addNode(n7); }
      )?
      { n3.addNode(n6); }
      n15=ComplexRegularExpressionChoices()
      { n3.addNode(n15); }
      n17=<GT> { n16 = JTBToolkit.makeNodeToken(n17); }
      { n3.addNode(n16); }
      { n0 = new NodeChoice(n3, 1); }
   |
      LOOKAHEAD(2)
      { n18 = new NodeSequence(4); }
      n20=<LT> { n19 = JTBToolkit.makeNodeToken(n20); }
      { n18.addNode(n19); }
      n22=<IDENTIFIER> { n21 = JTBToolkit.makeNodeToken(n22); }
      { n18.addNode(n21); }
      n24=<GT> { n23 = JTBToolkit.makeNodeToken(n24); }
      { n18.addNode(n23); }
      { n0 = new NodeChoice(n18, 2); }
   |
      { n25 = new NodeSequence(3); }
      n27=<LT> { n26 = JTBToolkit.makeNodeToken(n27); }
      { n25.addNode(n26); }
      n29=<EOF_TK> { n28 = JTBToolkit.makeNodeToken(n29); }
      { n25.addNode(n28); }
      n31=<GT> { n30 = JTBToolkit.makeNodeToken(n31); }
      { n25.addNode(n30); }
      { n0 = new NodeChoice(n25, 3); }
   )
 
   { return new RegularExpression(n0); }
}

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

   {
   }
}
{
   n0=ComplexRegularBLOCKED EXPRESSION
   (
      { n2 = new NodeSequence(2); }
      n4=<BIT_OR> { n3 = JTBToolkit.makeNodeToken(n4); }
      { n2.addNode(n3); }
      n5=ComplexRegularBLOCKED EXPRESSION
      { n2.addNode(n5); }
      { n1.addNode(n2); }
   )*
   { n1.nodes.trimToSize(); }
 
   { return new ComplexRegularExpressionChoices(n0,n1); }
}

ComplexRegularExpression ComplexRegularBLOCKED EXPRESSION :
{
   NodeListOptional n0 = new NodeListOptional();
   ComplexRegularExpressionUnit n1;

   {
   }
}
{
   (
      n1=ComplexRegularExpressionUnit()
      { n0.addNode(n1); }
   )*
   { n0.nodes.trimToSize(); }
 
   { return new ComplexRegularExpression(n0); }
}

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

   {
   }
}
{
   (
      n2=<STRING_LITERAL> { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0 = new NodeChoice(n1, 0); }
   |
      { n3 = new NodeSequence(3); }
      n5=<LT> { n4 = JTBToolkit.makeNodeToken(n5); }
      { n3.addNode(n4); }
      n7=<IDENTIFIER> { n6 = JTBToolkit.makeNodeToken(n7); }
      { n3.addNode(n6); }
      n9=<GT> { n8 = JTBToolkit.makeNodeToken(n9); }
      { n3.addNode(n8); }
      { n0 = new NodeChoice(n3, 1); }
   |
      n10=CharacterList()
      { n0 = new NodeChoice(n10, 2); }
   |
      { n11 = new NodeSequence(4); }
      n13=<LPAREN> { n12 = JTBToolkit.makeNodeToken(n13); }
      { n11.addNode(n12); }
      n14=ComplexRegularExpressionChoices()
      { n11.addNode(n14); }
      n16=<RPAREN> { n15 = JTBToolkit.makeNodeToken(n16); }
      { n11.addNode(n15); }
      (
         (
            n20=<PLUS> { n19 = JTBToolkit.makeNodeToken(n20); }
            { n18 = new NodeChoice(n19, 0); }
         |
            n22=<STAR> { n21 = JTBToolkit.makeNodeToken(n22); }
            { n18 = new NodeChoice(n21, 1); }
         |
            n24=<HOOK> { n23 = JTBToolkit.makeNodeToken(n24); }
            { n18 = new NodeChoice(n23, 2); }
         )
         { n17.addNode(n18); }
      )?
      { n11.addNode(n17); }
      { n0 = new NodeChoice(n11, 3); }
   )
 
   { return new ComplexRegularExpressionUnit(n0); }
}

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

   {
   }
}
{
   (
      n2=<TILDE> { n1 = JTBToolkit.makeNodeToken(n2); }
      { n0.addNode(n1); }
   )?
   n4=<LBRACKET> { n3 = JTBToolkit.makeNodeToken(n4); }
   (
      { n8 = new NodeListOptional(); }
      { n6 = new NodeSequence(2); }
      n7=CharacterDescriptor()
      { n6.addNode(n7); }
      (
         { n9 = new NodeSequence(2); }
         n11=<COMMA> { n10 = JTBToolkit.makeNodeToken(n11); }
         { n9.addNode(n10); }
         n12=CharacterDescriptor()
         { n9.addNode(n12); }
         { n8.addNode(n9); }
      )*
      { n8.nodes.trimToSize(); }
      { n6.addNode(n8); }
      { n5.addNode(n6); }
   )?
   n14=<RBRACKET> { n13 = JTBToolkit.makeNodeToken(n14); }
 
   { return new CharacterList(n0,n3,n5,n13); }
}

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

   {
   }
}
{
   n1=<STRING_LITERAL> { n0 = JTBToolkit.makeNodeToken(n1); }
   (
      { n3 = new NodeSequence(2); }
      n5=<MINUS> { n4 = JTBToolkit.makeNodeToken(n5); }
      { n3.addNode(n4); }
      n7=<STRING_LITERAL> { n6 = JTBToolkit.makeNodeToken(n7); }
      { n3.addNode(n6); }
      { n2.addNode(n3); }
   )?
 
   { return new CharacterDescriptor(n0,n2); }
}

-------------------------------------------------------------------------------------------

测试

package com.xxx.toolkit.java.parser;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import com.xxx.toolkit.java.parser.syntaxtree.Node;
import com.xxx.toolkit.java.parser.visitor.TreeDumper;

public class ParserTest {


 public static void testString(String s)throws Exception{
  ByteArrayInputStream is=new ByteArrayInputStream(s.getBytes()); 
  doParse(is);
 }
 
 public static void testJavaFile(String fileName)throws Exception{
  FileInputStream is=new FileInputStream(fileName);
  doParse(is);
 }
 
 
 private static void doParse(InputStream is)throws Exception{
  try {
   JTBParser jp = new JTBParser(is);//(is,"GBK")
   Node root=jp.parse();
   //System.out.println(node);
   root.accept(new TreeDumper());
   System.out.println("注释:/n"+jp.getCommentList());
  
   //JavaFile jf = jp.parse();
   //System.out.println(jf.toString());
  
  } catch (Error e) {
   e.printStackTrace();
  }
 }
 
 
 
 
 public static void main(String[] args) {
  try {
   System.out.println("测试分析java文件...");
   testJavaFile("W://workspace//my_range//src//com//xxx//toolkit//java2//TestClass.java");
//   String s=null;  
//   s="package com.xxx ;";
//   s="com.xxx";
//   testString(s);
//   s="abc.cc";
//   testPackageName(s);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}