BNF for jADT.jj

TOKENS

// ********************************* TOKENS **********************************
/**
 * Punctuation used by jADT
 */
<DEFAULT> TOKEN : {
<LANGLE: "<">
| <RANGLE: ">">
| <EQUALS: "=">
| <LPAREN: "(">
| <RPAREN: ")">
| <COMMA: ",">
| <BAR: "|">
| <LBRACKET: "[">
| <RBRACKET: "]">
| <DOT: ".">
| <SPLAT: "*">
}

   
/**
 * jADT keywords
 */
<DEFAULT> TOKEN : {
<IMPORT: "import">
| <PACKAGE: "package">
| <FINAL: "final">
}

   
/**
 * Java primitive types
 */
<DEFAULT> TOKEN : {
<BOOLEAN: "boolean">
| <BYTE: "byte">
| <CHAR: "char">
| <SHORT: "short">
| <INT: "int">
| <LONG: "long">
| <FLOAT: "float">
| <DOUBLE: "double">
}

   
/**
 * Most Java keywords are unused but reserved so they can't be used in an jADT definition and thus screw up the generated Java
 */
<DEFAULT> TOKEN : {
<JAVA_KEYWORD: "abstract" | "assert" | "break" | "case" | "catch" | "class" | "const" | "continue" | "default" | "do" | "else" | "enum" | "extends" | "finally" | "for" | "goto" | "if" | "implements" | "instanceof" | "interface" | "native" | "new" | "private" | "protected" | "public" | "return" | "static" | "strictfp" | "super" | "switch" | "synchronized" | "this" | "throw" | "throws" | "transient" | "try" | "void" | "volatile" | "while">
}

   
/**
 * An identifier is any valid Java identifier.  It must start with a unicode 'letter', '$' or '_' and be followed
 * by arbitrarily many unicode 'letters', unicode 'digits', '$', or '_'
 */
<DEFAULT> TOKEN : {
<IDENTIFIER: <IDENTIFIER_START> (<IDENTIFIER_START> | <IDENTIFIER_PART>)*>
| <#IDENTIFIER_START: ["$","A"-"Z","_","a"-"z","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u0236","\u0250"-"\u02c1","\u02c6"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03f5","\u03f7"-"\u03fb","\u0400"-"\u0481","\u048a"-"\u04ce","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0500"-"\u050f","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u064a","\u066e"-"\u066f","\u0671"-"\u06d3","\u06d5","\u06e5"-"\u06e6","\u06ee"-"\u06ef","\u06fa"-"\u06fc","\u06ff","\u0710","\u0712"-"\u072f","\u074d"-"\u074f","\u0780"-"\u07a5","\u07b1","\u0904"-"\u0939","\u093d","\u0950","\u0958"-"\u0961","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09bd","\u09dc"-"\u09dd","\u09df"-"\u09e1","\u09f0"-"\u09f3","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a59"-"\u0a5c","\u0a5e","\u0a72"-"\u0a74","\u0a85"-"\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abd","\u0ad0","\u0ae0"-"\u0ae1","\u0af1","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b35"-"\u0b39","\u0b3d","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b71","\u0b83","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0bf9","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c60"-"\u0c61","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cbd","\u0cde","\u0ce0"-"\u0ce1","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d60"-"\u0d61","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0e01"-"\u0e30","\u0e32"-"\u0e33","\u0e3f"-"\u0e46","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb0","\u0eb2"-"\u0eb3","\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0edc"-"\u0edd","\u0f00","\u0f40"-"\u0f47","\u0f49"-"\u0f6a","\u0f88"-"\u0f8b","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u1050"-"\u1055","\u10a0"-"\u10c5","\u10d0"-"\u10f8","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u16ee"-"\u16f0","\u1700"-"\u170c","\u170e"-"\u1711","\u1720"-"\u1731","\u1740"-"\u1751","\u1760"-"\u176c","\u176e"-"\u1770","\u1780"-"\u17b3","\u17d7","\u17db"-"\u17dc","\u1820"-"\u1877","\u1880"-"\u18a8","\u1900"-"\u191c","\u1950"-"\u196d","\u1970"-"\u1974","\u1d00"-"\u1d6b","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u203f"-"\u2040","\u2054","\u2071","\u207f","\u20a0"-"\u20b1","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u213d"-"\u213f","\u2145"-"\u2149","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u3029","\u3031"-"\u3035","\u3038"-"\u303c","\u3041"-"\u3096","\u309d"-"\u309f","\u30a1"-"\u30ff","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u31f0"-"\u31ff","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufa30"-"\ufa6a","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d","\ufb1f"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfc","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe74","\ufe76"-"\ufefc","\uff04","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6"]>
| <#IDENTIFIER_PART: ["\u0000"-"\b","\u000e"-"\u001b","0"-"9","\u007f"-"\u009f","\u00ad","\u0300"-"\u0357","\u035d"-"\u036f","\u0483"-"\u0486","\u0591"-"\u05a1","\u05a3"-"\u05b9","\u05bb"-"\u05bd","\u05bf","\u05c1"-"\u05c2","\u05c4","\u0600"-"\u0603","\u0610"-"\u0615","\u064b"-"\u0658","\u0660"-"\u0669","\u0670","\u06d6"-"\u06dd","\u06df"-"\u06e4","\u06e7"-"\u06e8","\u06ea"-"\u06ed","\u06f0"-"\u06f9","\u070f","\u0711","\u0730"-"\u074a","\u07a6"-"\u07b0","\u0901"-"\u0903","\u093c","\u093e"-"\u094d","\u0951"-"\u0954","\u0962"-"\u0963","\u0966"-"\u096f","\u0981"-"\u0983","\u09bc","\u09be"-"\u09c4","\u09c7"-"\u09c8","\u09cb"-"\u09cd","\u09d7","\u09e2"-"\u09e3","\u09e6"-"\u09ef","\u0a01"-"\u0a03","\u0a3c","\u0a3e"-"\u0a42","\u0a47"-"\u0a48","\u0a4b"-"\u0a4d","\u0a66"-"\u0a71","\u0a81"-"\u0a83","\u0abc","\u0abe"-"\u0ac5","\u0ac7"-"\u0ac9","\u0acb"-"\u0acd","\u0ae2"-"\u0ae3","\u0ae6"-"\u0aef","\u0b01"-"\u0b03","\u0b3c","\u0b3e"-"\u0b43","\u0b47"-"\u0b48","\u0b4b"-"\u0b4d","\u0b56"-"\u0b57","\u0b66"-"\u0b6f","\u0b82","\u0bbe"-"\u0bc2","\u0bc6"-"\u0bc8","\u0bca"-"\u0bcd","\u0bd7","\u0be7"-"\u0bef","\u0c01"-"\u0c03","\u0c3e"-"\u0c44","\u0c46"-"\u0c48","\u0c4a"-"\u0c4d","\u0c55"-"\u0c56","\u0c66"-"\u0c6f","\u0c82"-"\u0c83","\u0cbc","\u0cbe"-"\u0cc4","\u0cc6"-"\u0cc8","\u0cca"-"\u0ccd","\u0cd5"-"\u0cd6","\u0ce6"-"\u0cef","\u0d02"-"\u0d03","\u0d3e"-"\u0d43","\u0d46"-"\u0d48","\u0d4a"-"\u0d4d","\u0d57","\u0d66"-"\u0d6f","\u0d82"-"\u0d83","\u0dca","\u0dcf"-"\u0dd4","\u0dd6","\u0dd8"-"\u0ddf","\u0df2"-"\u0df3","\u0e31","\u0e34"-"\u0e3a","\u0e47"-"\u0e4e","\u0e50"-"\u0e59","\u0eb1","\u0eb4"-"\u0eb9","\u0ebb"-"\u0ebc","\u0ec8"-"\u0ecd","\u0ed0"-"\u0ed9","\u0f18"-"\u0f19","\u0f20"-"\u0f29","\u0f35","\u0f37","\u0f39","\u0f3e"-"\u0f3f","\u0f71"-"\u0f84","\u0f86"-"\u0f87","\u0f90"-"\u0f97","\u0f99"-"\u0fbc","\u0fc6","\u102c"-"\u1032","\u1036"-"\u1039","\u1040"-"\u1049","\u1056"-"\u1059","\u1369"-"\u1371","\u1712"-"\u1714","\u1732"-"\u1734","\u1752"-"\u1753","\u1772"-"\u1773","\u17b4"-"\u17d3","\u17dd","\u17e0"-"\u17e9","\u180b"-"\u180d","\u1810"-"\u1819","\u18a9","\u1920"-"\u192b","\u1930"-"\u193b","\u1946"-"\u194f","\u200c"-"\u200f","\u202a"-"\u202e","\u2060"-"\u2063","\u206a"-"\u206f","\u20d0"-"\u20dc","\u20e1","\u20e5"-"\u20ea","\u302a"-"\u302f","\u3099"-"\u309a","\ufb1e","\ufe00"-"\ufe0f","\ufe20"-"\ufe23","\ufeff","\uff10"-"\uff19","\ufff9"-"\ufffb"]>
}

   
<DEFAULT> SPECIAL : {
<JAVADOC_COMMENT: "/**" ("*")* ~["*","/"] <COMMENT_REST>>
| <JAVA_ML_COMMENT: "/*" <COMMENT_REST>>
| <#COMMENT_REST: (~["*"] | ("*")+ ~["*","/"])* ("*")+ "/">
| <JAVA_EOL_COMMENT: "//" (~["\n","\r"])*>
}

   
<DEFAULT> TOKEN : {
<UNTERMINATED_COMMENT: "/*" (~["*"] | ("*")+ ~["*","/"])*>
}

   
/**
 * Whitespace is the space character, tab, newline, carriage return, and formfeed.  It is completely ignored except to separate tokens
 */
<DEFAULT> SKIP : {
<WS: " " | "\t" | "\n" | "\r" | "\f">
| <INTERNAL_EOL_COMMENT: "#" (~["\n","\r"])* ("\n" | "\r" | "\r\n")?>
}

   
/**
 * The unknown token type is a catch all used as an aid in error recovery
 */
<DEFAULT> TOKEN : {
<UNKNOWN: ("/" ~["*","<",">","[","]","(",")","=",".","|",","," ","\n","\r","\f","\t","#","/"] | ~["<",">","[","]","(",")","=",".","|",","," ","\n","\r","\f","\t","#","/","*"])* | "/">
}

   

NON-TERMINALS

/**
 * A jADT document has an optional package followed by imports and datatypes and ends with an end of file.
 */
doc ::= ( pkg )? imports dataTypes eof
/**
 * The package declaration (if it exists) is the keyword "package" followed by a package name.  No semicolon required.
 */
pkg ::= packageKeyword packageName
/**
 * A package name used in a package declaration must be a valid Java package name.
 */
packageName ::= dottedIdentifier
/**
 *     A jADT document may specify any number (including 0) of package names to import.
 */
imports ::= ( singleImport )*
/**
 * Each import is the keyword "import" followed by a package spec.
 */
singleImport ::= importKeyword packageSpec
/**
 * A package spec used in an import.  A '*' or it's an identifier optionally followed by '.' and a
 * package spec
 */
packageSpec ::= splat
| identifier ( dot packageSpec )?
/**
 *     A jADT document must have at least one datatype, but may have as many as you'd like.
*/
dataTypes ::= ( dataType )+
/**
 * Each datatype consists of a name, optional type arguments, "=" and a list of constructors.
 */
dataType ::= dataTypeName ( typeArguments )? equals constructors
/**
 * A data type name is any valid Java identifier not qualified with a package.
 */
dataTypeName ::= commentedIdentifier
/**
 * A data type's type arguments, if it has them, start with '<', have 1 or more arguments, and end with '>'.
 */
typeArguments ::= langle typeArgument ( comma typeArgument )* rangle
/**
 * A single type argument is any valid Java identifier, not qualified with a package.
 */
typeArgument ::= identifier
/**
 * A data type must have 1 or more case constructors separated by '|'.
 */
constructors ::= constructor ( bar constructor )*
/**
 * A case constructor is a name optionally followed by arguments.  If it has no arguments then it must not be followed by '()'.
 */
constructor ::= constructorName ( args )?
/**
 * A case constructor name is any valid Java identifier not qualified by a package.
 */
constructorName ::= commentedIdentifier
/**
 * If a case constructor arguments then they must start with '(', have 1 ore more arguments separated by ',' and end with ')'.
 */
args ::= lparen arg ( comma arg )* rparen
/**
 * A case constructor argument is a list of modifiers, a type, and then a name.
 */
arg ::= argModifiers type argName
/**
 * A case constructor argument may have 0 or more modifiers separated by spaces.
 */
argModifiers ::= ( argModifier )*
/**
 * Currently the only argument modifier allowed is 'final' but others will follow.
 */
argModifier ::= finalKeyword
/**
 * An argument name is any valid Java identifier not qualified by a package
 */
argName ::= identifier
/**
 * A type is either a class type or a primitive type wrapped in 0 or more levels of array
 */
type ::= ( classType | primitiveType ) ( arrayTypeBrackets )*
/**
 * A refType is either a primitive type wrapped in one level or array or a class type and in either case
 * may be wrapped in 0 or more additional levels of array
 */
refType ::= ( classType | ( primitiveType lbracket rbracket ) ) ( arrayTypeBrackets )*
/**
 * The pair '[]' modifies a previously mentioned type X to make it type X[]
 */
arrayTypeBrackets ::= lbracket rbracket
/**
 * A class type is a class name followed by actual type arguments
 */
classType ::= className ( actualTypeArguments )?
/**
 * A class name is a valid Java class name that may be qualified by a package.
 */
className ::= dottedIdentifier
/**
 * If a type has type arguments then it will be '<' followed by 1 or more refTypes followed by '>'.
 */
actualTypeArguments ::= langle refType ( comma refType )* rangle
/**
 * A primitive type is any of the standard Java primitive types
 */
primitiveType ::= ( booleanType | byteType | charType | shortType | intType | longType | floatType | doubleType )
/**
 * A dotted identifier is a series of 1 or more identifiers separated by '.'.
 */
dottedIdentifier ::= identifier ( dot identifier )*
/**
 * A commented identifier may be any valid Java identifier
 * and may be preceded by java comments
 */
commentedIdentifier ::= <IDENTIFIER>
/**
 * An identifier may be any valid Java identifier
 */
identifier ::= <IDENTIFIER>
/**
 * 'import'
 * may be preceded by java comments
 */
importKeyword ::= <IMPORT>
/**
 * 'package'
 * may be preceded by java comments
 */
packageKeyword ::= <PACKAGE>
/**
 * 'final'
 */
finalKeyword ::= <FINAL>
/**
 * 'boolean'
 */
booleanType ::= <BOOLEAN>
/**
 * 'byte'
 */
byteType ::= <BYTE>
/**
 * 'char'
 */
charType ::= <CHAR>
/**
 * 'short'
 */
shortType ::= <SHORT>
/**
 * 'int'
 */
intType ::= <INT>
/**
 * 'long'
 */
longType ::= <LONG>
/**
 * 'float'
 */
floatType ::= <FLOAT>
/**
 * 'double'
 */
doubleType ::= <DOUBLE>
/**
 * '.'
 */
dot ::= <DOT>
/**
 * ','
 */
comma ::= <COMMA>
/**
 * '('
 */
lparen ::= <LPAREN>
/**
 * ')'
 */
rparen ::= <RPAREN>
/**
 * '['
 */
lbracket ::= <LBRACKET>
/**
 * ']'
 */
rbracket ::= <RBRACKET>
/**
 * '<'
 */
langle ::= <LANGLE>
/**
 * '>'
 */
rangle ::= <RANGLE>
/**
 * '='
 * may be preceded by Java comments
 */
equals ::= <EQUALS>
/**
 * '|'
 * may be preceded by Java comments
 */
bar ::= <BAR>
/**
 * asterisk
 */
splat ::= <SPLAT>
/**
 * end of file
 */
eof ::= <EOF>