diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5acfc99792..71f7180b1a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,10 +20,12 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Install Dotnet - uses: actions/setup-dotnet@v4.2.0 - with: - dotnet-version: '8.0.x' + - name: Test Dotnet + run: | + dotnet --version + dotnet --info + dotnet --list-runtimes + dotnet --list-sdks - name: Install Trash shell: bash run: | @@ -70,10 +72,6 @@ jobs: run: | echo ${{ steps.setup-php.outputs.php-version }} php --version - - name: Install Dotnet - uses: actions/setup-dotnet@v4.2.0 - with: - dotnet-version: '8.0.x' - name: Test Dotnet run: | dotnet --version @@ -188,10 +186,6 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Install Dotnet - uses: actions/setup-dotnet@v4.2.0 - with: - dotnet-version: '8.0.x' - name: Test Dotnet run: | dotnet --version diff --git a/javacc/Javacc.g4 b/javacc/Javacc.g4 new file mode 100644 index 0000000000..ecd5605f6f --- /dev/null +++ b/javacc/Javacc.g4 @@ -0,0 +1,596 @@ +grammar Javacc; + +LOOKAHEAD: 'LOOKAHEAD'; +IGNORE_CASE: 'IGNORE_CASE'; +PARSER_BEGIN: 'PARSER_BEGIN'; +PARSER_END: 'PARSER_END'; +JAVACODE: 'JAVACODE'; +CPPCODE: 'CPPCODE'; +TOKEN: 'TOKEN'; +SPECIAL_TOKEN: 'SPECIAL_TOKEN'; +MORE_: 'MORE'; +SKIP_: 'SKIP'; +TOKEN_MGR_DECLS: 'TOKEN_MGR_DECLS'; +EOF_: 'EOF'; +DCL_PARSER_BEGIN: 'DCL_PARSER_BEGIN'; +DCL_PARSER_END: 'DCL_PARSER_END'; +INC_PARSER_BEGIN: 'INC_PARSER_BEGIN'; +INC_PARSER_END: 'INC_PARSER_END'; +DEF_PARSER_BEGIN: 'DEF_PARSER_BEGIN'; +DEF_PARSER_END: 'DEF_PARSER_END'; + + +/* WHITE SPACE */ +WS : (' ' +| '\t' +| '\n' +| '\r' +| '\f' +| '/*@egen*/') -> channel(HIDDEN) +; + +/* COMMENTS */ +COMMENT: '/*' .*? '*/' -> channel(HIDDEN); +LINE_COMMENT: '//' ~[\r\n]* -> channel(HIDDEN); + +ABSTRACT: 'abstract'; +ASSERT: 'assert'; +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'; +ENUM: 'enum'; +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'; +STRICTFP: 'strictfp'; +SUPER: 'super'; +SWITCH: 'switch'; +SYNCHRONIZED: 'synchronized'; +THIS: 'this'; +THROW: 'throw'; +THROWS: 'throws'; +TRANSIENT: 'transient'; +TRUE: 'true'; +TRY: 'try'; +VOID: 'void'; +VOLATILE: 'volatile'; +WHILE: 'while'; +TEMPLATE: 'template'; +TYPENAME: 'typename'; + +INTEGER_LITERAL: DECIMAL_LITERAL [lL]? | HEX_LITERAL [lL]? | OCTAL_LITERAL [lL]? | BINARY_LITERAL [lL]?; + +DECIMAL_LITERAL: [1-9] (('_')* [0-9])*; + +HEX_LITERAL: '0' [xX] [0-9a-fA-F] (('_')* [0-9a-fA-F])*; + +OCTAL_LITERAL: '0' (('_')* [0-7])*; + +BINARY_LITERAL: '0' [bB] [01] (('_')* [01])*; + +FLOATING_POINT_LITERAL: DECIMAL_FLOATING_POINT_LITERAL | HEXADECIMAL_FLOATING_POINT_LITERAL ; + +DECIMAL_FLOATING_POINT_LITERAL: [0-9] (('_')* [0-9])* '.' ([0-9] (('_')* [0-9])*)? DECIMAL_EXPONENT? ([fFdD])? | '.' [0-9] (('_')* [0-9])* DECIMAL_EXPONENT? ([fFdD])? | [0-9] (('_')* [0-9])* DECIMAL_EXPONENT ([fFdD])? | [0-9] (('_')* [0-9])* DECIMAL_EXPONENT? [fFdD]; + +DECIMAL_EXPONENT: [eE] ([+-])? [0-9] (('_')* [0-9])*; + +HEXADECIMAL_FLOATING_POINT_LITERAL: '0' [xX] [0-9a-fA-F] (('_')* [0-9a-fA-F])* ('.')? HEXADECIMAL_EXPONENT ([fFdD])? | '0' [xX] ([0-9a-fA-F] (('_')* [0-9a-fA-F])*)? '.' [0-9a-fA-F] (('_')* [0-9a-fA-F])* HEXADECIMAL_EXPONENT ([fFdD])?; + +HEXADECIMAL_EXPONENT: [pP] ([+-])? [0-9] (('_')* [0-9])*; + +CHARACTER_LITERAL: '\'' (~['\\\n\r] | '\\' ([ntbrf\\'"] | [0-7] [0-7]? | [0-3] [0-7] [0-7])) '\''; + +STRING_LITERAL: '"' + ( + ~["\\\n\r] + | '\\' + ( + [ntbrf\\'"] + | 'u' [0-9a-fA-F] [0-9a-fA-F]? [0-9a-fA-F]? [0-9a-fA-F]? + | [0-7] + | [0-3][0-7][0-7] + ) + )* '"'; + +/* SEPARATORS */ +LPAREN: '('; +RPAREN: ')'; +LBRACE: '{'; +RBRACE: '}'; +LBRACKET: '['; +RBRACKET: ']'; +SEMICOLON: ';'; +COMMA: ','; +DOT: '.'; + + +ASSIGN: '='; +LT: '<'; +BANG: '!'; +TILDE: '~'; +HOOK: '?'; +COLON: ':'; +DOUBLECOLON: '::'; +EQ: '=='; +LE: '<='; +GE: '>='; +NE: '!='; +SC_OR: '||'; +SC_AND: '&&'; +INCR: '++'; +DECR: '--'; +PLUS: '+'; +MINUS: '-'; +STAR: '*'; +SLASH: '/'; +BIT_AND: '&'; +BIT_OR: '|'; +XOR: '^'; +REM: '%'; +PLUSASSIGN: '+='; +MINUSASSIGN: '-='; +STARASSIGN: '*='; +SLASHASSIGN: '/='; +ANDASSIGN: '&='; +ORASSIGN: '|='; +XORASSIGN: '^='; +REMASSIGN: '%='; + +//RUNSIGNEDSHIFT: '>>>'; +runsignedshift : GT GT GT; +//RSIGNEDSHIFT: '>>'; +rsignedshift: GT GT; +GT: '>'; + +IDENTIFIER: LETTER PART_LETTER*; + +LETTER: [$A-Z_a-z\u00a2-\u00a5\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u021f\u0222-\u0233\u0250-\u02ad\u02b0-\u02b8\u02bb-\u02c1\u02d0-\u02d1\u02e0-\u02e4\u02ee\u037a\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03ce\u03d0-\u03d7\u03da-\u03f3\u0400-\u0481\u048c-\u04c4\u04c7-\u04c8\u04cb-\u04cc\u04d0-\u04f5\u04f8-\u04f9\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0621-\u063a\u0640-\u064a\u0671-\u06d3\u06d5\u06e5-\u06e6\u06fa-\u06fc\u0710\u0712-\u072c\u0780-\u07a5\u0905-\u0939\u093d\u0950\u0958-\u0961\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\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-\u0a8b\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b36-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb5\u0bb7-\u0bb9\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c60-\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\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-\u10f6\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\u1780-\u17b3\u17db\u1820-\u1877\u1880-\u18a8\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\u207f\u20a0-\u20af\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2131\u2133-\u2139\u2160-\u2183\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303a\u3041-\u3094\u309d-\u309e\u30a1-\u30fe\u3105-\u312c\u3131-\u318e\u31a0-\u31b7\u3400-\u4db5\u4e00-\u9fa5\ua000-\ua48c\uac00-\ud7a3\uf900-\ufa2d\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-\ufdfb\ufe33-\ufe34\ufe4d-\ufe4f\ufe69\ufe70-\ufe72\ufe74\ufe76-\ufefc\uff04\uff21-\uff3a\uff3f\uff41-\uff5a\uff65-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\uffe0-\uffe1\uffe5-\uffe6] ; + +PART_LETTER: [\u0000-\b\u000e-\u001b$0-9A-Z_a-z\u007f-\u009f\u00a2-\u00a5\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u021f\u0222-\u0233\u0250-\u02ad\u02b0-\u02b8\u02bb-\u02c1\u02d0-\u02d1\u02e0-\u02e4\u02ee\u0300-\u034e\u0360-\u0362\u037a\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03ce\u03d0-\u03d7\u03da-\u03f3\u0400-\u0481\u0483-\u0486\u048c-\u04c4\u04c7-\u04c8\u04cb-\u04cc\u04d0-\u04f5\u04f8-\u04f9\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05a1\u05a3-\u05b9\u05bb-\u05bd\u05bf\u05c1-\u05c2\u05c4\u05d0-\u05ea\u05f0-\u05f2\u0621-\u063a\u0640-\u0655\u0660-\u0669\u0670-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06ed\u06f0-\u06fc\u070f-\u072c\u0730-\u074a\u0780-\u07b0\u0901-\u0903\u0905-\u0939\u093c-\u094d\u0950-\u0954\u0958-\u0963\u0966-\u096f\u0981-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc\u09be-\u09c4\u09c7-\u09c8\u09cb-\u09cd\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f3\u0a02\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a59-\u0a5c\u0a5e\u0a66-\u0a74\u0a81-\u0a83\u0a85-\u0a8b\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b36-\u0b39\u0b3c-\u0b43\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b61\u0b66-\u0b6f\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb5\u0bb7-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be7-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c60-\u0c61\u0c66-\u0c6f\u0c82-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce1\u0ce6-\u0cef\u0d02-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d28\u0d2a-\u0d39\u0d3e-\u0d43\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d60-\u0d61\u0d66-\u0d6f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2-\u0df3\u0e01-\u0e3a\u0e3f-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edd\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6a\u0f71-\u0f84\u0f86-\u0f8b\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1021\u1023-\u1027\u1029-\u102a\u102c-\u1032\u1036-\u1039\u1040-\u1049\u1050-\u1059\u10a0-\u10c5\u10d0-\u10f6\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\u1369-\u1371\u13a0-\u13f4\u1401-\u166c\u166f-\u1676\u1681-\u169a\u16a0-\u16ea\u1780-\u17d3\u17db\u17e0-\u17e9\u180b-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18a9\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\u200c-\u200f\u202a-\u202e\u203f-\u2040\u206a-\u206f\u207f\u20a0-\u20af\u20d0-\u20dc\u20e1\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2131\u2133-\u2139\u2160-\u2183\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303a\u3041-\u3094\u3099-\u309a\u309d-\u309e\u30a1-\u30fe\u3105-\u312c\u3131-\u318e\u31a0-\u31b7\u3400-\u4db5\u4e00-\u9fa5\ua000-\ua48c\uac00-\ud7a3\uf900-\ufa2d\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe20-\ufe23\ufe33-\ufe34\ufe4d-\ufe4f\ufe69\ufe70-\ufe72\ufe74\ufe76-\ufefc\ufeff\uff04\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff65-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\uffe0-\uffe1\uffe5-\uffe6\ufff9-\ufffb] ; + +javacc_input : javacc_options 'PARSER_BEGIN' '(' identifier ')' compilationUnit 'PARSER_END' '(' identifier ')' production+ EOF; + +javacc_options : ( IDENTIFIER '{' option_binding* '}' )? ; + +option_binding : ( IDENTIFIER | 'LOOKAHEAD' | 'IGNORE_CASE' | 'static' | 'PARSER_BEGIN' ) '=' ( integerLiteral | booleanLiteral | stringLiteral | stringList ) ';' ; + +stringList : '(' stringLiteral ( ',' stringLiteral )* ')' ; + +production : javacode_production + | cppcode_production + | regular_expr_production + | token_manager_decls + | bnf_production + ; + +javacode_production : 'JAVACODE' resultType identifier formalParameters ( 'throws' name ( ',' name )* )? node_descriptor? block ; + +cppcode_production : 'CPPCODE' accessModifier resultType identifier formalParameters ( 'throws' name ( ',' name )* )? block ; + +bnf_production : resultType identifier formalParameters ( 'throws' name ( ',' name )* )? node_descriptor? ':' block '{' expansion_choices '}' ; + +accessModifier : ( 'public' | 'protected' | 'private' )? ; + +regular_expr_production : ( '<' '*' '>' | '<' IDENTIFIER ( ',' IDENTIFIER )* '>' )? regexpr_kind ( '[' 'IGNORE_CASE' ']' )? ':' '{' regexpr_spec ( '|' regexpr_spec )* '}' ; + +token_manager_decls : 'TOKEN_MGR_DECLS' ':' ( classOrInterfaceBody )? ; + +regexpr_kind : 'TOKEN' +| 'SPECIAL_TOKEN' +| 'SKIP' +| 'MORE' +; + +regexpr_spec : regular_expression ( block )? ( ':' IDENTIFIER )? ; + +expansion_choices : expansion ( '|' expansion )* ; + +expansion : ( 'LOOKAHEAD' '(' local_lookahead ')' )? ( expansion_unit node_descriptor? )+ ; + +local_lookahead : ( integerLiteral )? ( ',' )? ( expansion_choices )? ( ',' )? ( '{' ( expression )? '}' )? ; + +expansion_unit : 'LOOKAHEAD' '(' local_lookahead ')' +| block +| '[' expansion_choices ']' +| 'try' '{' expansion_choices '}' ( 'catch' '(' ( name IDENTIFIER )? ')' block )* ( 'finally' block )? +| ( primaryExpression '=' )? ( identifier ( typeArguments )? arguments | regular_expression ( '.' IDENTIFIER )? ) +| '(' expansion_choices ')' ( '+' | '*' | '?' )? +; + +regular_expression : stringLiteral +| LT ( ( '#' )? identifier ':' )? complex_regular_expression_choices GT +| '<' identifier '>' +| '<' 'EOF' '>' +; + +complex_regular_expression_choices : complex_regular_expression ( '|' complex_regular_expression )* ; + +complex_regular_expression : ( complex_regular_expression_unit )+ ; + +complex_regular_expression_unit : stringLiteral +| '<' identifier '>' +| character_list +| '(' complex_regular_expression_choices ')' ( '+' | '*' | '?' | '{' integerLiteral ( ',' ( integerLiteral )? )? '}' )? +; + +character_list : ( '~' )? '[' ( character_descriptor ( ',' character_descriptor )* )? ']' ; + +character_descriptor : stringLiteral ( '-' stringLiteral )? ; + +identifier : IDENTIFIER ; + +node_descriptor : '#' ( IDENTIFIER | VOID ) + ( '(' '>'? node_descriptor_expression ')' )? + ; + +node_descriptor_expression + : (~'(')* + | '(' node_descriptor_expression ')' + ; + +javaIdentifier : ( IDENTIFIER | 'LOOKAHEAD' | 'IGNORE_CASE' | 'PARSER_BEGIN' | 'PARSER_END' | 'JAVACODE' | 'TOKEN' | 'SPECIAL_TOKEN' | 'MORE' | 'SKIP' | 'TOKEN_MGR_DECLS' | 'EOF' | 'template' | 'DCL_PARSER_BEGIN' | 'DCL_PARSER_END' | 'INC_PARSER_BEGIN' | 'INC_PARSER_END' | 'DEF_PARSER_BEGIN' | 'DEF_PARSER_END' ) +; + +compilationUnit : ( packageDeclaration )? ( importDeclaration )* ( typeDeclaration )* ; + +packageDeclaration : modifiers 'package' name ';' ; + +importDeclaration : 'import' ( 'static' )? name ( '.' '*' )? ';' ; + +modifiers : ( ( 'public' | 'static' | 'protected' | 'private' | 'final' | 'abstract' | 'synchronized' | 'native' | 'transient' | 'volatile' | 'strictfp' | annotation ) )* ; + +typeDeclaration : ';' +| modifiers ( classOrInterfaceDeclaration | enumDeclaration | annotationTypeDeclaration ) +; + +classOrInterfaceDeclaration : ( 'class' | 'interface' ) javaIdentifier typeParameters? extendsList? implementsList? classOrInterfaceBody ; + +extendsList : 'extends' classOrInterfaceType ( ',' classOrInterfaceType )* ; + +implementsList : 'implements' classOrInterfaceType ( ',' classOrInterfaceType )* ; + +enumDeclaration : 'enum' javaIdentifier ( implementsList )? enumBody ; + +enumBody : '{' ( enumConstant ( ',' enumConstant )* )? ( ',' )? ( ';' ( classOrInterfaceBodyDeclaration )* )? '}' ; + +enumConstant : modifiers javaIdentifier arguments? classOrInterfaceBody? ; + +typeParameters : '<' typeParameter ( ',' typeParameter )* '>' ; + +typeParameter : javaIdentifier typeBound? ; + +typeBound : 'extends' classOrInterfaceType ( '&' classOrInterfaceType )* ; + +classOrInterfaceBody : '{' classOrInterfaceBodyDeclaration* '}' ; + +classOrInterfaceBodyDeclaration : initializer +| modifiers ( classOrInterfaceDeclaration | enumDeclaration | constructorDeclaration | fieldDeclaration | methodDeclaration ) +| ';' +; + +fieldDeclaration : type variableDeclarator ( ',' variableDeclarator )* ';' ; + +variableDeclarator : variableDeclaratorId ( '=' variableInitializer )? ; + +variableDeclaratorId : javaIdentifier ( '[' ']' )* ; + +variableInitializer : arrayInitializer +| expression +; + +arrayInitializer : '{' ( variableInitializer ( ',' variableInitializer )* )? ( ',' )? '}' ; + +methodDeclaration : typeParameters? resultType methodDeclarator ( 'throws' nameList )? ( block | ';' ) ; + +methodDeclarator : javaIdentifier formalParameters ( '[' ']' )* ; + +formalParameters : '(' ( formalParameter ( ',' formalParameter )* )? ')' ; + +formalParameter : modifiers type ( ( '&' | '*' ) | '...' )? variableDeclaratorId ; + +constructorDeclaration : typeParameters? javaIdentifier formalParameters ( 'throws' nameList )? '{' explicitConstructorInvocation? blockStatement* '}' ; + +explicitConstructorInvocation : 'this' arguments ';' +| ( primaryExpression '.' )? 'super' arguments ';' +; + +initializer : ( 'static' )? block ; + +type : referenceType +| primitiveType +; + +referenceType : primitiveType ( '[' ']' )+ +| ( template? classOrInterfaceType ) ( '[' ']' )* +; + +template : 'template' '<' templateBase ( ',' templateBase )* '>' ; + +templateBase : templatePack '...'? IDENTIFIER ; + +templatePack : 'class' | 'typename' ; + +classOrInterfaceType : ( '::' )? IDENTIFIER typeArguments? ( ( '.' | '::' ) IDENTIFIER typeArguments? )* ; + +typeArguments : '<' ( typeArgument ( ',' typeArgument ( '...' )? )* )? '>' ; + +typeArgument : referenceType +| '?' wildcardBounds? +; + +wildcardBounds : 'extends' referenceType +| 'super' referenceType +; + +primitiveType : 'boolean' +| 'char' +| 'byte' +| 'short' +| 'int' +| 'long' +| 'float' +| 'double' +; + +resultType : ( 'void' ( '*' )? | ( 'const' )? type ( '*' | '&' )? ) ; + +name : javaIdentifier ( '.' javaIdentifier )* ; + +nameList : name ( ',' name )* ; + +expression : conditionalExpression ( assignmentOperator expression )? ; + +assignmentOperator : '=' +| '*=' +| '/=' +| '%=' +| '+=' +| '-=' +| '<<=' +| '>>=' +| '>>>=' +| '&=' +| '^=' +| '|=' +; + +conditionalExpression : conditionalOrExpression ( '?' expression ':' expression )? ; + +conditionalOrExpression : conditionalAndExpression ( '||' conditionalAndExpression )* ; + +conditionalAndExpression : inclusiveOrExpression ( '&&' inclusiveOrExpression )* ; + +inclusiveOrExpression : exclusiveOrExpression ( '|' exclusiveOrExpression )* ; + +exclusiveOrExpression : andExpression ( '^' andExpression )* ; + +andExpression : equalityExpression ( '&' equalityExpression )* ; + +equalityExpression : instanceOfExpression ( ( '==' | '!=' ) instanceOfExpression )* ; + +instanceOfExpression : relationalExpression ( 'instanceof' type )? ; + +relationalExpression : shiftExpression ( ( '<' | '>' | '<=' | '>=' ) shiftExpression )* ; + +shiftExpression : additiveExpression ( ( '<<' | rsignedshift | runsignedshift ) additiveExpression )* ; + +additiveExpression : multiplicativeExpression ( ( '+' | '-' ) multiplicativeExpression )* ; + +multiplicativeExpression : unaryExpression ( ( '*' | '/' | '%' ) unaryExpression )* ; + +unaryExpression : ( '+' | '-' ) unaryExpression +| preIncrementExpression +| preDecrementExpression +| unaryExpressionNotPlusMinus +; + +preIncrementExpression : '++' primaryExpression ; + +preDecrementExpression : '--' primaryExpression ; + +unaryExpressionNotPlusMinus : ( '~' | '!' ) unaryExpression +| castExpression +| postfixExpression +; + +castLookahead : '(' primitiveType +| '(' type '[' ']' +| '(' type ')' ( '~' | '!' | '(' | javaIdentifier | 'this' | 'super' | 'new' | literal ) +; + +postfixExpression : primaryExpression ( '++' | '--' )? ; + +castExpression : '(' type ')' unaryExpression +| '(' type ')' unaryExpressionNotPlusMinus +; + +primaryExpression : primaryPrefix primarySuffix* ; + +memberSelector : '.' typeArguments javaIdentifier ; + +primaryPrefix : literal +| 'this' +| 'super' '.' javaIdentifier +| '(' expression ')' +| allocationExpression +| resultType '.' 'class' +| name +; + +primarySuffix : '.' 'this' +| '.' allocationExpression +| memberSelector +| '[' expression ']' +| '.' javaIdentifier +| arguments +; + +literal : INTEGER_LITERAL +| FLOATING_POINT_LITERAL +| CHARACTER_LITERAL +| STRING_LITERAL +| booleanLiteral +| nullLiteral +; + +integerLiteral : INTEGER_LITERAL ; + +booleanLiteral : 'true' + | 'false' + ; + +stringLiteral : STRING_LITERAL ; + +nullLiteral : 'null' ; + +arguments : '(' argumentList? ')' ; + +argumentList : expression ( ',' expression )* ; + +allocationExpression : 'new' primitiveType arrayDimsAndInits + | 'new' classOrInterfaceType typeArguments? ( arrayDimsAndInits | arguments classOrInterfaceBody? ) + ; + +arrayDimsAndInits : ( '[' expression ']' )+ ( '[' ']' )* + | ( '[' ']' )+ arrayInitializer + ; + +statement : labeledStatement + | assertStatement +| block +| emptyStatement_ +| statementExpression ';' +| switchStatement +| ifStatement +| whileStatement +| doStatement +| forStatement +| breakStatement +| continueStatement +| returnStatement +| throwStatement +| synchronizedStatement +| tryStatement +; + +assertStatement : 'assert' expression ( ':' expression )? ';' ; + +labeledStatement : javaIdentifier ':' statement ; + +block : '{' blockStatement* '}' ; + +blockStatement : localVariableDeclaration ';' + | statement + | classOrInterfaceDeclaration + ; + +localVariableDeclaration : modifiers type variableDeclarator ( ',' variableDeclarator )* ; + +emptyStatement_ : ';' ; + +statementExpression : preIncrementExpression + | preDecrementExpression + | primaryExpression ( '++' | '--' | assignmentOperator expression )? + ; + +switchStatement : 'switch' '(' expression ')' '{' ( switchLabel ( blockStatement )* )* '}' ; + +switchLabel : 'case' expression ':' + | 'default' ':' + ; + +ifStatement : 'if' '(' expression ')' statement ( 'else' statement )? ; + +whileStatement : 'while' '(' expression ')' statement ; + +doStatement : 'do' statement 'while' '(' expression ')' ';' ; + +forStatement : 'for' '(' ( modifiers type javaIdentifier ':' expression | ( forInit )? ';' ( expression )? ';' ( forUpdate )? ) ')' statement ; + +forInit : localVariableDeclaration + | statementExpressionList + ; + +statementExpressionList : statementExpression ( ',' statementExpression )* ; + +forUpdate : statementExpressionList ; + +breakStatement : 'break' ( javaIdentifier )? ';' ; + +continueStatement : 'continue' ( javaIdentifier )? ';' ; + +returnStatement : 'return' expression? ';' ; + +throwStatement : 'throw' expression ';' ; + +synchronizedStatement : 'synchronized' '(' expression ')' block ; + +resourceDeclaration : type variableDeclaratorId '=' expression ; + +catchParameter : modifiers type ( ( '&' | '*' ) | '...' )? ( '|' type )* variableDeclaratorId ; + +tryStatement : 'try' ( '(' resourceDeclaration ( ';' resourceDeclaration )* ( ';' )? ')' )? block ( 'catch' '(' catchParameter ')' block )* ( 'finally' block )? ; + + +annotation : normalAnnotation + | singleMemberAnnotation + | markerAnnotation + ; + +normalAnnotation : '@' name '(' memberValuePairs? ')' ; + +markerAnnotation : '@' name ; + +singleMemberAnnotation : '@' name '(' memberValue ')' ; + +memberValuePairs : memberValuePair ( ',' memberValuePair )* ; + +memberValuePair : javaIdentifier '=' memberValue ; + +memberValue : annotation + | memberValueArrayInitializer + | conditionalExpression + ; + +memberValueArrayInitializer : '{' memberValue ( ',' memberValue )* ( ',' )? '}' ; + +annotationTypeDeclaration : '@' 'interface' javaIdentifier annotationTypeBody ; + +annotationTypeBody : '{' annotationTypeMemberDeclaration* '}' ; + +annotationTypeMemberDeclaration : modifiers ( type javaIdentifier '(' ')' defaultValue? ';' | classOrInterfaceDeclaration | enumDeclaration | annotationTypeDeclaration | fieldDeclaration ) + | ';' + ; + +defaultValue : 'default' memberValue ; diff --git a/javacc/desc.xml b/javacc/desc.xml new file mode 100644 index 0000000000..958fa31305 --- /dev/null +++ b/javacc/desc.xml @@ -0,0 +1,4 @@ + + + Antlr4ng;CSharp;Cpp;Dart;Go;Java;JavaScript;Python3;TypeScript + diff --git a/javacc/examples/CalcInput.jj b/javacc/examples/CalcInput.jj new file mode 100644 index 0000000000..2924ae49b0 --- /dev/null +++ b/javacc/examples/CalcInput.jj @@ -0,0 +1,140 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + USER_TOKEN_MANAGER = true; +} + +PARSER_BEGIN(CalcInputParser) + +public class CalcInputParser { +} + +PARSER_END(CalcInputParser) + +void Input() : + { + double larg = 0.0; + double rarg; + } +{ + ( + [ + larg=Number() + { + CalcGUI.print(larg); + } + ] + ( + + rarg=Number() + { + larg = larg + rarg; + CalcGUI.print(larg); + } + | + + rarg=Number() + { + larg = larg - rarg; + CalcGUI.print(larg); + } + | + + rarg=Number() + { + larg = larg * rarg; + CalcGUI.print(larg); + } + | +
+ rarg=Number() + { + larg = (rarg==0) ? Float.POSITIVE_INFINITY : (larg / rarg); + CalcGUI.print(larg); + } + )* + + { + image += t.image; + value = value*10 + Integer.parseInt(t.image); + CalcGUI.print(image); + } + )+ + [ + + { + image += "."; + CalcGUI.print(image); + } + ( + t= + { + image += t.image; + decimalPlace *= 0.1; + value = value + Integer.parseInt(t.image)*decimalPlace; + CalcGUI.print(image); + } + )+ + ] + { + return value; + } +| + + { + image = "0."; + CalcGUI.print(image); + } + ( + t= + { + image += t.image; + decimalPlace *= 0.1; + value = value + Integer.parseInt(t.image)*decimalPlace; + CalcGUI.print(image); + } + )+ + { + return value; + } +} diff --git a/javacc/examples/Digest.jj b/javacc/examples/Digest.jj new file mode 100644 index 0000000000..440b5a3db8 --- /dev/null +++ b/javacc/examples/Digest.jj @@ -0,0 +1,186 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Digest) + +import java.io.*; + +public class Digest { + + static int count = 0; + + static String buffer = ""; + + public static void main(String args[]) throws ParseException { + Digest parser = new Digest(System.in); + System.out.println("DIGEST OF RECENT MESSAGES FROM THE JAVACC MAILING LIST"); + System.out.println("----------------------------------------------------------------------"); + System.out.println(""); + System.out.println("MESSAGE SUMMARY:"); + System.out.println(""); + parser.MailFile(); + if (count == 0) { + System.out.println("There have been no messages since the last digest posting."); + System.out.println(""); + System.out.println("----------------------------------------------------------------------"); + } else { + System.out.println(""); + System.out.println("----------------------------------------------------------------------"); + System.out.println(""); + System.out.println(buffer); + } + } + +} + +PARSER_END(Digest) + + +// PARSER SPECIFICATIONS BEGIN HERE + +void MailFile() : + { + } +{ + ( + { + count++; + } + MailMessage() + )* + +} + +void MailMessage() : + { + Token subj=null, from=null, date=null, body; + } +{ + ( subj= | from= | date= )+ + { + System.out.println(count + ". " + ((subj==null) ? "no subject" : subj.image)); + buffer += "\n"; + buffer += "Message " + count + ":\n"; + buffer += "\n"; + buffer += "Subject: " + ((subj==null) ? "no subject" : subj.image) + "\n"; + buffer += "From: " + ((from==null) ? "" : from.image) + "\n"; + buffer += "Date: " + ((date==null) ? "" : date.image) + "\n"; + buffer += "\n"; + } + ( body= + { + buffer += body.image; + } + )* + + { + buffer += "\n"; + buffer += "----------------------------------------------------------------------\n"; + } +} + + +// LEXICAL SPECIFICATIONS BEGIN HERE + +TOKEN: +{ + <#EOL: "\n" | "\r" | "\r\n"> +| + <#TWOEOLS: (("\n"|"\r\n") ) | ("\r\r" [ "\n" ])> +| + <#NOT_EOL: ~["\n","\r"]> +} + + +SKIP: +{ + < "*** EOOH ***" > : MAILHEADER +| + <~[]> +} + + +SKIP: +{ + <_TWOEOLS: > : MAILBODY + // We cannot have just a reference to a regular expression in a + // lexical specification - i.e., we cannot simply have . +| + "Subject: " : MAILSUBJECT +| + "From: " : MAILFROM +| + "Date: " : MAILDATE +| + <~[]> +} + + +TOKEN: +{ + )+> +} + + +SKIP: +{ + <_EOL1: > : MAILHEADER +} + + +TOKEN: +{ + )+> +} + + +SKIP: +{ + <_EOL2: > : MAILHEADER +} + + +TOKEN: +{ + )+> +} + + +SKIP: +{ + <_EOL3: > : MAILHEADER +} + + +TOKEN: +{ + > +| + : DEFAULT +} diff --git a/javacc/examples/Example1.jj b/javacc/examples/Example1.jj new file mode 100644 index 0000000000..45797fcfae --- /dev/null +++ b/javacc/examples/Example1.jj @@ -0,0 +1,61 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.Input(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void Input() : +{} +{ + "a" BC() "c" +} + +void BC() : +{} +{ + "b" [ "c" ] +} diff --git a/javacc/examples/Example10.jj b/javacc/examples/Example10.jj new file mode 100644 index 0000000000..b0d189c9ac --- /dev/null +++ b/javacc/examples/Example10.jj @@ -0,0 +1,69 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.IfStm(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void IfStm() : +{} +{ + "if" C() S() [ "else" S() ] +} + +void C() : +{} +{ + "TBD" +} + +void S() : +{} +{ + "TBD" +| + IfStm() +} diff --git a/javacc/examples/Example2.jj b/javacc/examples/Example2.jj new file mode 100644 index 0000000000..6f351f94ad --- /dev/null +++ b/javacc/examples/Example2.jj @@ -0,0 +1,70 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.basic_expr(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +TOKEN [IGNORE_CASE] : +{ + +} + +void basic_expr() : +{} +{ + "(" expr() ")" +| + "(" expr() ")" +| + "new" +} + +void expr() : +{} +{ + "TBD" +} diff --git a/javacc/examples/Example3.jj b/javacc/examples/Example3.jj new file mode 100644 index 0000000000..caa676376d --- /dev/null +++ b/javacc/examples/Example3.jj @@ -0,0 +1,72 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.basic_expr(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void basic_expr() : +{} +{ + "(" expr() ")" +| + "(" expr() ")" +| + "new" +| + "." +} + +void expr() : +{} +{ + "TBD" +} + +TOKEN [IGNORE_CASE] : +{ + +} diff --git a/javacc/examples/Example4.jj b/javacc/examples/Example4.jj new file mode 100644 index 0000000000..7fcb6130f4 --- /dev/null +++ b/javacc/examples/Example4.jj @@ -0,0 +1,60 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.identifier_list(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void identifier_list() : +{} +{ + ( "," )* +} + +TOKEN [IGNORE_CASE] : +{ + +} diff --git a/javacc/examples/Example5.jj b/javacc/examples/Example5.jj new file mode 100644 index 0000000000..acda2e6c5f --- /dev/null +++ b/javacc/examples/Example5.jj @@ -0,0 +1,68 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.funny_list(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void identifier_list() : +{} +{ + ( "," )* +} + +void funny_list() : +{} +{ + identifier_list() "," +} + +TOKEN [IGNORE_CASE] : +{ + +| + +} diff --git a/javacc/examples/Example6.jj b/javacc/examples/Example6.jj new file mode 100644 index 0000000000..79ec269b75 --- /dev/null +++ b/javacc/examples/Example6.jj @@ -0,0 +1,70 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.basic_expr(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void basic_expr() : +{} +{ + ( "(" expr() ")" | "." ) +| + "(" expr() ")" +| + "new" +} + +void expr() : +{} +{ + "TBD" +} + +TOKEN [IGNORE_CASE] : +{ + +} diff --git a/javacc/examples/Example7.jj b/javacc/examples/Example7.jj new file mode 100644 index 0000000000..bc193a66a2 --- /dev/null +++ b/javacc/examples/Example7.jj @@ -0,0 +1,62 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.funny_list(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void funny_list() : +{} +{ + "," ( "," )* +} + +TOKEN [IGNORE_CASE] : +{ + +| + +} diff --git a/javacc/examples/Example8.jj b/javacc/examples/Example8.jj new file mode 100644 index 0000000000..8e17658e92 --- /dev/null +++ b/javacc/examples/Example8.jj @@ -0,0 +1,73 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.basic_expr(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void basic_expr() : +{} +{ + LOOKAHEAD(2) + "(" expr() ")" +| + "(" expr() ")" +| + "new" +| + "." +} + +void expr() : +{} +{ + "TBD" +} + +TOKEN [IGNORE_CASE] : +{ + +} diff --git a/javacc/examples/Example9.jj b/javacc/examples/Example9.jj new file mode 100644 index 0000000000..d171302c7b --- /dev/null +++ b/javacc/examples/Example9.jj @@ -0,0 +1,68 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Example) + +public class Example { + + public static void main(String args[]) throws ParseException { + Example parser = new Example(System.in); + parser.funny_list(); + } + +} + +PARSER_END(Example) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +void identifier_list() : +{} +{ + ( LOOKAHEAD(2) "," )* +} + +void funny_list() : +{} +{ + identifier_list() "," +} + +TOKEN [IGNORE_CASE] : +{ + +| + +} diff --git a/javacc/examples/Faq.jj b/javacc/examples/Faq.jj new file mode 100644 index 0000000000..c58946548a --- /dev/null +++ b/javacc/examples/Faq.jj @@ -0,0 +1,225 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Faq) + +import java.io.*; + +public class Faq { + + static int count = 0; + + static int beginAt = 1; + + static PrintWriter indstr; + + static { + try { + indstr = new PrintWriter(new FileWriter("index.html")); + indstr.println("Selected list of emails from the JavaCC mailing list"); + indstr.println("

Selected list of emails from the JavaCC mailing list

"); + } catch (IOException e) { + throw new Error(); + } + } + + static String fix(String s) { + String retval = ""; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == '<') { + retval += "<"; + } else if (c == '>') { + retval += ">"; + } else { + retval += c; + } + } + return retval; + } + + public static void main(String args[]) throws ParseException { + if (args.length == 1) { + beginAt = Integer.parseInt(args[0]); + } + Faq parser = new Faq(System.in); + parser.MailFile(); + } + +} + +PARSER_END(Faq) + + +// PARSER SPECIFICATIONS BEGIN HERE + +void MailFile() : + { + } +{ + ( + { + count++; + } + MailMessage() + { + System.out.print(count + "."); + System.out.flush(); + } + )* + + { + System.out.println(""); + indstr.close(); + } +} + +void MailMessage() : + { + PrintWriter msgstr = null; + Token subj=null, from=null, date=null, body; + if (count >= beginAt) { + try { + msgstr = new PrintWriter(new FileWriter(count + ".html")); + } catch (IOException e) { + throw new Error(); + } + } + } +{ + ( subj= | from= | date= )+ + { + indstr.print(""); + if (subj == null) { + indstr.println("no subject
"); + } else { + indstr.println(fix(subj.image) + "
"); + } + if (count >= beginAt) { + msgstr.println("" + ((subj==null) ? "no subject" : fix(subj.image)) + ""); + msgstr.println("Subject: " + ((subj==null) ? "no subject" : fix(subj.image)) + "
"); + msgstr.println("From: " + ((from==null) ? "" : fix(from.image)) + "
"); + msgstr.println("Date: " + ((date==null) ? "" : fix(date.image)) + "
"); + msgstr.println("
"); + } + } + ( body= + { + if (count >= beginAt) { + msgstr.print(fix(body.image) + "
"); + } + } + )* + + { + if (count >= beginAt) { + msgstr.close(); + } + } +} + + +// LEXICAL SPECIFICATIONS BEGIN HERE + +TOKEN: +{ + <#EOL: "\n" | "\r" | "\r\n"> +| + <#TWOEOLS: (("\n"|"\r\n") ) | ("\r\r" [ "\n" ])> +| + <#NOT_EOL: ~["\n","\r"]> +} + + +SKIP: +{ + < "*** EOOH ***" > : MAILHEADER +| + <~[]> +} + + +SKIP: +{ + <_TWOEOLS: > : MAILBODY + // We cannot have just a reference to a regular expression in a + // lexical specification - i.e., we cannot simply have . +| + "Subject: " : MAILSUBJECT +| + "From: " : MAILFROM +| + "Date: " : MAILDATE +| + <~[]> +} + + +TOKEN: +{ + )+> +} + + +SKIP: +{ + <_EOL1: > : MAILHEADER +} + + +TOKEN: +{ + )+> +} + + +SKIP: +{ + <_EOL2: > : MAILHEADER +} + + +TOKEN: +{ + )+> +} + + +SKIP: +{ + <_EOL3: > : MAILHEADER +} + + +TOKEN: +{ + > +| + : DEFAULT +} diff --git a/javacc/examples/IDL.jj b/javacc/examples/IDL.jj new file mode 100644 index 0000000000..d007e922d0 --- /dev/null +++ b/javacc/examples/IDL.jj @@ -0,0 +1,865 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +PARSER_BEGIN(IDLParser) + +public class IDLParser { + + public static void main(String args[]) { + IDLParser parser; + if (args.length == 0) { + System.out.println("IDL Parser Version 0.1: Reading from standard input . . ."); + parser = new IDLParser(System.in); + } else if (args.length == 1) { + System.out.println("IDL Parser Version 0.1: Reading from file " + args[0] + " . . ."); + try { + parser = new IDLParser(new java.io.FileInputStream(args[0])); + } catch (java.io.FileNotFoundException e) { + System.out.println("IDL Parser Version 0.1: File " + args[0] + " not found."); + return; + } + } else { + System.out.println("IDL Parser Version 0.1: Usage is one of:"); + System.out.println(" java IDLParser < inputfile"); + System.out.println("OR"); + System.out.println(" java IDLParser inputfile"); + return; + } + try { + parser.specification(); + System.out.println("IDL Parser Version 0.1: IDL file parsed successfully."); + } catch (ParseException e) { + System.out.println("IDL Parser Version 0.1: Encountered errors during parse."); + } + } + +} + +PARSER_END(IDLParser) + + +/* + * Tokens to ignore in the BNF follow. + */ + +SKIP : +{ + < " " > +| < "\t" > +| < "\n" > +| < "\r" > +| < "//" (~["\n"])* "\n" > +| <"/*" (~["*"])* "*" (~["/"] (~["*"])* "*")* "/"> +| < "#" ([" ","\t"])* (["0"-"9"])+ + (([" ","\t"])* "\"" (~["\""])+ "\"" + ([" ","\t"])* (["0"-"9"])* ([" ","\t"])* (["0"-"9"])*)? "\n" > +} + +/* Production 1 */ + +void specification() : +{} +{ + ( definition() )+ +} + +/* Production 2 */ + +void definition() : +{} +{ + type_dcl() ";" +| + const_dcl() ";" +| + except_dcl() ";" +| + interfacex() ";" +| + module() ";" +} + +/* Production 3 */ + +void module() : +{} +{ + "module" identifier() "{" ( definition() )+ "}" +} + +/* Production 4 */ + +void interfacex() : +{} +{ + LOOKAHEAD(3) + interface_dcl() +| + forward_dcl() +} + +/* Production 5 */ + +void interface_dcl() : +{} +{ + interface_header() "{" interface_body() "}" +} + +/* Production 6 */ + +void forward_dcl() : +{} +{ + "interface" identifier() +} + +/* Production 7 */ + +void interface_header() : +{} +{ + "interface" identifier() [ inheritance_spec() ] +} + +/* Production 8 */ + +void interface_body() : +{} +{ + ( export() )* +} + +/* Production 9 */ + +void export() : +{} +{ + type_dcl() ";" +| + const_dcl() ";" +| + except_dcl() ";" +| + attr_dcl() ";" +| + op_dcl() ";" +} + +/* Production 10 */ + +void inheritance_spec() : +{} +{ + ":" scoped_name() ( "," scoped_name() )* +} + +/* Production 11 */ + +void scoped_name() : +{} +{ + [ "::" ] identifier() ( "::" identifier() )* +} + +/* Production 12 */ + +void const_dcl() : +{} +{ + "const" const_type() identifier() "=" const_exp() +} + +/* Production 13 */ + +void const_type() : +{} +{ + integer_type() +| + char_type() +| + boolean_type() +| + floating_pt_type() +| + string_type() +| + scoped_name() +} + +/* Production 14 */ + +void const_exp() : +{} +{ + or_expr() +} + +/* Production 15 */ + +void or_expr() : +{} +{ + xor_expr() ( "|" xor_expr() )* +} + +/* Production 16 */ + +void xor_expr() : +{} +{ + and_expr() ( "^" and_expr() )* +} + +/* Production 17 */ + +void and_expr() : +{} +{ + shift_expr() ( "&" shift_expr() )* +} + +/* Production 18 */ + +void shift_expr() : +{} +{ + add_expr() ( ( ">>" | "<<" ) add_expr() )* +} + +/* Production 19 */ + +void add_expr() : +{} +{ + mult_expr() ( ( "+" | "-" ) mult_expr() )* +} + +/* Production 20 */ + +void mult_expr() : +{} +{ + unary_expr() ( ( "*" | "/" | "%" ) unary_expr() )* +} + +/* Production 21 */ + +void unary_expr() : +{} +{ + [ unary_operator() ] primary_expr() +} + +/* Production 22 */ +void unary_operator() : +{} +{ + "-" +| + "+" +| + "~" +} + +/* Production 23 */ + +void primary_expr() : +{} +{ + scoped_name() +| + literal() +| + "(" const_exp() ")" +} + +/* Production 24 */ + +void literal() : +{} +{ + integer_literal() +| + string_literal() +| + character_literal() +| + floating_pt_literal() +| + boolean_literal() +} + +/* Production 25 */ + +void boolean_literal() : +{} +{ + "TRUE" +| + "FALSE" +} + +/* Production 26 */ + +void positive_int_const() : +{} +{ + const_exp() +} + +/* Production 27 */ + +void type_dcl() : +{} +{ + "typedef" type_declarator() +| + struct_type() +| + union_type() +| + enum_type() +} + +/* Production 28 */ + +void type_declarator() : +{} +{ + type_spec() declarators() +} + +/* Production 29 */ + +void type_spec() : +{} +{ + simple_type_spec() +| + constr_type_spec() +} + +/* Production 30 */ + +void simple_type_spec() : +{} +{ + base_type_spec() +| + template_type_spec() +| + scoped_name() +} + +/* Production 31 */ + +void base_type_spec() : +{} +{ + floating_pt_type() +| + integer_type() +| + char_type() +| + boolean_type() +| + octet_type() +| + any_type() +} + +/* Production 32 */ + +void template_type_spec() : +{} +{ + sequence_type() +| + string_type() +} + +/* Production 33 */ + +void constr_type_spec() : +{} +{ + struct_type() +| + union_type() +| + enum_type() +} + +/* Production 34 */ + +void declarators() : +{} +{ + declarator() ( "," declarator() )* +} + +/* Production 35 */ + +void declarator() : +{} +{ + LOOKAHEAD(2) + complex_declarator() +| + simple_declarator() +} + +/* Production 36 */ + +void simple_declarator() : +{} +{ + identifier() +} + +/* Production 37 */ + +void complex_declarator() : +{} +{ + array_declarator() +} + +/* Production 38 */ + +void floating_pt_type() : +{} +{ + "float" +| + "double" +} + +/* Production 39 */ + +void integer_type() : +{} +{ + signed_int() +| + unsigned_int() +} + +/* Production 40 */ + +void signed_int() : +{} +{ + signed_long_int() +| + signed_short_int() +} + +/* Production 41 */ + +void signed_long_int() : +{} +{ + "long" +} + +/* Production 42 */ + +void signed_short_int() : +{} +{ + "short" +} + +/* Production 43 */ + +void unsigned_int() : +{} +{ + LOOKAHEAD(2) + unsigned_long_int() +| + unsigned_short_int() +} + +/* Production 44 */ + +void unsigned_long_int() : +{} +{ + "unsigned" "long" +} + +/* Production 45 */ + +void unsigned_short_int() : +{} +{ + "unsigned" "short" +} + +/* Production 46 */ + +void char_type() : +{} +{ + "char" +} + +/* Production 47 */ + +void boolean_type() : +{} +{ + "boolean" +} + +/* Production 48 */ + +void octet_type() : +{} +{ + "octet" +} + +/* Production 49 */ + +void any_type() : +{} +{ + "any" +} + +/* Production 50 */ + +void struct_type() : +{} +{ + "struct" identifier() "{" member_list() "}" +} + +/* Production 51 */ + +void member_list() : +{} +{ + ( member() )+ +} + +/* Production 52 */ + +void member() : +{} +{ + type_spec() declarators() ";" +} + +/* Production 53 */ + +void union_type() : +{} +{ + "union" identifier() "switch" "(" switch_type_spec() ")" "{" switch_body() "}" +} + +/* Production 54 */ + +void switch_type_spec() : +{} +{ + integer_type() +| + char_type() +| + boolean_type() +| + enum_type() +| + scoped_name() +} + +/* Production 55 */ + +void switch_body() : +{} +{ + ( casex() )+ +} + +/* Production 56 */ + +void casex() : +{} +{ + ( case_label() )+ element_spec() ";" +} + +/* Production 57 */ + +void case_label() : +{} +{ + "case" const_exp() ":" +| + "default" ":" +} + +/* Production 58 */ + +void element_spec() : +{} +{ + type_spec() declarator() +} + +/* Production 59 */ + +void enum_type() : +{} +{ + "enum" identifier() "{" enumerator() ( "," enumerator() )* "}" +} + +/* Production 60 */ + +void enumerator() : +{} +{ + identifier() +} + +/* Production 61 */ + +void sequence_type() : +{} +{ + "sequence" "<" simple_type_spec() [ "," positive_int_const() ] ">" +} + +/* Production 62 */ + +void string_type() : +{} +{ + "string" [ "<" positive_int_const() ">" ] +} + +/* Production 63 */ + +void array_declarator() : +{} +{ + identifier() ( fixed_array_size() )+ +} + +/* Production 64 */ + +void fixed_array_size() : +{} +{ + "[" positive_int_const() "]" +} + +/* Production 65 */ + +void attr_dcl() : +{} +{ + [ "readonly" ] "attribute" param_type_spec() simple_declarator() ( "," simple_declarator() )* +} + +/* Production 66 */ + +void except_dcl() : +{} +{ + "exception" identifier() "{" ( member() )* "}" +} + +/* Production 67 */ + +void op_dcl() : +{} +{ + [ op_attribute() ] op_type_spec() identifier() parameter_dcls() [ raises_expr() ] [ context_expr() ] +} + +/* Production 68 */ + +void op_attribute() : +{} +{ + "oneway" +} + +/* Production 69 */ + +void op_type_spec() : +{} +{ + param_type_spec() +| + "void" +} + +/* Production 70 */ + +void parameter_dcls() : +{} +{ + "(" [ param_dcl() ( "," param_dcl() )* ] ")" +} + +/* Production 71 */ + +void param_dcl() : +{} +{ + param_attribute() param_type_spec() simple_declarator() +} + +/* Production 72 */ + +void param_attribute() : +{} +{ + "in" +| + "out" +| + "inout" +} + +/* Production 73 */ + +void raises_expr() : +{} +{ + "raises" "(" scoped_name() ( "," scoped_name() )* ")" +} + +/* Production 74 */ + +void context_expr() : +{} +{ + "context" "(" string_literal() ( "," string_literal() )* ")" +} + +/* Production 75 */ + +void param_type_spec() : +{} +{ + base_type_spec() +| + string_type() +| + scoped_name() +} + +/* Definitions of complex regular expressions follow */ + +void identifier() : +{} +{ + +} + +void integer_literal() : +{} +{ + +| + +| + +} + +void string_literal() : +{} +{ + +} + +void character_literal() : +{} +{ + +} + +void floating_pt_literal() : +{} +{ + +| + +} + +TOKEN : +{ + < ID : ["a"-"z","A"-"Z", "_"] (["a"-"z","A"-"Z","0"-"9","_"])* > +| < OCTALINT : "0" (["0"-"7"])* (["u","U","l","L"])? > +| < DECIMALINT : ["1"-"9"] (["0"-"9"])* (["u","U","l","L"])? > +| < HEXADECIMALINT : ("0x"|"0X") (["0"-"9","a"-"f","A"-"F"])+ (["u","U","l","L"])? > +| < FLOATONE : ((["0"-"9"])+ "." (["0"-"9"])* | (["0"-"9"])* "." (["0"-"9"])+) + (["e","E"] (["-","+"])? (["0"-"9"])+)? (["f","F","l","L"])? > +| < FLOATTWO : (["0"-"9"])+ ["e","E"] (["-","+"])? + (["0"-"9"])+ (["f","F","l","L"])? > +| < CHARACTER : "'" + ( (~["'","\\","\n","\r"]) + | ("\\" ( + ["n","t","v","b","r","f","a","\\","?","'","\""] + | + "0" (["0"-"7"])* + | + ["1"-"9"] (["0"-"9"])* + | + ("0x" | "0X") (["0"-"9","a"-"f","A"-"F"])+ + ) + ) + ) + "'" > +| < STRING : "\"" + ( ( ~["\"","\\","\n","\r"]) + | ("\\" ( + ["n","t","v","b","r","f","a","\\","?","'","\""] + | + "0" (["0"-"7"])* + | + ["1"-"9"] (["0"-"9"])* + | + ("0x" | "0X") (["0"-"9","a"-"f","A"-"F"])+ + ) + ) + )* + "\"" > +} diff --git a/javacc/examples/IdList.jj b/javacc/examples/IdList.jj new file mode 100644 index 0000000000..1ccbfc862a --- /dev/null +++ b/javacc/examples/IdList.jj @@ -0,0 +1,63 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +PARSER_BEGIN(IdList) + + +/** ID lister. */ +public class IdList { + + /** Main entry point. */ + public static void main(String args[]) throws ParseException { + IdList parser = new IdList(System.in); + parser.Input(); + } + +} + +PARSER_END(IdList) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +TOKEN : +{ + < Id: ["a"-"z","A"-"Z"] ( ["a"-"z","A"-"Z","0"-"9"] )* > +} + +/** Top level production. */ +void Input() : +{} +{ + ( )+ +} diff --git a/javacc/examples/IdsFile.jj b/javacc/examples/IdsFile.jj new file mode 100644 index 0000000000..b9ae3f0d68 --- /dev/null +++ b/javacc/examples/IdsFile.jj @@ -0,0 +1,196 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + JAVA_UNICODE_ESCAPE = true; + STATIC = false; +} + +PARSER_BEGIN(IdsFile) + +import java.util.*; + +public class IdsFile { +} + +PARSER_END(IdsFile) + +/* + * Following is the only production in this grammar. This describes the grammar + * of the nochangeidsfile and useidsfile, which are simply lists of identifiers. + * The actions here insert these identifiers into the appropriate Hashtable's + * in Globals.java. + */ + +void input(boolean noChangeIds, String fileName) : + { + Token t; + Object obj; + Hashtable symtab = noChangeIds ? Globals.noChangeIds : Globals.useIds; + } +{ + ( + t= + { + if (!noChangeIds) { + // truncate size just to be safe on machines like Macs + if (t.image.length() > 24) { + t.image = t.image.substring(0,24); + } + } + if (!noChangeIds && Globals.mapTargets.get(t.image) != null) { + System.out.println("Warning: Identifier " + t.image + " from already mapped."); + } else { + obj = symtab.put(t.image, ""); + if (obj != null) { + System.out.println("Warning: Multiple occurrence of identifier " + t.image + " in " + fileName); + } else if (noChangeIds) { + Globals.mappings.put(t.image, t.image); + Globals.mapTargets.put(t.image, ""); + } + } + } + )* + +} + +// Lexical specifications follow (copied from the Java 1.1 grammar) + +SKIP : /* WHITE SPACE */ +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +SKIP : /* COMMENTS */ +{ + +| +| +} + +TOKEN : /* RESERVED WORDS */ +{ + < 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 : /* IDENTIFIERS */ +{ + < IDENTIFIER: (|)* > +| + < #LETTER: + [ + "\u0024", + "\u0041"-"\u005a", + "\u005f", + "\u0061"-"\u007a", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u00ff", + "\u0100"-"\u1fff", + "\u3040"-"\u318f", + "\u3300"-"\u337f", + "\u3400"-"\u3d2d", + "\u4e00"-"\u9fff", + "\uf900"-"\ufaff" + ] + > +| + < #DIGIT: + [ + "\u0030"-"\u0039", + "\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" + ] + > +} diff --git a/javacc/examples/Java1.1.jj b/javacc/examples/Java1.1.jj new file mode 100644 index 0000000000..9e618583ad --- /dev/null +++ b/javacc/examples/Java1.1.jj @@ -0,0 +1,1697 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + JAVA_UNICODE_ESCAPE = true; +} + +PARSER_BEGIN(JavaParser) + +public class JavaParser { + + public static void main(String args[]) { + JavaParser parser; + if (args.length == 0) { + System.out.println("Java Parser Version 1.1: Reading from standard input . . ."); + parser = new JavaParser(System.in); + } else if (args.length == 1) { + System.out.println("Java Parser Version 1.1: Reading from file " + args[0] + " . . ."); + try { + parser = new JavaParser(new java.io.FileInputStream(args[0])); + } catch (java.io.FileNotFoundException e) { + System.out.println("Java Parser Version 1.1: File " + args[0] + " not found."); + return; + } + } else { + System.out.println("Java Parser Version 1.1: Usage is one of:"); + System.out.println(" java JavaParser < inputfile"); + System.out.println("OR"); + System.out.println(" java JavaParser inputfile"); + return; + } + try { + parser.CompilationUnit(); + System.out.println("Java Parser Version 1.1: Java program parsed successfully."); + } catch (ParseException e) { + System.out.println(e.getMessage()); + System.out.println("Java Parser Version 1.1: Encountered errors during parse."); + } + } + +} + +PARSER_END(JavaParser) + + +/* WHITE SPACE */ + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* COMMENTS */ + +MORE : +{ + "//" : IN_SINGLE_LINE_COMMENT +| + <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT +| + "/*" : IN_MULTI_LINE_COMMENT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +MORE : +{ + < ~[] > +} + +/* RESERVED WORDS AND LITERALS */ + +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" > +} + +/* LITERALS */ + +TOKEN : +{ + < INTEGER_LITERAL: + (["l","L"])? + | (["l","L"])? + | (["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"])* ()? (["f","F","d","D"])? + | "." (["0"-"9"])+ ()? (["f","F","d","D"])? + | (["0"-"9"])+ (["f","F","d","D"])? + | (["0"-"9"])+ ()? ["f","F","d","D"] + > +| + < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > +| + < CHARACTER_LITERAL: + "'" + ( (~["'","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + ) + "'" + > +| + < STRING_LITERAL: + "\"" + ( (~["\"","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + )* + "\"" + > +} + +/* IDENTIFIERS */ + +TOKEN : +{ + < IDENTIFIER: ()* > +| + < #LETTER: + [ // all chars for which Character.isIdentifierStart is true + "$", + "A"-"Z", + "_", + "a"-"z", + "\u00a2"-"\u00a5", + "\u00aa", + "\u00b5", + "\u00ba", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u021f", + "\u0222"-"\u0233", + "\u0250"-"\u02ad", + "\u02b0"-"\u02b8", + "\u02bb"-"\u02c1", + "\u02d0"-"\u02d1", + "\u02e0"-"\u02e4", + "\u02ee", + "\u037a", + "\u0386", + "\u0388"-"\u038a", + "\u038c", + "\u038e"-"\u03a1", + "\u03a3"-"\u03ce", + "\u03d0"-"\u03d7", + "\u03da"-"\u03f3", + "\u0400"-"\u0481", + "\u048c"-"\u04c4", + "\u04c7"-"\u04c8", + "\u04cb"-"\u04cc", + "\u04d0"-"\u04f5", + "\u04f8"-"\u04f9", + "\u0531"-"\u0556", + "\u0559", + "\u0561"-"\u0587", + "\u05d0"-"\u05ea", + "\u05f0"-"\u05f2", + "\u0621"-"\u063a", + "\u0640"-"\u064a", + "\u0671"-"\u06d3", + "\u06d5", + "\u06e5"-"\u06e6", + "\u06fa"-"\u06fc", + "\u0710", + "\u0712"-"\u072c", + "\u0780"-"\u07a5", + "\u0905"-"\u0939", + "\u093d", + "\u0950", + "\u0958"-"\u0961", + "\u0985"-"\u098c", + "\u098f"-"\u0990", + "\u0993"-"\u09a8", + "\u09aa"-"\u09b0", + "\u09b2", + "\u09b6"-"\u09b9", + "\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"-"\u0a8b", + "\u0a8d", + "\u0a8f"-"\u0a91", + "\u0a93"-"\u0aa8", + "\u0aaa"-"\u0ab0", + "\u0ab2"-"\u0ab3", + "\u0ab5"-"\u0ab9", + "\u0abd", + "\u0ad0", + "\u0ae0", + "\u0b05"-"\u0b0c", + "\u0b0f"-"\u0b10", + "\u0b13"-"\u0b28", + "\u0b2a"-"\u0b30", + "\u0b32"-"\u0b33", + "\u0b36"-"\u0b39", + "\u0b3d", + "\u0b5c"-"\u0b5d", + "\u0b5f"-"\u0b61", + "\u0b85"-"\u0b8a", + "\u0b8e"-"\u0b90", + "\u0b92"-"\u0b95", + "\u0b99"-"\u0b9a", + "\u0b9c", + "\u0b9e"-"\u0b9f", + "\u0ba3"-"\u0ba4", + "\u0ba8"-"\u0baa", + "\u0bae"-"\u0bb5", + "\u0bb7"-"\u0bb9", + "\u0c05"-"\u0c0c", + "\u0c0e"-"\u0c10", + "\u0c12"-"\u0c28", + "\u0c2a"-"\u0c33", + "\u0c35"-"\u0c39", + "\u0c60"-"\u0c61", + "\u0c85"-"\u0c8c", + "\u0c8e"-"\u0c90", + "\u0c92"-"\u0ca8", + "\u0caa"-"\u0cb3", + "\u0cb5"-"\u0cb9", + "\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"-"\u10f6", + "\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", + "\u1780"-"\u17b3", + "\u17db", + "\u1820"-"\u1877", + "\u1880"-"\u18a8", + "\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", + "\u207f", + "\u20a0"-"\u20af", + "\u2102", + "\u2107", + "\u210a"-"\u2113", + "\u2115", + "\u2119"-"\u211d", + "\u2124", + "\u2126", + "\u2128", + "\u212a"-"\u212d", + "\u212f"-"\u2131", + "\u2133"-"\u2139", + "\u2160"-"\u2183", + "\u3005"-"\u3007", + "\u3021"-"\u3029", + "\u3031"-"\u3035", + "\u3038"-"\u303a", + "\u3041"-"\u3094", + "\u309d"-"\u309e", + "\u30a1"-"\u30fe", + "\u3105"-"\u312c", + "\u3131"-"\u318e", + "\u31a0"-"\u31b7", + "\u3400"-"\u4db5", + "\u4e00"-"\u9fa5", + "\ua000"-"\ua48c", + "\uac00"-"\ud7a3", + "\uf900"-"\ufa2d", + "\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"-"\ufdfb", + "\ufe33"-"\ufe34", + "\ufe4d"-"\ufe4f", + "\ufe69", + "\ufe70"-"\ufe72", + "\ufe74", + "\ufe76"-"\ufefc", + "\uff04", + "\uff21"-"\uff3a", + "\uff3f", + "\uff41"-"\uff5a", + "\uff65"-"\uffbe", + "\uffc2"-"\uffc7", + "\uffca"-"\uffcf", + "\uffd2"-"\uffd7", + "\uffda"-"\uffdc", + "\uffe0"-"\uffe1", + "\uffe5"-"\uffe6" + ] + > +| + < #PART_LETTER: + [ // all chars for which Character.isIdentifierPart is true + "\u0000"-"\u0008", + "\u000e"-"\u001b", + "$", + "0"-"9", + "A"-"Z", + "_", + "a"-"z", + "\u007f"-"\u009f", + "\u00a2"-"\u00a5", + "\u00aa", + "\u00b5", + "\u00ba", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u021f", + "\u0222"-"\u0233", + "\u0250"-"\u02ad", + "\u02b0"-"\u02b8", + "\u02bb"-"\u02c1", + "\u02d0"-"\u02d1", + "\u02e0"-"\u02e4", + "\u02ee", + "\u0300"-"\u034e", + "\u0360"-"\u0362", + "\u037a", + "\u0386", + "\u0388"-"\u038a", + "\u038c", + "\u038e"-"\u03a1", + "\u03a3"-"\u03ce", + "\u03d0"-"\u03d7", + "\u03da"-"\u03f3", + "\u0400"-"\u0481", + "\u0483"-"\u0486", + "\u048c"-"\u04c4", + "\u04c7"-"\u04c8", + "\u04cb"-"\u04cc", + "\u04d0"-"\u04f5", + "\u04f8"-"\u04f9", + "\u0531"-"\u0556", + "\u0559", + "\u0561"-"\u0587", + "\u0591"-"\u05a1", + "\u05a3"-"\u05b9", + "\u05bb"-"\u05bd", + "\u05bf", + "\u05c1"-"\u05c2", + "\u05c4", + "\u05d0"-"\u05ea", + "\u05f0"-"\u05f2", + "\u0621"-"\u063a", + "\u0640"-"\u0655", + "\u0660"-"\u0669", + "\u0670"-"\u06d3", + "\u06d5"-"\u06dc", + "\u06df"-"\u06e8", + "\u06ea"-"\u06ed", + "\u06f0"-"\u06fc", + "\u070f"-"\u072c", + "\u0730"-"\u074a", + "\u0780"-"\u07b0", + "\u0901"-"\u0903", + "\u0905"-"\u0939", + "\u093c"-"\u094d", + "\u0950"-"\u0954", + "\u0958"-"\u0963", + "\u0966"-"\u096f", + "\u0981"-"\u0983", + "\u0985"-"\u098c", + "\u098f"-"\u0990", + "\u0993"-"\u09a8", + "\u09aa"-"\u09b0", + "\u09b2", + "\u09b6"-"\u09b9", + "\u09bc", + "\u09be"-"\u09c4", + "\u09c7"-"\u09c8", + "\u09cb"-"\u09cd", + "\u09d7", + "\u09dc"-"\u09dd", + "\u09df"-"\u09e3", + "\u09e6"-"\u09f3", + "\u0a02", + "\u0a05"-"\u0a0a", + "\u0a0f"-"\u0a10", + "\u0a13"-"\u0a28", + "\u0a2a"-"\u0a30", + "\u0a32"-"\u0a33", + "\u0a35"-"\u0a36", + "\u0a38"-"\u0a39", + "\u0a3c", + "\u0a3e"-"\u0a42", + "\u0a47"-"\u0a48", + "\u0a4b"-"\u0a4d", + "\u0a59"-"\u0a5c", + "\u0a5e", + "\u0a66"-"\u0a74", + "\u0a81"-"\u0a83", + "\u0a85"-"\u0a8b", + "\u0a8d", + "\u0a8f"-"\u0a91", + "\u0a93"-"\u0aa8", + "\u0aaa"-"\u0ab0", + "\u0ab2"-"\u0ab3", + "\u0ab5"-"\u0ab9", + "\u0abc"-"\u0ac5", + "\u0ac7"-"\u0ac9", + "\u0acb"-"\u0acd", + "\u0ad0", + "\u0ae0", + "\u0ae6"-"\u0aef", + "\u0b01"-"\u0b03", + "\u0b05"-"\u0b0c", + "\u0b0f"-"\u0b10", + "\u0b13"-"\u0b28", + "\u0b2a"-"\u0b30", + "\u0b32"-"\u0b33", + "\u0b36"-"\u0b39", + "\u0b3c"-"\u0b43", + "\u0b47"-"\u0b48", + "\u0b4b"-"\u0b4d", + "\u0b56"-"\u0b57", + "\u0b5c"-"\u0b5d", + "\u0b5f"-"\u0b61", + "\u0b66"-"\u0b6f", + "\u0b82"-"\u0b83", + "\u0b85"-"\u0b8a", + "\u0b8e"-"\u0b90", + "\u0b92"-"\u0b95", + "\u0b99"-"\u0b9a", + "\u0b9c", + "\u0b9e"-"\u0b9f", + "\u0ba3"-"\u0ba4", + "\u0ba8"-"\u0baa", + "\u0bae"-"\u0bb5", + "\u0bb7"-"\u0bb9", + "\u0bbe"-"\u0bc2", + "\u0bc6"-"\u0bc8", + "\u0bca"-"\u0bcd", + "\u0bd7", + "\u0be7"-"\u0bef", + "\u0c01"-"\u0c03", + "\u0c05"-"\u0c0c", + "\u0c0e"-"\u0c10", + "\u0c12"-"\u0c28", + "\u0c2a"-"\u0c33", + "\u0c35"-"\u0c39", + "\u0c3e"-"\u0c44", + "\u0c46"-"\u0c48", + "\u0c4a"-"\u0c4d", + "\u0c55"-"\u0c56", + "\u0c60"-"\u0c61", + "\u0c66"-"\u0c6f", + "\u0c82"-"\u0c83", + "\u0c85"-"\u0c8c", + "\u0c8e"-"\u0c90", + "\u0c92"-"\u0ca8", + "\u0caa"-"\u0cb3", + "\u0cb5"-"\u0cb9", + "\u0cbe"-"\u0cc4", + "\u0cc6"-"\u0cc8", + "\u0cca"-"\u0ccd", + "\u0cd5"-"\u0cd6", + "\u0cde", + "\u0ce0"-"\u0ce1", + "\u0ce6"-"\u0cef", + "\u0d02"-"\u0d03", + "\u0d05"-"\u0d0c", + "\u0d0e"-"\u0d10", + "\u0d12"-"\u0d28", + "\u0d2a"-"\u0d39", + "\u0d3e"-"\u0d43", + "\u0d46"-"\u0d48", + "\u0d4a"-"\u0d4d", + "\u0d57", + "\u0d60"-"\u0d61", + "\u0d66"-"\u0d6f", + "\u0d82"-"\u0d83", + "\u0d85"-"\u0d96", + "\u0d9a"-"\u0db1", + "\u0db3"-"\u0dbb", + "\u0dbd", + "\u0dc0"-"\u0dc6", + "\u0dca", + "\u0dcf"-"\u0dd4", + "\u0dd6", + "\u0dd8"-"\u0ddf", + "\u0df2"-"\u0df3", + "\u0e01"-"\u0e3a", + "\u0e3f"-"\u0e4e", + "\u0e50"-"\u0e59", + "\u0e81"-"\u0e82", + "\u0e84", + "\u0e87"-"\u0e88", + "\u0e8a", + "\u0e8d", + "\u0e94"-"\u0e97", + "\u0e99"-"\u0e9f", + "\u0ea1"-"\u0ea3", + "\u0ea5", + "\u0ea7", + "\u0eaa"-"\u0eab", + "\u0ead"-"\u0eb9", + "\u0ebb"-"\u0ebd", + "\u0ec0"-"\u0ec4", + "\u0ec6", + "\u0ec8"-"\u0ecd", + "\u0ed0"-"\u0ed9", + "\u0edc"-"\u0edd", + "\u0f00", + "\u0f18"-"\u0f19", + "\u0f20"-"\u0f29", + "\u0f35", + "\u0f37", + "\u0f39", + "\u0f3e"-"\u0f47", + "\u0f49"-"\u0f6a", + "\u0f71"-"\u0f84", + "\u0f86"-"\u0f8b", + "\u0f90"-"\u0f97", + "\u0f99"-"\u0fbc", + "\u0fc6", + "\u1000"-"\u1021", + "\u1023"-"\u1027", + "\u1029"-"\u102a", + "\u102c"-"\u1032", + "\u1036"-"\u1039", + "\u1040"-"\u1049", + "\u1050"-"\u1059", + "\u10a0"-"\u10c5", + "\u10d0"-"\u10f6", + "\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", + "\u1369"-"\u1371", + "\u13a0"-"\u13f4", + "\u1401"-"\u166c", + "\u166f"-"\u1676", + "\u1681"-"\u169a", + "\u16a0"-"\u16ea", + "\u1780"-"\u17d3", + "\u17db", + "\u17e0"-"\u17e9", + "\u180b"-"\u180e", + "\u1810"-"\u1819", + "\u1820"-"\u1877", + "\u1880"-"\u18a9", + "\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", + "\u200c"-"\u200f", + "\u202a"-"\u202e", + "\u203f"-"\u2040", + "\u206a"-"\u206f", + "\u207f", + "\u20a0"-"\u20af", + "\u20d0"-"\u20dc", + "\u20e1", + "\u2102", + "\u2107", + "\u210a"-"\u2113", + "\u2115", + "\u2119"-"\u211d", + "\u2124", + "\u2126", + "\u2128", + "\u212a"-"\u212d", + "\u212f"-"\u2131", + "\u2133"-"\u2139", + "\u2160"-"\u2183", + "\u3005"-"\u3007", + "\u3021"-"\u302f", + "\u3031"-"\u3035", + "\u3038"-"\u303a", + "\u3041"-"\u3094", + "\u3099"-"\u309a", + "\u309d"-"\u309e", + "\u30a1"-"\u30fe", + "\u3105"-"\u312c", + "\u3131"-"\u318e", + "\u31a0"-"\u31b7", + "\u3400"-"\u4db5", + "\u4e00"-"\u9fa5", + "\ua000"-"\ua48c", + "\uac00"-"\ud7a3", + "\uf900"-"\ufa2d", + "\ufb00"-"\ufb06", + "\ufb13"-"\ufb17", + "\ufb1d"-"\ufb28", + "\ufb2a"-"\ufb36", + "\ufb38"-"\ufb3c", + "\ufb3e", + "\ufb40"-"\ufb41", + "\ufb43"-"\ufb44", + "\ufb46"-"\ufbb1", + "\ufbd3"-"\ufd3d", + "\ufd50"-"\ufd8f", + "\ufd92"-"\ufdc7", + "\ufdf0"-"\ufdfb", + "\ufe20"-"\ufe23", + "\ufe33"-"\ufe34", + "\ufe4d"-"\ufe4f", + "\ufe69", + "\ufe70"-"\ufe72", + "\ufe74", + "\ufe76"-"\ufefc", + "\ufeff", + "\uff04", + "\uff10"-"\uff19", + "\uff21"-"\uff3a", + "\uff3f", + "\uff41"-"\uff5a", + "\uff65"-"\uffbe", + "\uffc2"-"\uffc7", + "\uffca"-"\uffcf", + "\uffd2"-"\uffd7", + "\uffda"-"\uffdc", + "\uffe0"-"\uffe1", + "\uffe5"-"\uffe6", + "\ufff9"-"\ufffb" + ] + > +} + +/* SEPARATORS */ + +TOKEN : +{ + < LPAREN: "(" > +| < RPAREN: ")" > +| < LBRACE: "{" > +| < RBRACE: "}" > +| < LBRACKET: "[" > +| < RBRACKET: "]" > +| < SEMICOLON: ";" > +| < COMMA: "," > +| < DOT: "." > +} + +/* OPERATORS */ + +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: ">>>=" > +} + + +/***************************************** + * THE JAVA LANGUAGE GRAMMAR STARTS HERE * + *****************************************/ + +/* + * Program structuring syntax follows. + */ + +void CompilationUnit() : +{} +{ + [ PackageDeclaration() ] + ( ImportDeclaration() )* + ( TypeDeclaration() )* + +} + +void PackageDeclaration() : +{} +{ + "package" Name() ";" +} + +void ImportDeclaration() : +{} +{ + "import" Name() [ "." "*" ] ";" +} + +void TypeDeclaration() : +{} +{ + LOOKAHEAD( ( "abstract" | "final" | "public" )* "class" ) + ClassDeclaration() +| + InterfaceDeclaration() +| + ";" +} + + +/* + * Declaration syntax follows. + */ + +void ClassDeclaration() : +{} +{ + ( "abstract" | "final" | "public" )* + UnmodifiedClassDeclaration() +} + +void UnmodifiedClassDeclaration() : +{} +{ + "class" [ "extends" Name() ] [ "implements" NameList() ] + ClassBody() +} + +void ClassBody() : +{} +{ + "{" ( ClassBodyDeclaration() )* "}" +} + +void NestedClassDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedClassDeclaration() +} + +void ClassBodyDeclaration() : +{} +{ + LOOKAHEAD(2) + Initializer() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( [ "public" | "protected" | "private" ] Name() "(" ) + ConstructorDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +// This production is to determine lookahead only. +void MethodDeclarationLookahead() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() "(" +} + +void InterfaceDeclaration() : +{} +{ + ( "abstract" | "public" )* + UnmodifiedInterfaceDeclaration() +} + +void NestedInterfaceDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedInterfaceDeclaration() +} + +void UnmodifiedInterfaceDeclaration() : +{} +{ + "interface" [ "extends" NameList() ] + "{" ( InterfaceMemberDeclaration() )* "}" +} + +void InterfaceMemberDeclaration() : +{} +{ + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +void FieldDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "final" | "transient" | "volatile" )* + Type() VariableDeclarator() ( "," VariableDeclarator() )* ";" +} + +void VariableDeclarator() : +{} +{ + VariableDeclaratorId() [ "=" VariableInitializer() ] +} + +void VariableDeclaratorId() : +{} +{ + ( "[" "]" )* +} + +void VariableInitializer() : +{} +{ + ArrayInitializer() +| + Expression() +} + +void ArrayInitializer() : +{} +{ + "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}" +} + +void MethodDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() MethodDeclarator() [ "throws" NameList() ] + ( Block() | ";" ) +} + +void MethodDeclarator() : +{} +{ + FormalParameters() ( "[" "]" )* +} + +void FormalParameters() : +{} +{ + "(" [ FormalParameter() ( "," FormalParameter() )* ] ")" +} + +void FormalParameter() : +{} +{ + [ "final" ] Type() VariableDeclaratorId() +} + +void ConstructorDeclaration() : +{} +{ + [ "public" | "protected" | "private" ] + FormalParameters() [ "throws" NameList() ] + "{" + [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ] + ( BlockStatement() )* + "}" +} + +void ExplicitConstructorInvocation() : +{} +{ + LOOKAHEAD("this" Arguments() ";") + "this" Arguments() ";" +| + [ LOOKAHEAD(2) PrimaryExpression() "." ] "super" Arguments() ";" +} + +void Initializer() : +{} +{ + [ "static" ] Block() +} + + +/* + * Type, name and expression syntax follows. + */ + +void Type() : +{} +{ + ( PrimitiveType() | Name() ) ( "[" "]" )* +} + +void PrimitiveType() : +{} +{ + "boolean" +| + "char" +| + "byte" +| + "short" +| + "int" +| + "long" +| + "float" +| + "double" +} + +void ResultType() : +{} +{ + "void" +| + Type() +} + +void Name() : +/* + * A lookahead of 2 is required below since "Name" can be followed + * by a ".*" when used in the context of an "ImportDeclaration". + */ +{} +{ + + ( LOOKAHEAD(2) "." + )* +} + +void NameList() : +{} +{ + Name() + ( "," Name() + )* +} + + +/* + * Expression syntax follows. + */ + +void Expression() : +/* + * This expansion has been written this way instead of: + * Assignment() | ConditionalExpression() + * for performance reasons. + * However, it is a weakening of the grammar for it allows the LHS of + * assignments to be any conditional expression whereas it can only be + * a primary expression. Consider adding a semantic predicate to work + * around this. + */ +{} +{ + ConditionalExpression() + [ + AssignmentOperator() Expression() + ] +} + +void AssignmentOperator() : +{} +{ + "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" +} + +void ConditionalExpression() : +{} +{ + ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() ] +} + +void ConditionalOrExpression() : +{} +{ + ConditionalAndExpression() ( "||" ConditionalAndExpression() )* +} + +void ConditionalAndExpression() : +{} +{ + InclusiveOrExpression() ( "&&" InclusiveOrExpression() )* +} + +void InclusiveOrExpression() : +{} +{ + ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )* +} + +void ExclusiveOrExpression() : +{} +{ + AndExpression() ( "^" AndExpression() )* +} + +void AndExpression() : +{} +{ + EqualityExpression() ( "&" EqualityExpression() )* +} + +void EqualityExpression() : +{} +{ + InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )* +} + +void InstanceOfExpression() : +{} +{ + RelationalExpression() [ "instanceof" Type() ] +} + +void RelationalExpression() : +{} +{ + ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )* +} + +void ShiftExpression() : +{} +{ + AdditiveExpression() ( ( "<<" | ">>" | ">>>" ) AdditiveExpression() )* +} + +void AdditiveExpression() : +{} +{ + MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )* +} + +void MultiplicativeExpression() : +{} +{ + UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )* +} + +void UnaryExpression() : +{} +{ + ( "+" | "-" ) UnaryExpression() +| + PreIncrementExpression() +| + PreDecrementExpression() +| + UnaryExpressionNotPlusMinus() +} + +void PreIncrementExpression() : +{} +{ + "++" PrimaryExpression() +} + +void PreDecrementExpression() : +{} +{ + "--" PrimaryExpression() +} + +void UnaryExpressionNotPlusMinus() : +{} +{ + ( "~" | "!" ) UnaryExpression() +| + LOOKAHEAD( CastLookahead() ) + CastExpression() +| + PostfixExpression() +} + +// This production is to determine lookahead only. The LOOKAHEAD specifications +// below are not used, but they are there just to indicate that we know about +// this. +void CastLookahead() : +{} +{ + LOOKAHEAD(2) + "(" PrimitiveType() +| + LOOKAHEAD("(" Name() "[") + "(" Name() "[" "]" +| + "(" Name() ")" ( "~" | "!" | "(" | | "this" | "super" | "new" | Literal() ) +} + +void PostfixExpression() : +{} +{ + PrimaryExpression() [ "++" | "--" ] +} + +void CastExpression() : +{} +{ + LOOKAHEAD("(" PrimitiveType()) + "(" Type() ")" UnaryExpression() +| + "(" Type() ")" UnaryExpressionNotPlusMinus() +} + +void PrimaryExpression() : +{} +{ + PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* +} + +void PrimaryPrefix() : +{} +{ + Literal() +| + "this" +| + "super" "." +| + "(" Expression() ")" +| + AllocationExpression() +| + LOOKAHEAD( ResultType() "." "class" ) + ResultType() "." "class" +| + Name() +} + +void PrimarySuffix() : +{} +{ + LOOKAHEAD(2) + "." "this" +| + LOOKAHEAD(2) + "." AllocationExpression() +| + "[" Expression() "]" +| + "." +| + Arguments() +} + +void Literal() : +{} +{ + +| + +| + +| + +| + BooleanLiteral() +| + NullLiteral() +} + +void BooleanLiteral() : +{} +{ + "true" +| + "false" +} + +void NullLiteral() : +{} +{ + "null" +} + +void Arguments() : +{} +{ + "(" [ ArgumentList() ] ")" +} + +void ArgumentList() : +{} +{ + Expression() ( "," Expression() )* +} + +void AllocationExpression() : +{} +{ + LOOKAHEAD(2) + "new" PrimitiveType() ArrayDimsAndInits() +| + "new" Name() + ( + ArrayDimsAndInits() + | + Arguments() [ ClassBody() ] + ) +} + +/* + * The third LOOKAHEAD specification below is to parse to PrimarySuffix + * if there is an expression between the "[...]". + */ +void ArrayDimsAndInits() : +{} +{ + LOOKAHEAD(2) + ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )* +| + ( "[" "]" )+ ArrayInitializer() +} + + +/* + * Statement syntax follows. + */ + +void Statement() : +{} +{ + LOOKAHEAD(2) + LabeledStatement() +| + Block() +| + EmptyStatement() +| + StatementExpression() ";" +| + SwitchStatement() +| + IfStatement() +| + WhileStatement() +| + DoStatement() +| + ForStatement() +| + BreakStatement() +| + ContinueStatement() +| + ReturnStatement() +| + ThrowStatement() +| + SynchronizedStatement() +| + TryStatement() +} + +void LabeledStatement() : +{} +{ + ":" Statement() +} + +void Block() : +{} +{ + "{" ( BlockStatement() )* "}" +} + +void BlockStatement() : +{} +{ + LOOKAHEAD([ "final" ] Type() ) + LocalVariableDeclaration() ";" +| + Statement() +| + UnmodifiedClassDeclaration() +| + UnmodifiedInterfaceDeclaration() +} + +void LocalVariableDeclaration() : +{} +{ + [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )* +} + +void EmptyStatement() : +{} +{ + ";" +} + +void StatementExpression() : +/* + * The last expansion of this production accepts more than the legal + * Java expansions for StatementExpression. This expansion does not + * use PostfixExpression for performance reasons. + */ +{} +{ + PreIncrementExpression() +| + PreDecrementExpression() +| + PrimaryExpression() + [ + "++" + | + "--" + | + AssignmentOperator() Expression() + ] +} + +void SwitchStatement() : +{} +{ + "switch" "(" Expression() ")" "{" + ( SwitchLabel() ( BlockStatement() )* )* + "}" +} + +void SwitchLabel() : +{} +{ + "case" Expression() ":" +| + "default" ":" +} + +void IfStatement() : +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +{} +{ + "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] +} + +void WhileStatement() : +{} +{ + "while" "(" Expression() ")" Statement() +} + +void DoStatement() : +{} +{ + "do" Statement() "while" "(" Expression() ")" ";" +} + +void ForStatement() : +{} +{ + "for" "(" [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ] ")" Statement() +} + +void ForInit() : +{} +{ + LOOKAHEAD( [ "final" ] Type() ) + LocalVariableDeclaration() +| + StatementExpressionList() +} + +void StatementExpressionList() : +{} +{ + StatementExpression() ( "," StatementExpression() )* +} + +void ForUpdate() : +{} +{ + StatementExpressionList() +} + +void BreakStatement() : +{} +{ + "break" [ ] ";" +} + +void ContinueStatement() : +{} +{ + "continue" [ ] ";" +} + +void ReturnStatement() : +{} +{ + "return" [ Expression() ] ";" +} + +void ThrowStatement() : +{} +{ + "throw" Expression() ";" +} + +void SynchronizedStatement() : +{} +{ + "synchronized" "(" Expression() ")" Block() +} + +void TryStatement() : +/* + * Semantic check required here to make sure that at least one + * finally/catch is present. + */ +{} +{ + "try" Block() + ( "catch" "(" FormalParameter() ")" Block() )* + [ "finally" Block() ] +} diff --git a/javacc/examples/Java1.1.jjt b/javacc/examples/Java1.1.jjt new file mode 100644 index 0000000000..ed25de0e11 --- /dev/null +++ b/javacc/examples/Java1.1.jjt @@ -0,0 +1,1072 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + JAVA_UNICODE_ESCAPE = true; + + STATIC=false; + MULTI=true; + VISITOR=true; + NODE_USES_PARSER=true; + NODE_FACTORY = true; +} + +PARSER_BEGIN(JavaParser) + +//package VTransformer; + +public class JavaParser {} + +PARSER_END(JavaParser) + + +/* WHITE SPACE */ + +SPECIAL_TOKEN : +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* COMMENTS */ + +MORE : +{ + "//" : IN_SINGLE_LINE_COMMENT +| + <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT +| + "/*" : IN_MULTI_LINE_COMMENT +} + + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +MORE : +{ + < ~[] > +} + +/* RESERVED WORDS AND LITERALS */ + +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" > +} + +/* LITERALS */ + +TOKEN : +{ + < INTEGER_LITERAL: + (["l","L"])? + | (["l","L"])? + | (["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"])* ()? (["f","F","d","D"])? + | "." (["0"-"9"])+ ()? (["f","F","d","D"])? + | (["0"-"9"])+ (["f","F","d","D"])? + | (["0"-"9"])+ ()? ["f","F","d","D"] + > +| + < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > +| + < CHARACTER_LITERAL: + "'" + ( (~["'","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + ) + "'" + > +| + < STRING_LITERAL: + "\"" + ( (~["\"","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + )* + "\"" + > +} + +/* IDENTIFIERS */ + +TOKEN : +{ + < IDENTIFIER: (|)* > +| + < #LETTER: + [ + "\u0024", + "\u0041"-"\u005a", + "\u005f", + "\u0061"-"\u007a", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u00ff", + "\u0100"-"\u1fff", + "\u3040"-"\u318f", + "\u3300"-"\u337f", + "\u3400"-"\u3d2d", + "\u4e00"-"\u9fff", + "\uf900"-"\ufaff" + ] + > +| + < #DIGIT: + [ + "\u0030"-"\u0039", + "\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" + ] + > +} + +/* SEPARATORS */ + +TOKEN : +{ + < LPAREN: "(" > +| < RPAREN: ")" > +| < LBRACE: "{" > +| < RBRACE: "}" > +| < LBRACKET: "[" > +| < RBRACKET: "]" > +| < SEMICOLON: ";" > +| < COMMA: "," > +| < DOT: "." > +} + +/* OPERATORS */ + +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: ">>>=" > +} + + +/***************************************** + * THE JAVA LANGUAGE GRAMMAR STARTS HERE * + *****************************************/ + +/* + * Program structuring syntax follows. + */ + +ASTCompilationUnit CompilationUnit() : +{} +{ + [ PackageDeclaration() ] + ( ImportDeclaration() )* + ( TypeDeclaration() )* + + { + return jjtThis; + } +} + +void PackageDeclaration() : +{} +{ + "package" Name() ";" +} + +void ImportDeclaration() : +{} +{ + "import" Name() [ "." "*" ] ";" +} + +void TypeDeclaration() : +{} +{ + LOOKAHEAD( ( "abstract" | "final" | "public" )* "class" ) + ClassDeclaration() +| + InterfaceDeclaration() +| + ";" +} + + +/* + * Declaration syntax follows. + */ + +void ClassDeclaration() : +{} +{ + ( "abstract" | "final" | "public" )* + UnmodifiedClassDeclaration() +} + +void UnmodifiedClassDeclaration() : +{} +{ + "class" [ "extends" Name() ] [ "implements" NameList() ] + ClassBody() +} + +void ClassBody() : +{} +{ + "{" ( ClassBodyDeclaration() )* "}" +} + +void NestedClassDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedClassDeclaration() +} + +void ClassBodyDeclaration() : +{} +{ + LOOKAHEAD(2) + Initializer() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( [ "public" | "protected" | "private" ] Name() "(" ) + ConstructorDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +// This production is to determine lookahead only. +void MethodDeclarationLookahead() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() "(" +} + +void InterfaceDeclaration() : +{} +{ + ( "abstract" | "public" )* + UnmodifiedInterfaceDeclaration() +} + +void NestedInterfaceDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedInterfaceDeclaration() +} + +void UnmodifiedInterfaceDeclaration() : +{} +{ + "interface" [ "extends" NameList() ] + "{" ( InterfaceMemberDeclaration() )* "}" +} + +void InterfaceMemberDeclaration() : +{} +{ + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +void FieldDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "final" | "transient" | "volatile" )* + Type() VariableDeclarator() ( "," VariableDeclarator() )* ";" +} + +void VariableDeclarator() : +{} +{ + VariableDeclaratorId() [ "=" VariableInitializer() ] +} + +void VariableDeclaratorId() : +{} +{ + ( "[" "]" )* +} + +void VariableInitializer() : +{} +{ + ArrayInitializer() +| + Expression() +} + +void ArrayInitializer() : +{} +{ + "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}" +} + +void MethodDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() MethodDeclarator() [ "throws" NameList() ] + ( Block() | ";" ) +} + +void MethodDeclarator() : +{} +{ + FormalParameters() ( "[" "]" )* +} + +void FormalParameters() : +{} +{ + "(" [ FormalParameter() ( "," FormalParameter() )* ] ")" +} + +void FormalParameter() : +{} +{ + [ "final" ] Type() VariableDeclaratorId() +} + +void ConstructorDeclaration() : +{} +{ + [ "public" | "protected" | "private" ] + FormalParameters() [ "throws" NameList() ] + "{" + [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ] + ( BlockStatement() )* + "}" +} + +void ExplicitConstructorInvocation() : +{} +{ + LOOKAHEAD("this" Arguments() ";") + "this" Arguments() ";" +| + [ LOOKAHEAD(2) PrimaryExpression() "." ] "super" Arguments() ";" +} + +void Initializer() : +{} +{ + [ "static" ] Block() +} + + +/* + * Type, name and expression syntax follows. + */ + +void Type() : +{} +{ + ( PrimitiveType() | Name() ) ( "[" "]" )* +} + +void PrimitiveType() : +{} +{ + "boolean" +| + "char" +| + "byte" +| + "short" +| + "int" +| + "long" +| + "float" +| + "double" +} + +void ResultType() : +{} +{ + "void" +| + Type() +} + +void Name() : +/* + * A lookahead of 2 is required below since "Name" can be followed + * by a ".*" when used in the context of an "ImportDeclaration". + */ +{} +{ + + ( LOOKAHEAD(2) "." + )* +} + +void NameList() : +{} +{ + Name() + ( "," Name() + )* +} + + +/* + * Expression syntax follows. + */ + +void Expression() : +/* + * This expansion has been written this way instead of: + * Assignment() | ConditionalExpression() + * for performance reasons. + * However, it is a weakening of the grammar for it allows the LHS of + * assignments to be any conditional expression whereas it can only be + * a primary expression. Consider adding a semantic predicate to work + * around this. + */ +{} +{ + ConditionalExpression() + [ + AssignmentOperator() Expression() + ] +} + +void AssignmentOperator() : +{} +{ + "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" +} + +void ConditionalExpression() : +{} +{ + ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() ] +} + +void ConditionalOrExpression() : +{} +{ + ConditionalAndExpression() ( "||" ConditionalAndExpression() )* +} + +void ConditionalAndExpression() : +{} +{ + InclusiveOrExpression() ( "&&" InclusiveOrExpression() )* +} + +void InclusiveOrExpression() : +{} +{ + ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )* +} + +void ExclusiveOrExpression() : +{} +{ + AndExpression() ( "^" AndExpression() )* +} + +void AndExpression() : +{} +{ + EqualityExpression() ( "&" EqualityExpression() )* +} + +void EqualityExpression() : +{} +{ + InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )* +} + +void InstanceOfExpression() : +{} +{ + RelationalExpression() [ "instanceof" Type() ] +} + +void RelationalExpression() : +{} +{ + ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )* +} + +void ShiftExpression() : +{} +{ + AdditiveExpression() ( ( "<<" | ">>" | ">>>" ) AdditiveExpression() )* +} + +void AdditiveExpression() : +{} +{ + MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )* +} + +void MultiplicativeExpression() : +{} +{ + UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )* +} + +void UnaryExpression() : +{} +{ + ( "+" | "-" ) UnaryExpression() +| + PreIncrementExpression() +| + PreDecrementExpression() +| + UnaryExpressionNotPlusMinus() +} + +void PreIncrementExpression() : +{} +{ + "++" PrimaryExpression() +} + +void PreDecrementExpression() : +{} +{ + "--" PrimaryExpression() +} + +void UnaryExpressionNotPlusMinus() : +{} +{ + ( "~" | "!" ) UnaryExpression() +| + LOOKAHEAD( CastLookahead() ) + CastExpression() +| + PostfixExpression() +} + +// This production is to determine lookahead only. The LOOKAHEAD specifications +// below are not used, but they are there just to indicate that we know about +// this. +void CastLookahead() : +{} +{ + LOOKAHEAD(2) + "(" PrimitiveType() +| + LOOKAHEAD("(" Name() "[") + "(" Name() "[" "]" +| + "(" Name() ")" ( "~" | "!" | "(" | | "this" | "super" | "new" | Literal() ) +} + +void PostfixExpression() : +{} +{ + PrimaryExpression() [ "++" | "--" ] +} + +void CastExpression() : +{} +{ + LOOKAHEAD("(" PrimitiveType()) + "(" Type() ")" UnaryExpression() +| + LOOKAHEAD("(" Name()) + "(" Type() ")" UnaryExpressionNotPlusMinus() +} + +void PrimaryExpression() : +{} +{ + PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* +} + +void PrimaryPrefix() : +{} +{ + Literal() +| + "this" +| + "super" "." +| + "(" Expression() ")" +| + AllocationExpression() +| + LOOKAHEAD( ResultType() "." "class" ) + ResultType() "." "class" +| + Name() +} + +void PrimarySuffix() : +{} +{ + LOOKAHEAD(2) + "." "this" +| + LOOKAHEAD(2) + "." AllocationExpression() +| + "[" Expression() "]" +| + "." +| + Arguments() +} + +void Literal() : +{} +{ + +| + +| + +| + +| + BooleanLiteral() +| + NullLiteral() +} + +void BooleanLiteral() : +{} +{ + "true" +| + "false" +} + +void NullLiteral() : +{} +{ + "null" +} + +void Arguments() : +{} +{ + "(" [ ArgumentList() ] ")" +} + +void ArgumentList() : +{} +{ + Expression() ( "," Expression() )* +} + +void AllocationExpression() : +{} +{ + LOOKAHEAD(2) + "new" PrimitiveType() ArrayDimsAndInits() +| + "new" Name() + ( + ArrayDimsAndInits() + | + Arguments() [ ClassBody() ] + ) +} + +/* + * The second LOOKAHEAD specification below is to parse to PrimarySuffix + * if there is an expression between the "[...]". + */ +void ArrayDimsAndInits() : +{} +{ + LOOKAHEAD(2) + ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )* +| + ( "[" "]" )+ ArrayInitializer() +} + + +/* + * Statement syntax follows. + */ + +void Statement() : +{} +{ + LOOKAHEAD(2) + LabeledStatement() +| + Block() +| + EmptyStatement() +| + StatementExpression() ";" +| + SwitchStatement() +| + IfStatement() +| + WhileStatement() +| + DoStatement() +| + ForStatement() +| + BreakStatement() +| + ContinueStatement() +| + ReturnStatement() +| + ThrowStatement() +| + SynchronizedStatement() +| + TryStatement() +} + +void LabeledStatement() : +{} +{ + ":" Statement() +} + +void Block() : +{} +{ + "{" ( BlockStatement() )* "}" +} + +void BlockStatement() : +{} +{ + LOOKAHEAD([ "final" ] Type() ) + LocalVariableDeclaration() ";" +| + Statement() +| + UnmodifiedClassDeclaration() +} + +void LocalVariableDeclaration() : +{} +{ + [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )* +} + +void EmptyStatement() : +{} +{ + ";" +} + +void StatementExpression() : +/* + * The last expansion of this production accepts more than the legal + * Java expansions for StatementExpression. This expansion does not + * use PostfixExpression for performance reasons. + */ +{} +{ + PreIncrementExpression() +| + PreDecrementExpression() +| + PrimaryExpression() + [ + "++" + | + "--" + | + AssignmentOperator() Expression() + ] +} + +void SwitchStatement() : +{} +{ + "switch" "(" Expression() ")" "{" + ( SwitchLabel() ( BlockStatement() )* )* + "}" +} + +void SwitchLabel() : +{} +{ + "case" Expression() ":" +| + "default" ":" +} + +void IfStatement() : +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +{} +{ + "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] +} + +void WhileStatement() : +{} +{ + "while" "(" Expression() ")" Statement() +} + +void DoStatement() : +{} +{ + "do" Statement() "while" "(" Expression() ")" ";" +} + +void ForStatement() : +{} +{ + "for" "(" [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ] ")" Statement() +} + +void ForInit() : +{} +{ + LOOKAHEAD( [ "final" ] Type() ) + LocalVariableDeclaration() +| + StatementExpressionList() +} + +void StatementExpressionList() : +{} +{ + StatementExpression() ( "," StatementExpression() )* +} + +void ForUpdate() : +{} +{ + StatementExpressionList() +} + +void BreakStatement() : +{} +{ + "break" [ ] ";" +} + +void ContinueStatement() : +{} +{ + "continue" [ ] ";" +} + +void ReturnStatement() : +{} +{ + "return" [ Expression() ] ";" +} + +void ThrowStatement() : +{} +{ + "throw" Expression() ";" +} + +void SynchronizedStatement() : +{} +{ + "synchronized" "(" Expression() ")" Block() +} + +void TryStatement() : +/* + * Semantic check required here to make sure that at least one + * finally/catch is present. + */ +{} +{ + "try" Block() + ( "catch" "(" FormalParameter() ")" Block() )* + [ "finally" Block() ] +} diff --git a/javacc/examples/Java1.5.jj b/javacc/examples/Java1.5.jj new file mode 100644 index 0000000000..28e40cb3ac --- /dev/null +++ b/javacc/examples/Java1.5.jj @@ -0,0 +1,2113 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +options { + JAVA_UNICODE_ESCAPE = true; + ERROR_REPORTING = false; + STATIC = false; + COMMON_TOKEN_ACTION = false; + TOKEN_FACTORY = "MyToken"; + JDK_VERSION = "1.5"; +} + +PARSER_BEGIN(JavaParser) + +import java.io.*; + +/** + * Grammar to parse Java version 1.5 + * @author Sreenivasa Viswanadha - Simplified and enhanced for 1.5 + */ +public class JavaParser +{ + /** + * Class to hold modifiers. + */ + static public final class ModifierSet + { + /* Definitions of the bits in the modifiers field. */ + public static final int PUBLIC = 0x0001; + public static final int PROTECTED = 0x0002; + public static final int PRIVATE = 0x0004; + public static final int ABSTRACT = 0x0008; + public static final int STATIC = 0x0010; + public static final int FINAL = 0x0020; + public static final int SYNCHRONIZED = 0x0040; + public static final int NATIVE = 0x0080; + public static final int TRANSIENT = 0x0100; + public static final int VOLATILE = 0x0200; + public static final int STRICTFP = 0x1000; + + /** A set of accessors that indicate whether the specified modifier + is in the set. */ + + public boolean isPublic(int modifiers) + { + return (modifiers & PUBLIC) != 0; + } + + public boolean isProtected(int modifiers) + { + return (modifiers & PROTECTED) != 0; + } + + public boolean isPrivate(int modifiers) + { + return (modifiers & PRIVATE) != 0; + } + + public boolean isStatic(int modifiers) + { + return (modifiers & STATIC) != 0; + } + + public boolean isAbstract(int modifiers) + { + return (modifiers & ABSTRACT) != 0; + } + + public boolean isFinal(int modifiers) + { + return (modifiers & FINAL) != 0; + } + + public boolean isNative(int modifiers) + { + return (modifiers & NATIVE) != 0; + } + + public boolean isStrictfp(int modifiers) + { + return (modifiers & STRICTFP) != 0; + } + + public boolean isSynchronized(int modifiers) + { + return (modifiers & SYNCHRONIZED) != 0; + } + + public boolean isTransient(int modifiers) + { + return (modifiers & TRANSIENT) != 0; + } + + public boolean isVolatile(int modifiers) + { + return (modifiers & VOLATILE) != 0; + } + + /** + * Removes the given modifier. + */ + static int removeModifier(int modifiers, int mod) + { + return modifiers & ~mod; + } + } + + public JavaParser(String fileName) + { + this(System.in); + try { ReInit(new FileInputStream(new File(fileName))); } + catch(Exception e) { e.printStackTrace(); } + } + + public static void main(String args[]) { + JavaParser parser; + if (args.length == 0) { + System.out.println("Java Parser Version 1.1: Reading from standard input . . ."); + parser = new JavaParser(System.in); + } else if (args.length == 1) { + System.out.println("Java Parser Version 1.1: Reading from file " + args[0] + " . . ."); + try { + parser = new JavaParser(new java.io.FileInputStream(args[0])); + } catch (java.io.FileNotFoundException e) { + System.out.println("Java Parser Version 1.1: File " + args[0] + " not found."); + return; + } + } else { + System.out.println("Java Parser Version 1.1: Usage is one of:"); + System.out.println(" java JavaParser < inputfile"); + System.out.println("OR"); + System.out.println(" java JavaParser inputfile"); + return; + } + try { + parser.CompilationUnit(); + System.out.println("Java Parser Version 1.1: Java program parsed successfully."); + } catch (ParseException e) { + System.out.println(e.getMessage()); + System.out.println("Java Parser Version 1.1: Encountered errors during parse."); + } + } + +} + +PARSER_END(JavaParser) + +/* WHITE SPACE */ + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* COMMENTS */ + +MORE : +{ + <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT +| + "/*" : IN_MULTI_LINE_COMMENT +} + +SPECIAL_TOKEN : +{ + +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +MORE : +{ + < ~[] > +} + +/* RESERVED WORDS AND LITERALS */ + +TOKEN : +{ + < ABSTRACT: "abstract" > +| < ASSERT: "assert" > +| < 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" > +| < ENUM: "enum" > +| < 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" > +| < STRICTFP: "strictfp" > +| < SUPER: "super" > +| < SWITCH: "switch" > +| < SYNCHRONIZED: "synchronized" > +| < THIS: "this" > +| < THROW: "throw" > +| < THROWS: "throws" > +| < TRANSIENT: "transient" > +| < TRUE: "true" > +| < TRY: "try" > +| < VOID: "void" > +| < VOLATILE: "volatile" > +| < WHILE: "while" > +} + +/* LITERALS */ + +TOKEN : +{ + < INTEGER_LITERAL: + (["l","L"])? + | (["l","L"])? + | (["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: + + | + > +| + < #DECIMAL_FLOATING_POINT_LITERAL: + (["0"-"9"])+ "." (["0"-"9"])* ()? (["f","F","d","D"])? + | "." (["0"-"9"])+ ()? (["f","F","d","D"])? + | (["0"-"9"])+ (["f","F","d","D"])? + | (["0"-"9"])+ ()? ["f","F","d","D"] + > +| + < #DECIMAL_EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > +| + < #HEXADECIMAL_FLOATING_POINT_LITERAL: + "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])+ (".")? (["f","F","d","D"])? + | "0" ["x", "X"] (["0"-"9","a"-"f","A"-"F"])* "." (["0"-"9","a"-"f","A"-"F"])+ (["f","F","d","D"])? + > +| + < #HEXADECIMAL_EXPONENT: ["p","P"] (["+","-"])? (["0"-"9"])+ > +| + < CHARACTER_LITERAL: + "'" + ( (~["'","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + ) + "'" + > +| + < STRING_LITERAL: + "\"" + ( (~["\"","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + )* + "\"" + > +} + +/* IDENTIFIERS */ + +TOKEN : +{ + < IDENTIFIER: ()* > +| + < #LETTER: + [ // all chars for which Character.isIdentifierStart is true + "$", + "A"-"Z", + "_", + "a"-"z", + "\u00a2"-"\u00a5", + "\u00aa", + "\u00b5", + "\u00ba", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u021f", + "\u0222"-"\u0233", + "\u0250"-"\u02ad", + "\u02b0"-"\u02b8", + "\u02bb"-"\u02c1", + "\u02d0"-"\u02d1", + "\u02e0"-"\u02e4", + "\u02ee", + "\u037a", + "\u0386", + "\u0388"-"\u038a", + "\u038c", + "\u038e"-"\u03a1", + "\u03a3"-"\u03ce", + "\u03d0"-"\u03d7", + "\u03da"-"\u03f3", + "\u0400"-"\u0481", + "\u048c"-"\u04c4", + "\u04c7"-"\u04c8", + "\u04cb"-"\u04cc", + "\u04d0"-"\u04f5", + "\u04f8"-"\u04f9", + "\u0531"-"\u0556", + "\u0559", + "\u0561"-"\u0587", + "\u05d0"-"\u05ea", + "\u05f0"-"\u05f2", + "\u0621"-"\u063a", + "\u0640"-"\u064a", + "\u0671"-"\u06d3", + "\u06d5", + "\u06e5"-"\u06e6", + "\u06fa"-"\u06fc", + "\u0710", + "\u0712"-"\u072c", + "\u0780"-"\u07a5", + "\u0905"-"\u0939", + "\u093d", + "\u0950", + "\u0958"-"\u0961", + "\u0985"-"\u098c", + "\u098f"-"\u0990", + "\u0993"-"\u09a8", + "\u09aa"-"\u09b0", + "\u09b2", + "\u09b6"-"\u09b9", + "\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"-"\u0a8b", + "\u0a8d", + "\u0a8f"-"\u0a91", + "\u0a93"-"\u0aa8", + "\u0aaa"-"\u0ab0", + "\u0ab2"-"\u0ab3", + "\u0ab5"-"\u0ab9", + "\u0abd", + "\u0ad0", + "\u0ae0", + "\u0b05"-"\u0b0c", + "\u0b0f"-"\u0b10", + "\u0b13"-"\u0b28", + "\u0b2a"-"\u0b30", + "\u0b32"-"\u0b33", + "\u0b36"-"\u0b39", + "\u0b3d", + "\u0b5c"-"\u0b5d", + "\u0b5f"-"\u0b61", + "\u0b85"-"\u0b8a", + "\u0b8e"-"\u0b90", + "\u0b92"-"\u0b95", + "\u0b99"-"\u0b9a", + "\u0b9c", + "\u0b9e"-"\u0b9f", + "\u0ba3"-"\u0ba4", + "\u0ba8"-"\u0baa", + "\u0bae"-"\u0bb5", + "\u0bb7"-"\u0bb9", + "\u0c05"-"\u0c0c", + "\u0c0e"-"\u0c10", + "\u0c12"-"\u0c28", + "\u0c2a"-"\u0c33", + "\u0c35"-"\u0c39", + "\u0c60"-"\u0c61", + "\u0c85"-"\u0c8c", + "\u0c8e"-"\u0c90", + "\u0c92"-"\u0ca8", + "\u0caa"-"\u0cb3", + "\u0cb5"-"\u0cb9", + "\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"-"\u10f6", + "\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", + "\u1780"-"\u17b3", + "\u17db", + "\u1820"-"\u1877", + "\u1880"-"\u18a8", + "\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", + "\u207f", + "\u20a0"-"\u20af", + "\u2102", + "\u2107", + "\u210a"-"\u2113", + "\u2115", + "\u2119"-"\u211d", + "\u2124", + "\u2126", + "\u2128", + "\u212a"-"\u212d", + "\u212f"-"\u2131", + "\u2133"-"\u2139", + "\u2160"-"\u2183", + "\u3005"-"\u3007", + "\u3021"-"\u3029", + "\u3031"-"\u3035", + "\u3038"-"\u303a", + "\u3041"-"\u3094", + "\u309d"-"\u309e", + "\u30a1"-"\u30fe", + "\u3105"-"\u312c", + "\u3131"-"\u318e", + "\u31a0"-"\u31b7", + "\u3400"-"\u4db5", + "\u4e00"-"\u9fa5", + "\ua000"-"\ua48c", + "\uac00"-"\ud7a3", + "\uf900"-"\ufa2d", + "\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"-"\ufdfb", + "\ufe33"-"\ufe34", + "\ufe4d"-"\ufe4f", + "\ufe69", + "\ufe70"-"\ufe72", + "\ufe74", + "\ufe76"-"\ufefc", + "\uff04", + "\uff21"-"\uff3a", + "\uff3f", + "\uff41"-"\uff5a", + "\uff65"-"\uffbe", + "\uffc2"-"\uffc7", + "\uffca"-"\uffcf", + "\uffd2"-"\uffd7", + "\uffda"-"\uffdc", + "\uffe0"-"\uffe1", + "\uffe5"-"\uffe6" + ] + > +| + < #PART_LETTER: + [ // all chars for which Character.isIdentifierPart is true + "\u0000"-"\u0008", + "\u000e"-"\u001b", + "$", + "0"-"9", + "A"-"Z", + "_", + "a"-"z", + "\u007f"-"\u009f", + "\u00a2"-"\u00a5", + "\u00aa", + "\u00b5", + "\u00ba", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u021f", + "\u0222"-"\u0233", + "\u0250"-"\u02ad", + "\u02b0"-"\u02b8", + "\u02bb"-"\u02c1", + "\u02d0"-"\u02d1", + "\u02e0"-"\u02e4", + "\u02ee", + "\u0300"-"\u034e", + "\u0360"-"\u0362", + "\u037a", + "\u0386", + "\u0388"-"\u038a", + "\u038c", + "\u038e"-"\u03a1", + "\u03a3"-"\u03ce", + "\u03d0"-"\u03d7", + "\u03da"-"\u03f3", + "\u0400"-"\u0481", + "\u0483"-"\u0486", + "\u048c"-"\u04c4", + "\u04c7"-"\u04c8", + "\u04cb"-"\u04cc", + "\u04d0"-"\u04f5", + "\u04f8"-"\u04f9", + "\u0531"-"\u0556", + "\u0559", + "\u0561"-"\u0587", + "\u0591"-"\u05a1", + "\u05a3"-"\u05b9", + "\u05bb"-"\u05bd", + "\u05bf", + "\u05c1"-"\u05c2", + "\u05c4", + "\u05d0"-"\u05ea", + "\u05f0"-"\u05f2", + "\u0621"-"\u063a", + "\u0640"-"\u0655", + "\u0660"-"\u0669", + "\u0670"-"\u06d3", + "\u06d5"-"\u06dc", + "\u06df"-"\u06e8", + "\u06ea"-"\u06ed", + "\u06f0"-"\u06fc", + "\u070f"-"\u072c", + "\u0730"-"\u074a", + "\u0780"-"\u07b0", + "\u0901"-"\u0903", + "\u0905"-"\u0939", + "\u093c"-"\u094d", + "\u0950"-"\u0954", + "\u0958"-"\u0963", + "\u0966"-"\u096f", + "\u0981"-"\u0983", + "\u0985"-"\u098c", + "\u098f"-"\u0990", + "\u0993"-"\u09a8", + "\u09aa"-"\u09b0", + "\u09b2", + "\u09b6"-"\u09b9", + "\u09bc", + "\u09be"-"\u09c4", + "\u09c7"-"\u09c8", + "\u09cb"-"\u09cd", + "\u09d7", + "\u09dc"-"\u09dd", + "\u09df"-"\u09e3", + "\u09e6"-"\u09f3", + "\u0a02", + "\u0a05"-"\u0a0a", + "\u0a0f"-"\u0a10", + "\u0a13"-"\u0a28", + "\u0a2a"-"\u0a30", + "\u0a32"-"\u0a33", + "\u0a35"-"\u0a36", + "\u0a38"-"\u0a39", + "\u0a3c", + "\u0a3e"-"\u0a42", + "\u0a47"-"\u0a48", + "\u0a4b"-"\u0a4d", + "\u0a59"-"\u0a5c", + "\u0a5e", + "\u0a66"-"\u0a74", + "\u0a81"-"\u0a83", + "\u0a85"-"\u0a8b", + "\u0a8d", + "\u0a8f"-"\u0a91", + "\u0a93"-"\u0aa8", + "\u0aaa"-"\u0ab0", + "\u0ab2"-"\u0ab3", + "\u0ab5"-"\u0ab9", + "\u0abc"-"\u0ac5", + "\u0ac7"-"\u0ac9", + "\u0acb"-"\u0acd", + "\u0ad0", + "\u0ae0", + "\u0ae6"-"\u0aef", + "\u0b01"-"\u0b03", + "\u0b05"-"\u0b0c", + "\u0b0f"-"\u0b10", + "\u0b13"-"\u0b28", + "\u0b2a"-"\u0b30", + "\u0b32"-"\u0b33", + "\u0b36"-"\u0b39", + "\u0b3c"-"\u0b43", + "\u0b47"-"\u0b48", + "\u0b4b"-"\u0b4d", + "\u0b56"-"\u0b57", + "\u0b5c"-"\u0b5d", + "\u0b5f"-"\u0b61", + "\u0b66"-"\u0b6f", + "\u0b82"-"\u0b83", + "\u0b85"-"\u0b8a", + "\u0b8e"-"\u0b90", + "\u0b92"-"\u0b95", + "\u0b99"-"\u0b9a", + "\u0b9c", + "\u0b9e"-"\u0b9f", + "\u0ba3"-"\u0ba4", + "\u0ba8"-"\u0baa", + "\u0bae"-"\u0bb5", + "\u0bb7"-"\u0bb9", + "\u0bbe"-"\u0bc2", + "\u0bc6"-"\u0bc8", + "\u0bca"-"\u0bcd", + "\u0bd7", + "\u0be7"-"\u0bef", + "\u0c01"-"\u0c03", + "\u0c05"-"\u0c0c", + "\u0c0e"-"\u0c10", + "\u0c12"-"\u0c28", + "\u0c2a"-"\u0c33", + "\u0c35"-"\u0c39", + "\u0c3e"-"\u0c44", + "\u0c46"-"\u0c48", + "\u0c4a"-"\u0c4d", + "\u0c55"-"\u0c56", + "\u0c60"-"\u0c61", + "\u0c66"-"\u0c6f", + "\u0c82"-"\u0c83", + "\u0c85"-"\u0c8c", + "\u0c8e"-"\u0c90", + "\u0c92"-"\u0ca8", + "\u0caa"-"\u0cb3", + "\u0cb5"-"\u0cb9", + "\u0cbe"-"\u0cc4", + "\u0cc6"-"\u0cc8", + "\u0cca"-"\u0ccd", + "\u0cd5"-"\u0cd6", + "\u0cde", + "\u0ce0"-"\u0ce1", + "\u0ce6"-"\u0cef", + "\u0d02"-"\u0d03", + "\u0d05"-"\u0d0c", + "\u0d0e"-"\u0d10", + "\u0d12"-"\u0d28", + "\u0d2a"-"\u0d39", + "\u0d3e"-"\u0d43", + "\u0d46"-"\u0d48", + "\u0d4a"-"\u0d4d", + "\u0d57", + "\u0d60"-"\u0d61", + "\u0d66"-"\u0d6f", + "\u0d82"-"\u0d83", + "\u0d85"-"\u0d96", + "\u0d9a"-"\u0db1", + "\u0db3"-"\u0dbb", + "\u0dbd", + "\u0dc0"-"\u0dc6", + "\u0dca", + "\u0dcf"-"\u0dd4", + "\u0dd6", + "\u0dd8"-"\u0ddf", + "\u0df2"-"\u0df3", + "\u0e01"-"\u0e3a", + "\u0e3f"-"\u0e4e", + "\u0e50"-"\u0e59", + "\u0e81"-"\u0e82", + "\u0e84", + "\u0e87"-"\u0e88", + "\u0e8a", + "\u0e8d", + "\u0e94"-"\u0e97", + "\u0e99"-"\u0e9f", + "\u0ea1"-"\u0ea3", + "\u0ea5", + "\u0ea7", + "\u0eaa"-"\u0eab", + "\u0ead"-"\u0eb9", + "\u0ebb"-"\u0ebd", + "\u0ec0"-"\u0ec4", + "\u0ec6", + "\u0ec8"-"\u0ecd", + "\u0ed0"-"\u0ed9", + "\u0edc"-"\u0edd", + "\u0f00", + "\u0f18"-"\u0f19", + "\u0f20"-"\u0f29", + "\u0f35", + "\u0f37", + "\u0f39", + "\u0f3e"-"\u0f47", + "\u0f49"-"\u0f6a", + "\u0f71"-"\u0f84", + "\u0f86"-"\u0f8b", + "\u0f90"-"\u0f97", + "\u0f99"-"\u0fbc", + "\u0fc6", + "\u1000"-"\u1021", + "\u1023"-"\u1027", + "\u1029"-"\u102a", + "\u102c"-"\u1032", + "\u1036"-"\u1039", + "\u1040"-"\u1049", + "\u1050"-"\u1059", + "\u10a0"-"\u10c5", + "\u10d0"-"\u10f6", + "\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", + "\u1369"-"\u1371", + "\u13a0"-"\u13f4", + "\u1401"-"\u166c", + "\u166f"-"\u1676", + "\u1681"-"\u169a", + "\u16a0"-"\u16ea", + "\u1780"-"\u17d3", + "\u17db", + "\u17e0"-"\u17e9", + "\u180b"-"\u180e", + "\u1810"-"\u1819", + "\u1820"-"\u1877", + "\u1880"-"\u18a9", + "\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", + "\u200c"-"\u200f", + "\u202a"-"\u202e", + "\u203f"-"\u2040", + "\u206a"-"\u206f", + "\u207f", + "\u20a0"-"\u20af", + "\u20d0"-"\u20dc", + "\u20e1", + "\u2102", + "\u2107", + "\u210a"-"\u2113", + "\u2115", + "\u2119"-"\u211d", + "\u2124", + "\u2126", + "\u2128", + "\u212a"-"\u212d", + "\u212f"-"\u2131", + "\u2133"-"\u2139", + "\u2160"-"\u2183", + "\u3005"-"\u3007", + "\u3021"-"\u302f", + "\u3031"-"\u3035", + "\u3038"-"\u303a", + "\u3041"-"\u3094", + "\u3099"-"\u309a", + "\u309d"-"\u309e", + "\u30a1"-"\u30fe", + "\u3105"-"\u312c", + "\u3131"-"\u318e", + "\u31a0"-"\u31b7", + "\u3400"-"\u4db5", + "\u4e00"-"\u9fa5", + "\ua000"-"\ua48c", + "\uac00"-"\ud7a3", + "\uf900"-"\ufa2d", + "\ufb00"-"\ufb06", + "\ufb13"-"\ufb17", + "\ufb1d"-"\ufb28", + "\ufb2a"-"\ufb36", + "\ufb38"-"\ufb3c", + "\ufb3e", + "\ufb40"-"\ufb41", + "\ufb43"-"\ufb44", + "\ufb46"-"\ufbb1", + "\ufbd3"-"\ufd3d", + "\ufd50"-"\ufd8f", + "\ufd92"-"\ufdc7", + "\ufdf0"-"\ufdfb", + "\ufe20"-"\ufe23", + "\ufe33"-"\ufe34", + "\ufe4d"-"\ufe4f", + "\ufe69", + "\ufe70"-"\ufe72", + "\ufe74", + "\ufe76"-"\ufefc", + "\ufeff", + "\uff04", + "\uff10"-"\uff19", + "\uff21"-"\uff3a", + "\uff3f", + "\uff41"-"\uff5a", + "\uff65"-"\uffbe", + "\uffc2"-"\uffc7", + "\uffca"-"\uffcf", + "\uffd2"-"\uffd7", + "\uffda"-"\uffdc", + "\uffe0"-"\uffe1", + "\uffe5"-"\uffe6", + "\ufff9"-"\ufffb" + ] + > +} + +/* SEPARATORS */ + +TOKEN : +{ + < LPAREN: "(" > +| < RPAREN: ")" > +| < LBRACE: "{" > +| < RBRACE: "}" > +| < LBRACKET: "[" > +| < RBRACKET: "]" > +| < SEMICOLON: ";" > +| < COMMA: "," > +| < DOT: "." > +| < AT: "@" > +} + +/* OPERATORS */ + +TOKEN : +{ + < ASSIGN: "=" > +| < 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: "<<" > +| < PLUSASSIGN: "+=" > +| < MINUSASSIGN: "-=" > +| < STARASSIGN: "*=" > +| < SLASHASSIGN: "/=" > +| < ANDASSIGN: "&=" > +| < ORASSIGN: "|=" > +| < XORASSIGN: "^=" > +| < REMASSIGN: "%=" > +| < LSHIFTASSIGN: "<<=" > +| < RSIGNEDSHIFTASSIGN: ">>=" > +| < RUNSIGNEDSHIFTASSIGN: ">>>=" > +| < ELLIPSIS: "..." > +} + +/* >'s need special attention due to generics syntax. */ +TOKEN : +{ + < RUNSIGNEDSHIFT: ">>>" > + { + matchedToken.kind = GT; + ((MyToken)matchedToken).realKind = RUNSIGNEDSHIFT; + input_stream.backup(2); + matchedToken.image = ">"; + } +| < RSIGNEDSHIFT: ">>" > + { + matchedToken.kind = GT; + ((MyToken)matchedToken).realKind = RSIGNEDSHIFT; + input_stream.backup(1); + matchedToken.image = ">"; + } +| < GT: ">" > +} + + +/***************************************** + * THE JAVA LANGUAGE GRAMMAR STARTS HERE * + *****************************************/ + +/* + * Program structuring syntax follows. + */ + +void CompilationUnit(): +{} +{ + [ LOOKAHEAD( ( Annotation() )* "package" ) PackageDeclaration() ] + ( ImportDeclaration() )* + ( TypeDeclaration() )+ + ( < "\u001a" > )? + ( )? + +} + +void PackageDeclaration(): +{} +{ + Modifiers() "package" Name() ";" +} + +void ImportDeclaration(): +{} +{ + "import" [ "static" ] Name() [ "." "*" ] ";" +} + +/* + * Modifiers. We match all modifiers in a single rule to reduce the chances of + * syntax errors for simple modifier mistakes. It will also enable us to give + * better error messages. + */ + +int Modifiers(): +{ + int modifiers = 0; +} +{ + ( + LOOKAHEAD(2) + ( + "public" { modifiers |= ModifierSet.PUBLIC; } + | + "static" { modifiers |= ModifierSet.STATIC; } + | + "protected" { modifiers |= ModifierSet.PROTECTED; } + | + "private" { modifiers |= ModifierSet.PRIVATE; } + | + "final" { modifiers |= ModifierSet.FINAL; } + | + "abstract" { modifiers |= ModifierSet.ABSTRACT; } + | + "synchronized" { modifiers |= ModifierSet.SYNCHRONIZED; } + | + "native" { modifiers |= ModifierSet.NATIVE; } + | + "transient" { modifiers |= ModifierSet.TRANSIENT; } + | + "volatile" { modifiers |= ModifierSet.VOLATILE; } + | + "strictfp" { modifiers |= ModifierSet.STRICTFP; } + | + Annotation() + ) + )* + + { + return modifiers; + } +} + +/* + * Declaration syntax follows. + */ +void TypeDeclaration(): +{ + int modifiers; +} +{ + ";" +| + modifiers = Modifiers() + ( + ClassOrInterfaceDeclaration(modifiers) + | + EnumDeclaration(modifiers) + | + AnnotationTypeDeclaration(modifiers) + ) +} + + +void ClassOrInterfaceDeclaration(int modifiers): +{ + boolean isInterface = false; +} +{ + ( "class" | "interface" { isInterface = true; } ) + + [ TypeParameters() ] + [ ExtendsList(isInterface) ] + [ ImplementsList(isInterface) ] + ClassOrInterfaceBody(isInterface) +} + +void ExtendsList(boolean isInterface): +{ + boolean extendsMoreThanOne = false; +} +{ + "extends" ClassOrInterfaceType() + ( "," ClassOrInterfaceType() { extendsMoreThanOne = true; } )* + { + if (extendsMoreThanOne && !isInterface) + throw new ParseException("A class cannot extend more than one other class"); + } +} + +void ImplementsList(boolean isInterface): +{} +{ + "implements" ClassOrInterfaceType() + ( "," ClassOrInterfaceType() )* + { + if (isInterface) + throw new ParseException("An interface cannot implement other interfaces"); + } +} + +void EnumDeclaration(int modifiers): +{} +{ + "enum" + [ ImplementsList(false) ] + EnumBody() +} + +void EnumBody(): +{} +{ + "{" + [ EnumConstant() ( LOOKAHEAD(2) "," EnumConstant() )* ] + [ "," ] + [ ";" ( ClassOrInterfaceBodyDeclaration(false) )* ] + "}" +} + +void EnumConstant(): +{} +{ + Modifiers() [ Arguments() ] [ ClassOrInterfaceBody(false) ] +} + +void TypeParameters(): +{} +{ + "<" TypeParameter() ( "," TypeParameter() )* ">" +} + +void TypeParameter(): +{} +{ + [ TypeBound() ] +} + +void TypeBound(): +{} +{ + "extends" ClassOrInterfaceType() ( "&" ClassOrInterfaceType() )* +} + +void ClassOrInterfaceBody(boolean isInterface): +{} +{ + "{" ( ClassOrInterfaceBodyDeclaration(isInterface) )* "}" +} + +void ClassOrInterfaceBodyDeclaration(boolean isInterface): +{ + boolean isNestedInterface = false; + int modifiers; +} +{ + LOOKAHEAD(2) + Initializer() + { + if (isInterface) + throw new ParseException("An interface cannot have initializers"); + } +| + modifiers = Modifiers() // Just get all the modifiers out of the way. If you want to do + // more checks, pass the modifiers down to the member + ( + ClassOrInterfaceDeclaration(modifiers) + | + EnumDeclaration(modifiers) + | + LOOKAHEAD( [ TypeParameters() ] "(" ) + ConstructorDeclaration() + | + LOOKAHEAD( Type() ( "[" "]" )* ( "," | "=" | ";" ) ) + FieldDeclaration(modifiers) + | + MethodDeclaration(modifiers) + | + AnnotationTypeDeclaration(modifiers) + ) +| + ";" +} + +void FieldDeclaration(int modifiers): +{} +{ + // Modifiers are already matched in the caller + Type() VariableDeclarator() ( "," VariableDeclarator() )* ";" +} + +void VariableDeclarator(): +{} +{ + VariableDeclaratorId() [ "=" VariableInitializer() ] +} + +void VariableDeclaratorId(): +{} +{ + ( "[" "]" )* +} + +void VariableInitializer(): +{} +{ + ArrayInitializer() +| + Expression() +} + +void ArrayInitializer(): +{} +{ + "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}" +} + +void MethodDeclaration(int modifiers): +{} +{ + // Modifiers already matched in the caller! + [ TypeParameters() ] + ResultType() + MethodDeclarator() [ "throws" NameList() ] + ( Block() | ";" ) +} + +void MethodDeclarator(): +{} +{ + FormalParameters() ( "[" "]" )* +} + +void FormalParameters(): +{} +{ + "(" [ FormalParameter() ( "," FormalParameter() )* ] ")" +} + +void FormalParameter(): +{} +{ + // danson, added + // [ "final" | Annotation() ] + // See Java Language Specification, 3rd Edition, section 8.4.1 + Modifiers() [ "final" | Annotation() ] Type() [ "..." ] VariableDeclaratorId() +} + +void ConstructorDeclaration(): +{} +{ + [ TypeParameters() ] + // Modifiers matched in the caller + FormalParameters() [ "throws" NameList() ] + "{" + [ LOOKAHEAD(ExplicitConstructorInvocation()) + ExplicitConstructorInvocation() + ] + ( BlockStatement() )* + "}" +} + +void ExplicitConstructorInvocation(): +{} +{ + ( "." )* [ LOOKAHEAD(2) "this" "." ] + [ TypeArguments() ] ("this"|"super") Arguments() ";" +} + +void Initializer(): +{} +{ + [ "static" ] Block() +} + + +/* + * Type, name and expression syntax follows. + */ + +void Type(): +{} +{ + LOOKAHEAD(2) ReferenceType() + | + PrimitiveType() +} + +void ReferenceType(): +{} +{ + PrimitiveType() ( LOOKAHEAD(2) "[" "]" )+ + | + ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" )* +} + +void ClassOrInterfaceType(): +{} +{ + [ LOOKAHEAD(2) TypeArguments() ] + ( LOOKAHEAD(2) "." [ LOOKAHEAD(2) TypeArguments() ] )* +} + +void TypeArguments(): +{} +{ + "<" TypeArgument() ( "," TypeArgument() )* ">" +} + +void TypeArgument(): +{} +{ + ReferenceType() + | + "?" [ WildcardBounds() ] +} + +void WildcardBounds(): +{} +{ + "extends" ReferenceType() + | + "super" ReferenceType() +} + + +void PrimitiveType(): +{} +{ + "boolean" +| + "char" +| + "byte" +| + "short" +| + "int" +| + "long" +| + "float" +| + "double" +} + +void ResultType(): +{} +{ + "void" +| + Type() +} + +void Name(): +/* + * A lookahead of 2 is required below since "Name" can be followed + * by a ".*" when used in the context of an "ImportDeclaration". + */ +{} +{ + + ( LOOKAHEAD(2) "." + )* +} + +void NameList(): +{} +{ + Name() ( "," Name() )* +} + + +/* + * Expression syntax follows. + */ + +void Expression(): +/* + * This expansion has been written this way instead of: + * Assignment() | ConditionalExpression() + * for performance reasons. + * However, it is a weakening of the grammar for it allows the LHS of + * assignments to be any conditional expression whereas it can only be + * a primary expression. Consider adding a semantic predicate to work + * around this. + */ +{} +{ + ConditionalExpression() + [ + LOOKAHEAD(2) + AssignmentOperator() Expression() + ] +} + +void AssignmentOperator(): +{} +{ + "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" +} + +void ConditionalExpression(): +{} +{ + ConditionalOrExpression() [ "?" Expression() ":" Expression() ] +} + +void ConditionalOrExpression(): +{} +{ + ConditionalAndExpression() ( "||" ConditionalAndExpression() )* +} + +void ConditionalAndExpression(): +{} +{ + InclusiveOrExpression() ( "&&" InclusiveOrExpression() )* +} + +void InclusiveOrExpression(): +{} +{ + ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )* +} + +void ExclusiveOrExpression(): +{} +{ + AndExpression() ( "^" AndExpression() )* +} + +void AndExpression(): +{} +{ + EqualityExpression() ( "&" EqualityExpression() )* +} + +void EqualityExpression(): +{} +{ + InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )* +} + +void InstanceOfExpression(): +{} +{ + RelationalExpression() [ "instanceof" Type() ] +} + +void RelationalExpression(): +{} +{ + ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )* +} + +void ShiftExpression(): +{} +{ + AdditiveExpression() ( ( "<<" | RSIGNEDSHIFT() | RUNSIGNEDSHIFT() ) AdditiveExpression() )* +} + +void AdditiveExpression(): +{} +{ + MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )* +} + +void MultiplicativeExpression(): +{} +{ + UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )* +} + +void UnaryExpression(): +{} +{ + ( "+" | "-" ) UnaryExpression() +| + PreIncrementExpression() +| + PreDecrementExpression() +| + UnaryExpressionNotPlusMinus() +} + +void PreIncrementExpression(): +{} +{ + "++" PrimaryExpression() +} + +void PreDecrementExpression(): +{} +{ + "--" PrimaryExpression() +} + +void UnaryExpressionNotPlusMinus(): +{} +{ + ( "~" | "!" ) UnaryExpression() +| + LOOKAHEAD( CastLookahead() ) + CastExpression() +| + PostfixExpression() +} + +// This production is to determine lookahead only. The LOOKAHEAD specifications +// below are not used, but they are there just to indicate that we know about +// this. +void CastLookahead(): +{} +{ + LOOKAHEAD(2) + "(" PrimitiveType() +| + LOOKAHEAD("(" Type() "[") + "(" Type() "[" "]" +| + "(" Type() ")" ( "~" | "!" | "(" | | "this" | "super" | "new" | Literal() ) +} + +void PostfixExpression(): +{} +{ + PrimaryExpression() [ "++" | "--" ] +} + +void CastExpression(): +{} +{ + LOOKAHEAD("(" PrimitiveType()) + "(" Type() ")" UnaryExpression() +| + "(" Type() ")" UnaryExpressionNotPlusMinus() +} + +void PrimaryExpression(): +{} +{ + PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* +} + +void MemberSelector(): +{} +{ + "." TypeArguments() +} + +void PrimaryPrefix(): +{} +{ + Literal() +| + LOOKAHEAD( ( "." )* "this" ) + ( "." )* + "this" +| + "super" "." +| + // danson, added this part to support a construct like: + // Buffer.super.setDirty(true); + // See Java Language Specification, 3rd edition, section 15.11.2. + LOOKAHEAD( ClassOrInterfaceType() "." "super" "." ) + ClassOrInterfaceType() "." "super" "." +| + "(" Expression() ")" +| + AllocationExpression() +| + LOOKAHEAD( ResultType() "." "class" ) + ResultType() "." "class" +| + Name() +} + +void PrimarySuffix(): +{} +{ + LOOKAHEAD("." "super" ".") + "." "super" +| + LOOKAHEAD("." "this") + "." "this" +| + LOOKAHEAD(2) + "." AllocationExpression() +| + LOOKAHEAD(3) + MemberSelector() +| + "[" Expression() "]" +| + "." +| + Arguments() +} + +void Literal(): +{} +{ + +| + +| + +| + +| + BooleanLiteral() +| + NullLiteral() +} + +void BooleanLiteral(): +{} +{ + "true" +| + "false" +} + +void NullLiteral(): +{} +{ + "null" +} + +void Arguments(): +{} +{ + "(" [ ArgumentList() ] ")" +} + +void ArgumentList(): +{} +{ + Expression() ( "," Expression() )* +} + +void AllocationExpression(): +{} +{ + LOOKAHEAD(2) + "new" PrimitiveType() ArrayDimsAndInits() +| + "new" ClassOrInterfaceType() [ TypeArguments() ] + ( + ArrayDimsAndInits() + | + Arguments() [ ClassOrInterfaceBody(false) ] + ) +} + +/* + * The third LOOKAHEAD specification below is to parse to PrimarySuffix + * if there is an expression between the "[...]". + */ +void ArrayDimsAndInits(): +{} +{ + LOOKAHEAD(2) + ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )* +| + ( "[" "]" )+ ArrayInitializer() +} + + +/* + * Statement syntax follows. + */ + +void Statement(): +{} +{ + LOOKAHEAD(2) + LabeledStatement() +| + AssertStatement() +| + Block() +| + EmptyStatement() +| + StatementExpression() ";" +| + SwitchStatement() +| + IfStatement() +| + WhileStatement() +| + DoStatement() +| + ForStatement() +| + BreakStatement() +| + ContinueStatement() +| + ReturnStatement() +| + ThrowStatement() +| + SynchronizedStatement() +| + TryStatement() +} + +void AssertStatement(): +{} +{ + "assert" Expression() [ ":" Expression() ] ";" +} + +void LabeledStatement(): +{} +{ + ":" Statement() +} + +void Block(): +{} +{ + "{" ( BlockStatement() )* "}" +} + +void BlockStatement(): +{} +{ + LOOKAHEAD( Modifiers() Type() ) + LocalVariableDeclaration() ";" +| + Statement() +| + ClassOrInterfaceDeclaration(0) +} + +void LocalVariableDeclaration(): +{} +{ + Modifiers() Type() VariableDeclarator() ( "," VariableDeclarator() )* +} + +void EmptyStatement(): +{} +{ + ";" +} + +void StatementExpression(): +/* + * The last expansion of this production accepts more than the legal + * Java expansions for StatementExpression. This expansion does not + * use PostfixExpression for performance reasons. + */ +{} +{ + PreIncrementExpression() +| + PreDecrementExpression() +| + PrimaryExpression() + [ + "++" + | + "--" + | + AssignmentOperator() Expression() + ] +} + +void SwitchStatement(): +{} +{ + "switch" "(" Expression() ")" "{" + ( SwitchLabel() ( BlockStatement() )* )* + "}" +} + +void SwitchLabel(): +{} +{ + "case" Expression() ":" +| + "default" ":" +} + +void IfStatement(): +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +{} +{ + "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] +} + +void WhileStatement(): +{} +{ + "while" "(" Expression() ")" Statement() +} + +void DoStatement(): +{} +{ + "do" Statement() "while" "(" Expression() ")" ";" +} + +void ForStatement(): +{} +{ + "for" "(" + + ( + LOOKAHEAD(Modifiers() Type() ":") + Modifiers() Type() ":" Expression() + | + [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ] + ) + + ")" Statement() +} + +void ForInit(): +{} +{ + LOOKAHEAD( Modifiers() Type() ) + LocalVariableDeclaration() +| + StatementExpressionList() +} + +void StatementExpressionList(): +{} +{ + StatementExpression() ( "," StatementExpression() )* +} + +void ForUpdate(): +{} +{ + StatementExpressionList() +} + +void BreakStatement(): +{} +{ + "break" [ ] ";" +} + +void ContinueStatement(): +{} +{ + "continue" [ ] ";" +} + +void ReturnStatement(): +{} +{ + "return" [ Expression() ] ";" +} + +void ThrowStatement(): +{} +{ + "throw" Expression() ";" +} + +void SynchronizedStatement(): +{} +{ + "synchronized" "(" Expression() ")" Block() +} + +void TryStatement(): +/* + * Semantic check required here to make sure that at least one + * finally/catch is present. + */ +{} +{ + "try" Block() + ( "catch" "(" FormalParameter() ")" Block() )* + [ "finally" Block() ] +} + +/* We use productions to match >>>, >> and > so that we can keep the + * type declaration syntax with generics clean + */ + +void RUNSIGNEDSHIFT(): +{} +{ + ( LOOKAHEAD({ getToken(1).kind == GT && + ((MyToken)getToken(1)).realKind == RUNSIGNEDSHIFT} ) + ">" ">" ">" + ) +} + +void RSIGNEDSHIFT(): +{} +{ + ( LOOKAHEAD({ getToken(1).kind == GT && + ((MyToken)getToken(1)).realKind == RSIGNEDSHIFT} ) + ">" ">" + ) +} + +/* Annotation syntax follows. */ + +void Annotation(): +{} +{ + LOOKAHEAD( "@" Name() "(" ( "=" | ")" )) + NormalAnnotation() + | + LOOKAHEAD( "@" Name() "(" ) + SingleMemberAnnotation() + | + MarkerAnnotation() +} + +void NormalAnnotation(): +{} +{ + "@" Name() "(" [ MemberValuePairs() ] ")" +} + +void MarkerAnnotation(): +{} +{ + "@" Name() +} + +void SingleMemberAnnotation(): +{} +{ + "@" Name() "(" MemberValue() ")" +} + +void MemberValuePairs(): +{} +{ + MemberValuePair() ( "," MemberValuePair() )* +} + +void MemberValuePair(): +{} +{ + "=" MemberValue() +} + +void MemberValue(): +{} +{ + Annotation() + | + MemberValueArrayInitializer() + | + ConditionalExpression() +} + +void MemberValueArrayInitializer(): +{} +{ + "{" (MemberValue() ( LOOKAHEAD(2) "," MemberValue() )* [ "," ])? "}" +} + + +/* Annotation Types. */ + +void AnnotationTypeDeclaration(int modifiers): +{} +{ + "@" "interface" AnnotationTypeBody() +} + +void AnnotationTypeBody(): +{} +{ + "{" ( AnnotationTypeMemberDeclaration() )* "}" +} + +void AnnotationTypeMemberDeclaration(): +{ + int modifiers; +} +{ + modifiers = Modifiers() + ( + LOOKAHEAD(Type() "(") + Type() "(" ")" [ DefaultValue() ] ";" + | + ClassOrInterfaceDeclaration(modifiers) + | + EnumDeclaration(modifiers) + | + AnnotationTypeDeclaration(modifiers) + | + FieldDeclaration(modifiers) + ) + | + ( ";" ) +} + +void DefaultValue(): +{} +{ + "default" MemberValue() +} diff --git a/javacc/examples/JavaCC.jj b/javacc/examples/JavaCC.jj new file mode 100644 index 0000000000..a3351e2ae1 --- /dev/null +++ b/javacc/examples/JavaCC.jj @@ -0,0 +1,1509 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + JAVA_UNICODE_ESCAPE = true; +} + +PARSER_BEGIN(JavaCCParser) + +public class JavaCCParser { + + public static void main(String args[]) { + JavaCCParser parser; + if (args.length == 0) { + System.out.println("JavaCC Parser: Reading from standard input . . ."); + parser = new JavaCCParser(System.in); + } else if (args.length == 1) { + System.out.println("JavaCC Parser: Reading from file " + args[0] + " . . ."); + try { + parser = new JavaCCParser(new java.io.FileInputStream(args[0])); + } catch (java.io.FileNotFoundException e) { + System.out.println("JavaCC Parser: File " + args[0] + " not found."); + return; + } + } else { + System.out.println("JavaCC Parser: Usage is one of:"); + System.out.println(" java JavaCCParser < inputfile"); + System.out.println("OR"); + System.out.println(" java JavaCCParser inputfile"); + return; + } + try { + parser.javacc_input(); + System.out.println("JavaCC Parser: Java program parsed successfully."); + } catch (ParseException e) { + System.out.println(e.getMessage()); + System.out.println("JavaCC Parser: Encountered errors during parse."); + } + } + + /* + * Returns true if the next token is not in the FOLLOW list of "expansion". + * It is used to decide when the end of an "expansion" has been reached. + */ + static private boolean notTailOfExpansionUnit() { + Token t; + t = getToken(1); + if (t.kind == BIT_OR || t.kind == COMMA || t.kind == RPAREN || t.kind == RBRACE || t.kind == RBRACKET) return false; + return true; + } + +} + +PARSER_END(JavaCCParser) + + +/********************************************** + * THE JAVACC TOKEN SPECIFICATION STARTS HERE * + **********************************************/ + +/* JAVACC RESERVED WORDS: These are the only tokens in JavaCC but not in Java */ + +TOKEN : +{ + < _OPTIONS: "options" > +| < _LOOKAHEAD: "LOOKAHEAD" > +| < _IGNORE_CASE: "IGNORE_CASE" > +| < _PARSER_BEGIN: "PARSER_BEGIN" > +| < _PARSER_END: "PARSER_END" > +| < _JAVACODE: "JAVACODE" > +| < _TOKEN: "TOKEN" > +| < _SPECIAL_TOKEN: "SPECIAL_TOKEN" > +| < _MORE: "MORE" > +| < _SKIP: "SKIP" > +| < _TOKEN_MGR_DECLS: "TOKEN_MGR_DECLS" > +| < _EOF: "EOF" > +} + +/* + * The remainder of the tokens are exactly (except for the removal of tokens + * containing ">>" and "<<") as in the Java grammar and must be diff equivalent + * (again with the exceptions above) to it. + */ + +/* WHITE SPACE */ + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* COMMENTS */ + +MORE : +{ + "//" : IN_SINGLE_LINE_COMMENT +| + <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT +| + "/*" : IN_MULTI_LINE_COMMENT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + + +MORE : +{ + < ~[] > +} + +/* JAVA RESERVED WORDS AND LITERALS */ + +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" > +} + +/* JAVA LITERALS */ + +TOKEN : +{ + < INTEGER_LITERAL: + (["l","L"])? + | (["l","L"])? + | (["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"])* ()? (["f","F","d","D"])? + | "." (["0"-"9"])+ ()? (["f","F","d","D"])? + | (["0"-"9"])+ (["f","F","d","D"])? + | (["0"-"9"])+ ()? ["f","F","d","D"] + > +| + < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > +| + < CHARACTER_LITERAL: + "'" + ( (~["'","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + ) + "'" + > +| + < STRING_LITERAL: + "\"" + ( (~["\"","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + )* + "\"" + > +} + +/* IDENTIFIERS */ + +TOKEN : +{ + < IDENTIFIER: (|)* > +| + < #LETTER: + [ + "\u0024", + "\u0041"-"\u005a", + "\u005f", + "\u0061"-"\u007a", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u00ff", + "\u0100"-"\u1fff", + "\u3040"-"\u318f", + "\u3300"-"\u337f", + "\u3400"-"\u3d2d", + "\u4e00"-"\u9fff", + "\uf900"-"\ufaff" + ] + > +| + < #DIGIT: + [ + "\u0030"-"\u0039", + "\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" + ] + > +} + +/* SEPARATORS */ + +TOKEN : +{ + < LPAREN: "(" > +| < RPAREN: ")" > +| < LBRACE: "{" > +| < RBRACE: "}" > +| < LBRACKET: "[" > +| < RBRACKET: "]" > +| < SEMICOLON: ";" > +| < COMMA: "," > +| < DOT: "." > +} + +/* OPERATORS */ + +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: ">>>=" > +} + + +/************************************************ + * THE JAVACC GRAMMAR SPECIFICATION STARTS HERE * + ************************************************/ + +void javacc_input() : +{} +{ + javacc_options() + "PARSER_BEGIN" "(" identifier() ")" + CompilationUnit() + "PARSER_END" "(" identifier() ")" + ( production() )+ + +} + +void javacc_options() : +{} +{ + [ "options" "{" ( option_binding() )+ "}" ] +} + +void option_binding() : +{} +{ + ( | "LOOKAHEAD" | "IGNORE_CASE" | "static" ) + "=" + ( IntegerLiteral() | BooleanLiteral() | StringLiteral() ) + ";" +} + +void production() : +{} +{ + LOOKAHEAD(1) + /* + * Since JAVACODE is both a JavaCC reserved word and a Java identifier, + * we need to give preference to "javacode_production" over + * "bnf_production". + */ + javacode_production() +| + LOOKAHEAD(1) + /* + * Since SKIP, TOKEN, etc. are both JavaCC reserved words and Java + * identifiers, we need to give preference to "regular_expression_production" + * over "bnf_production". + */ + regular_expr_production() +| + LOOKAHEAD(1) + /* + * Since TOKEN_MGR_DECLS is both a JavaCC reserved word and a Java identifier, + * we need to give preference to "token_manager_decls" over + * "bnf_production". + */ + token_manager_decls() +| + bnf_production() +} + +void javacode_production() : +{} +{ + "JAVACODE" + ResultType() identifier() FormalParameters() + [ "throws" Name() ( "," Name() )* ] + [ node_descriptor() ] + Block() +} + +void bnf_production() : +{} +{ + ResultType() identifier() FormalParameters() + [ "throws" Name() ( "," Name() )* ] + [ node_descriptor() ] + ":" + Block() + "{" expansion_choices() "}" +} + +void regular_expr_production() : +{} +{ + [ + LOOKAHEAD(2) "<" "*" ">" + | + "<" ( "," )* ">" + ] + regexpr_kind() [ "[" "IGNORE_CASE" "]" ] ":" + "{" regexpr_spec() ( "|" regexpr_spec() )* "}" +} + +void token_manager_decls() : +{} +{ + "TOKEN_MGR_DECLS" ":" ClassBody() +} + +void regexpr_kind() : +{} +{ + "TOKEN" +| + "SPECIAL_TOKEN" +| + "SKIP" +| + "MORE" +} + +void regexpr_spec() : +{} +{ + regular_expression() [ Block() ] [ ":" ] +} + +void expansion_choices() : +{} +{ + expansion() ( "|" expansion() )* +} + +void expansion() : +{} +{ + ( LOOKAHEAD(1) + "LOOKAHEAD" "(" local_lookahead() ")" + )? + ( LOOKAHEAD(0, { notTailOfExpansionUnit() } ) + expansion_unit() + [ node_descriptor() ] + )+ +} + +void local_lookahead() : + { + boolean commaAtEnd = false, emptyLA = true; + } +{ + [ + /* + * The lookahead of 1 is to turn off the warning message that lets + * us know that an expansion choice can also start with an integer + * literal because a primary expression can do the same. But we + * know that this is what we want. + */ + LOOKAHEAD(1) + IntegerLiteral() + { + emptyLA = false; + } + ] + [ LOOKAHEAD(0, { !emptyLA && (getToken(1).kind != RPAREN) } ) + "," + { + commaAtEnd = true; + } + ] + [ LOOKAHEAD(0, { getToken(1).kind != RPAREN && getToken(1).kind != LBRACE } ) + expansion_choices() + { + emptyLA = false; commaAtEnd = false; + } + ] + [ LOOKAHEAD(0, { !emptyLA && !commaAtEnd && (getToken(1).kind != RPAREN) } ) + "," + { + commaAtEnd = true; + } + ] + [ LOOKAHEAD(0, { emptyLA || commaAtEnd } ) + "{" Expression() "}" + ] +} + +void expansion_unit() : +{} +{ + LOOKAHEAD(1) + /* + * We give this priority over primary expressions which use LOOKAHEAD as the + * name of its identifier. + */ + "LOOKAHEAD" "(" local_lookahead() ")" +| + Block() +| + "[" expansion_choices() "]" +| + "try" "{" expansion_choices() "}" + ( "catch" "(" Name() ")" Block() )* + [ "finally" Block() ] +| + LOOKAHEAD( identifier() | StringLiteral() | "<" | PrimaryExpression() "=" ) + [ + LOOKAHEAD(PrimaryExpression() "=") + PrimaryExpression() "=" + ] + ( regular_expression() | identifier() Arguments() ) +| + "(" expansion_choices() ")" ( "+" | "*" | "?" )? +} + +void regular_expression() : +{} +{ + StringLiteral() +| + LOOKAHEAD(3) + "<" [ [ "#" ] identifier() ":" ] complex_regular_expression_choices() ">" +| + LOOKAHEAD(2) + "<" identifier() ">" +| + "<" "EOF" ">" +} + +void complex_regular_expression_choices() : +{} +{ + complex_regular_expression() ( "|" complex_regular_expression() )* +} + +void complex_regular_expression() : +{} +{ + ( complex_regular_expression_unit() )+ +} + +void complex_regular_expression_unit() : +{} +{ + StringLiteral() +| + "<" identifier() ">" +| + character_list() +| + "(" complex_regular_expression_choices() ")" ( "+" | "*" | "?" )? +} + +void character_list() : +{} +{ + [ "~" ] "[" [ character_descriptor() ( "," character_descriptor() )* ] "]" +} + +void character_descriptor() : +{} +{ + StringLiteral() [ "-" StringLiteral() ] +} + +void identifier() : +{} +{ + +} + + +/********************************************** + * THE JJTREE PRODUCTIONS START HERE * + **********************************************/ + +void node_descriptor() : +{} +{ + "#" ( | ) + [ + LOOKAHEAD(1) + "(" [ ">" ] node_descriptor_expression() ")" + ] +} + + +JAVACODE +void node_descriptor_expression() +{ + Token tok; + int nesting = 1; + while (true) { + tok = getToken(1); + if (tok.kind == 0) { + throw new ParseException(); + } + if (tok.kind == LPAREN) nesting++; + if (tok.kind == RPAREN) { + nesting--; + if (nesting == 0) break; + } + tok = getNextToken(); + } +} + + +/********************************************** + * THE JAVA GRAMMAR SPECIFICATION STARTS HERE * + **********************************************/ + +/* + * The Java grammar is modified to use sequences of tokens + * for the missing tokens - those that include "<<" and ">>". + */ + +/* + * The following production defines Java identifiers - it + * includes the reserved words of JavaCC also. + */ + +void JavaIdentifier() : +{} +{ + +| "options" +| "LOOKAHEAD" +| "IGNORE_CASE" +| "PARSER_BEGIN" +| "PARSER_END" +| "JAVACODE" +| "TOKEN" +| "SPECIAL_TOKEN" +| "MORE" +| "SKIP" +| "TOKEN_MGR_DECLS" +| "EOF" +} + +/* + * The productions for the missing code follows. Obviously + * these productions accept more than what is legal in Java, + * but that is OK for our purposes. + */ + +void ShiftOps() : +{} +{ + "<" "<" +| + ">" ">" [ ">" ] +} + +void OtherAssignmentOps() : +{} +{ + "<" "<=" +| + ">" [ ">" ] ">=" +} + +/* + * Program structuring syntax follows. + */ + +void CompilationUnit() : +/* + * The is deleted since the compilation unit is embedded + * within grammar code. To parse to CompilationUnit, we use + * a special production JavaCompilationUnit below. + */ +{} +{ + [ PackageDeclaration() ] + ( ImportDeclaration() )* + ( TypeDeclaration() )* +} + +void JavaCompilationUnit() : +/* + * Use this to parse a Java compilation unit. + */ +{} +{ + CompilationUnit() +} + +void PackageDeclaration() : +{} +{ + "package" Name() ";" +} + +void ImportDeclaration() : +{} +{ + "import" Name() [ "." "*" ] ";" +} + +void TypeDeclaration() : +{} +{ + LOOKAHEAD( ( "abstract" | "final" | "public" )* "class" ) + ClassDeclaration() +| + InterfaceDeclaration() +| + ";" +} + + +/* + * Declaration syntax follows. + */ + +void ClassDeclaration() : +{} +{ + ( "abstract" | "final" | "public" )* + UnmodifiedClassDeclaration() +} + +void UnmodifiedClassDeclaration() : +{} +{ + "class" JavaIdentifier() [ "extends" Name() ] [ "implements" NameList() ] + ClassBody() +} + +void ClassBody() : +{} +{ + "{" ( ClassBodyDeclaration() )* "}" +} + +void NestedClassDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedClassDeclaration() +} + +void ClassBodyDeclaration() : +{} +{ + LOOKAHEAD(2) + Initializer() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( [ "public" | "protected" | "private" ] Name() "(" ) + ConstructorDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +// This production is to determine lookahead only. +void MethodDeclarationLookahead() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() JavaIdentifier() "(" +} + +void InterfaceDeclaration() : +{} +{ + ( "abstract" | "public" )* + UnmodifiedInterfaceDeclaration() +} + +void NestedInterfaceDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedInterfaceDeclaration() +} + +void UnmodifiedInterfaceDeclaration() : +{} +{ + "interface" JavaIdentifier() [ "extends" NameList() ] + "{" ( InterfaceMemberDeclaration() )* "}" +} + +void InterfaceMemberDeclaration() : +{} +{ + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +void FieldDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "final" | "transient" | "volatile" )* + Type() VariableDeclarator() ( "," VariableDeclarator() )* ";" +} + +void VariableDeclarator() : +{} +{ + VariableDeclaratorId() [ "=" VariableInitializer() ] +} + +void VariableDeclaratorId() : +{} +{ + JavaIdentifier() ( "[" "]" )* +} + +void VariableInitializer() : +{} +{ + ArrayInitializer() +| + Expression() +} + +void ArrayInitializer() : +{} +{ + "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}" +} + +void MethodDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() MethodDeclarator() [ "throws" NameList() ] + ( Block() | ";" ) +} + +void MethodDeclarator() : +{} +{ + JavaIdentifier() FormalParameters() ( "[" "]" )* +} + +void FormalParameters() : +{} +{ + "(" [ FormalParameter() ( "," FormalParameter() )* ] ")" +} + +void FormalParameter() : +{} +{ + [ "final" ] Type() VariableDeclaratorId() +} + +void ConstructorDeclaration() : +{} +{ + [ "public" | "protected" | "private" ] + JavaIdentifier() FormalParameters() [ "throws" NameList() ] + "{" + [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ] + ( BlockStatement() )* + "}" +} + +void ExplicitConstructorInvocation() : +{} +{ + LOOKAHEAD("this" Arguments() ";") + "this" Arguments() ";" +| + [ LOOKAHEAD(2) PrimaryExpression() "." ] "super" Arguments() ";" +} + +void Initializer() : +{} +{ + [ "static" ] Block() +} + + +/* + * Type, name and expression syntax follows. + */ + +void Type() : +{} +{ + ( PrimitiveType() | Name() ) ( "[" "]" )* +} + +void PrimitiveType() : +{} +{ + "boolean" +| + "char" +| + "byte" +| + "short" +| + "int" +| + "long" +| + "float" +| + "double" +} + +void ResultType() : +{} +{ + "void" +| + Type() +} + +void Name() : +/* + * A lookahead of 2 is required below since "Name" can be followed + * by a ".*" when used in the context of an "ImportDeclaration". + */ +{} +{ + JavaIdentifier() + ( LOOKAHEAD(2) "." JavaIdentifier() )* +} + +void NameList() : +{} +{ + Name() ( "," Name() )* +} + + +/* + * Expression syntax follows. + */ + +void Expression() : +/* + * This expansion has been written this way instead of: + * Assignment() | ConditionalExpression() + * for performance reasons. + * However, it is a weakening of the grammar for it allows the LHS of + * assignments to be any conditional expression whereas it can only be + * a primary expression. Consider adding a semantic predicate to work + * around this. + */ +{} +{ + ConditionalExpression() [ AssignmentOperator() Expression() ] +} + +void AssignmentOperator() : +{} +{ + "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "&=" | "^=" | "|=" +| + OtherAssignmentOps() +} + +void ConditionalExpression() : +{} +{ + ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() ] +} + +void ConditionalOrExpression() : +{} +{ + ConditionalAndExpression() ( "||" ConditionalAndExpression() )* +} + +void ConditionalAndExpression() : +{} +{ + InclusiveOrExpression() ( "&&" InclusiveOrExpression() )* +} + +void InclusiveOrExpression() : +{} +{ + ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )* +} + +void ExclusiveOrExpression() : +{} +{ + AndExpression() ( "^" AndExpression() )* +} + +void AndExpression() : +{} +{ + EqualityExpression() ( "&" EqualityExpression() )* +} + +void EqualityExpression() : +{} +{ + InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )* +} + +void InstanceOfExpression() : +{} +{ + RelationalExpression() [ "instanceof" Type() ] +} + +void RelationalExpression() : +{} +{ + /* + * The lookahead of 2 below is due to the fact that we have split + * the shift and shift assignment operator into multiple tokens that + * now clash with these tokens. + */ + ShiftExpression() ( LOOKAHEAD(2) ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )* +} + +void ShiftExpression() : +{} +{ + /* + * The lookahead of 3 below is due to the fact that we have split + * the shift and shift assignment operator into multiple tokens that + * now clash with these tokens and the relational operators. + */ + AdditiveExpression() ( LOOKAHEAD(3) ( ShiftOps() ) AdditiveExpression() )* +} + +void AdditiveExpression() : +{} +{ + MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )* +} + +void MultiplicativeExpression() : +{} +{ + UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )* +} + +void UnaryExpression() : +{} +{ + ( "+" | "-" ) UnaryExpression() +| + PreIncrementExpression() +| + PreDecrementExpression() +| + UnaryExpressionNotPlusMinus() +} + +void PreIncrementExpression() : +{} +{ + "++" PrimaryExpression() +} + +void PreDecrementExpression() : +{} +{ + "--" PrimaryExpression() +} + +void UnaryExpressionNotPlusMinus() : +{} +{ + ( "~" | "!" ) UnaryExpression() +| + LOOKAHEAD( CastLookahead() ) + CastExpression() +| + PostfixExpression() +} + +// This production is to determine lookahead only. The LOOKAHEAD specifications +// below are not used, but they are there just to indicate that we know about +// this. +void CastLookahead() : +{} +{ + LOOKAHEAD(2) + "(" PrimitiveType() +| + LOOKAHEAD("(" Name() "[") + "(" Name() "[" "]" +| + "(" Name() ")" ( "~" | "!" | "(" | JavaIdentifier() | "this" | "super" | "new" | Literal() ) +} + +void PostfixExpression() : +{} +{ + PrimaryExpression() [ "++" | "--" ] +} + +void CastExpression() : +{} +{ + LOOKAHEAD("(" PrimitiveType()) + "(" Type() ")" UnaryExpression() +| + LOOKAHEAD("(" Name()) + "(" Type() ")" UnaryExpressionNotPlusMinus() +} + +void PrimaryExpression() : +{} +{ + PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* +} + +void PrimaryPrefix() : +{} +{ + Literal() +| + "this" +| + "super" "." JavaIdentifier() +| + "(" Expression() ")" +| + AllocationExpression() +| + LOOKAHEAD( ResultType() "." "class" ) + ResultType() "." "class" +| + Name() +} + +void PrimarySuffix() : +{} +{ + LOOKAHEAD(2) + "." "this" +| + LOOKAHEAD(2) + "." AllocationExpression() +| + "[" Expression() "]" +| + "." JavaIdentifier() +| + Arguments() +} + +void Literal() : +{} +{ + +| + +| + +| + +| + BooleanLiteral() +| + NullLiteral() +} + +void IntegerLiteral() : +{} +{ + +} + +void BooleanLiteral() : +{} +{ + "true" +| + "false" +} + +void StringLiteral() : +{} +{ + +} + +void NullLiteral() : +{} +{ + "null" +} + +void Arguments() : +{} +{ + "(" [ ArgumentList() ] ")" +} + +void ArgumentList() : +{} +{ + Expression() ( "," Expression() )* +} + +void AllocationExpression() : +{} +{ + LOOKAHEAD(2) + "new" PrimitiveType() ArrayDimsAndInits() +| + "new" Name() + ( + ArrayDimsAndInits() + | + Arguments() [ ClassBody() ] + ) +} + +/* + * The second LOOKAHEAD specification below is to parse to PrimarySuffix + * if there is an expression between the "[...]". + */ +void ArrayDimsAndInits() : +{} +{ + LOOKAHEAD(2) + ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )* +| + ( "[" "]" )+ ArrayInitializer() +} + + +/* + * Statement syntax follows. + */ + +void Statement() : +{} +{ + LOOKAHEAD(2) + LabeledStatement() +| + Block() +| + EmptyStatement() +| + StatementExpression() ";" +| + SwitchStatement() +| + IfStatement() +| + WhileStatement() +| + DoStatement() +| + ForStatement() +| + BreakStatement() +| + ContinueStatement() +| + ReturnStatement() +| + ThrowStatement() +| + SynchronizedStatement() +| + TryStatement() +} + +void LabeledStatement() : +{} +{ + JavaIdentifier() ":" Statement() +} + +void Block() : +{} +{ + "{" ( BlockStatement() )* "}" +} + +void BlockStatement() : +{} +{ + LOOKAHEAD([ "final" ] Type() JavaIdentifier()) + LocalVariableDeclaration() ";" +| + Statement() +| + UnmodifiedClassDeclaration() +| + UnmodifiedInterfaceDeclaration() +} + +void LocalVariableDeclaration() : +{} +{ + [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )* +} + +void EmptyStatement() : +{} +{ + ";" +} + +void StatementExpression() : +/* + * The last expansion of this production accepts more than the legal + * Java expansions for StatementExpression. This expansion does not + * use PostfixExpression for performance reasons. + */ +{} +{ + PreIncrementExpression() +| + PreDecrementExpression() +| + PrimaryExpression() + [ + "++" + | + "--" + | + AssignmentOperator() Expression() + ] +} + +void SwitchStatement() : +{} +{ + "switch" "(" Expression() ")" "{" + ( SwitchLabel() ( BlockStatement() )* )* + "}" +} + +void SwitchLabel() : +{} +{ + "case" Expression() ":" +| + "default" ":" +} + +void IfStatement() : +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +{} +{ + "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] +} + +void WhileStatement() : +{} +{ + "while" "(" Expression() ")" Statement() +} + +void DoStatement() : +{} +{ + "do" Statement() "while" "(" Expression() ")" ";" +} + +void ForStatement() : +{} +{ + "for" "(" [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ] ")" Statement() +} + +void ForInit() : +{} +{ + LOOKAHEAD( [ "final" ] Type() JavaIdentifier() ) + LocalVariableDeclaration() +| + StatementExpressionList() +} + +void StatementExpressionList() : +{} +{ + StatementExpression() ( "," StatementExpression() )* +} + +void ForUpdate() : +{} +{ + StatementExpressionList() +} + +void BreakStatement() : +{} +{ + "break" [ JavaIdentifier() ] ";" +} + +void ContinueStatement() : +{} +{ + "continue" [ JavaIdentifier() ] ";" +} + +void ReturnStatement() : +{} +{ + "return" [ Expression() ] ";" +} + +void ThrowStatement() : +{} +{ + "throw" Expression() ";" +} + +void SynchronizedStatement() : +{} +{ + "synchronized" "(" Expression() ")" Block() +} + +void TryStatement() : +/* + * Semantic check required here to make sure that at least one + * finally/catch is present. + */ +{} +{ + "try" Block() + ( "catch" "(" FormalParameter() ")" Block() )* + [ "finally" Block() ] +} diff --git a/javacc/examples/MapFile.jj b/javacc/examples/MapFile.jj new file mode 100644 index 0000000000..ef9102f572 --- /dev/null +++ b/javacc/examples/MapFile.jj @@ -0,0 +1,194 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + JAVA_UNICODE_ESCAPE = true; + STATIC = false; +} + +PARSER_BEGIN(MapFile) + +import java.util.*; + +public class MapFile { +} + +PARSER_END(MapFile) + +/* + * Following is the only production in this grammar. This describes the grammar + * of the mapsfile, which is simply a list of maps from actual identifiers to + * obfuscated identifiers. The actions here insert these mappings into the + * appropriate Hashtable's in Globals.java. + */ + +void input() : + { + Token t1, t2; + } +{ + ( + t1= "->" t2= ";" + { + if (Globals.mappings.get(t1.image) != null) { + if (!t1.image.equals(t2.image)) { + System.out.println("Warning: Map specification of " + t1.image + " to " + t2.image + " overrides entry in ."); + } + } + // truncate size just to be safe on machines like Macs + if (t2.image.length() > 24) { + t2.image = t2.image.substring(0,24); + } + Globals.mappings.put(t1.image, t2.image); + Globals.mapTargets.put(t2.image, ""); + if (t2.image.length() > 2 && t2.image.substring(0,2).equals("O0")) { + int i = Integer.parseInt(t2.image.substring(2)); + if (i > Globals.counter) { + Globals.counter = i; + } + } + } + )* + +} + +// Lexical specifications follow (copied from the Java 1.1 grammar) + +SKIP : /* WHITE SPACE */ +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +SKIP : /* COMMENTS */ +{ + +| +| +} + +TOKEN : /* RESERVED WORDS */ +{ + < 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 : /* IDENTIFIERS */ +{ + < IDENTIFIER: (|)* > +| + < #LETTER: + [ + "\u0024", + "\u0041"-"\u005a", + "\u005f", + "\u0061"-"\u007a", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u00ff", + "\u0100"-"\u1fff", + "\u3040"-"\u318f", + "\u3300"-"\u337f", + "\u3400"-"\u3d2d", + "\u4e00"-"\u9fff", + "\uf900"-"\ufaff" + ] + > +| + < #DIGIT: + [ + "\u0030"-"\u0039", + "\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" + ] + > +} diff --git a/javacc/examples/NL_Xlator.jj b/javacc/examples/NL_Xlator.jj new file mode 100644 index 0000000000..b53ded56a8 --- /dev/null +++ b/javacc/examples/NL_Xlator.jj @@ -0,0 +1,167 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +PARSER_BEGIN(NL_Xlator) + +/** New line translator. */ +public class NL_Xlator { + + /** Main entry point. */ + public static void main(String args[]) throws ParseException { + NL_Xlator parser = new NL_Xlator(System.in); + parser.ExpressionList(); + } + +} + +PARSER_END(NL_Xlator) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +TOKEN : +{ + < ID: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","0"-"9"] )* > +| + < NUM: ( ["0"-"9"] )+ > +} + +/** Top level production. */ +void ExpressionList() : +{ + String s; +} +{ + { + System.out.println("Please type in an expression followed by a \";\" or ^D to quit:"); + System.out.println(""); + } + ( s=Expression() ";" + { + System.out.println(s); + System.out.println(""); + System.out.println("Please type in another expression followed by a \";\" or ^D to quit:"); + System.out.println(""); + } + )* + +} + +/** An Expression. */ +String Expression() : +{ + java.util.Vector termimage = new java.util.Vector(); + String s; +} +{ + s=Term() + { + termimage.addElement(s); + } + ( "+" s=Term() + { + termimage.addElement(s); + } + )* + { + if (termimage.size() == 1) { + return (String)termimage.elementAt(0); + } else { + s = "the sum of " + (String)termimage.elementAt(0); + for (int i = 1; i < termimage.size()-1; i++) { + s += ", " + (String)termimage.elementAt(i); + } + if (termimage.size() > 2) { + s += ","; + } + s += " and " + (String)termimage.elementAt(termimage.size()-1); + return s; + } + } +} + +/** A Term. */ +String Term() : +{ + java.util.Vector factorimage = new java.util.Vector(); + String s; +} +{ + s=Factor() + { + factorimage.addElement(s); + } + ( "*" s=Factor() + { + factorimage.addElement(s); + } + )* + { + if (factorimage.size() == 1) { + return (String)factorimage.elementAt(0); + } else { + s = "the product of " + (String)factorimage.elementAt(0); + for (int i = 1; i < factorimage.size()-1; i++) { + s += ", " + (String)factorimage.elementAt(i); + } + if (factorimage.size() > 2) { + s += ","; + } + s += " and " + (String)factorimage.elementAt(factorimage.size()-1); + return s; + } + } +} + +/** A Factor. */ +String Factor() : +{ + Token t; + String s; +} +{ + t= + { + return t.image; + } +| + t= + { + return t.image; + } +| + "(" s=Expression() ")" + { + return s; + } +} diff --git a/javacc/examples/PHP.jj b/javacc/examples/PHP.jj new file mode 100644 index 0000000000..d21c16dd18 --- /dev/null +++ b/javacc/examples/PHP.jj @@ -0,0 +1,636 @@ +/* + + PHP grammar defintion for use with JavaCC + By Satyam (satyam@satyam.com.ar) + + This is a partial grammar which I meant to use in a project of mine. + I refined it a little bit beyond my specific need, but didn't go to the very end. + It works for the purpose of my project, but it is not complete. + + It was tested by parsing all the source files in the PHP 5.0 test suite, + and a couple of other applications (a CMS and an image gallery). + Some files in these sets were skipped because they use syntax not supported + in this parser, as noted in the TODO lists below. + + +TODO: + +- Alternate notation for control flow, if: endif, etc. +- Curly braces to disambiguate variable variable array references: ${$a[1]} against ${$a}[1] +- Notice comment on line 555 +- There are a couple of warnings when compiling which I wasn't able to solve nor was I able + to figure out if they mattered at all. +*/ + +options { + DEBUG_PARSER = true; + DEBUG_LOOKAHEAD = false; + DEBUG_TOKEN_MANAGER = false; +} + + +PARSER_BEGIN(PHP) + +import java.util.*; + +public class PHP { + private static PHP parser ; + + public static void main ( String args [ ] ) { + + if(args.length == 0){ + System.out.println("PHP Parser Version 0.1Alpha: Reading from standard input . . ."); + parser = new PHP(System.in); + } else if (args.length == 1) { + System.out.println("PHP Parser Version 0.1Alpha: Reading from file " + args[0] + " . . ." ); + try { + parser = new PHP(new java.io.FileInputStream(args[0])); + } + catch(java.io.FileNotFoundException e){ + System.out.println("PHP Parser Version 0.1: File " + args[0] + " not found."); + return ; + } + } else { + System.out.println("PHP Parser Version 0.1Alpha: Usage is one of:"); + System.out.println(" java PHP < inputfile"); + System.out.println("OR"); + System.out.println(" java PHP inputfile"); + return ; + } + parser.token_source.SwitchTo(HTML_STATE); + try { + parser.PhpPage(); + System.out.println("PHP Parser Version 0.1Alpha: PHP program parsed successfully."); + } + catch(ParseException e) { + System.out.println("PHP Parser Version 0.1Alpha: Encountered errors during parse."); + System.out.println(e.getMessage()); + } + } +} + +PARSER_END(PHP) + +TOKEN_MGR_DECLS : { + static String HereDocEnd; +} + + TOKEN [IGNORE_CASE]: { + : DEFAULT | + +} + + TOKEN : { + +} + + SKIP : +{ " " +| "\t" +| "\n" +| "\r" +| +| +| +} + + TOKEN : +{ (["l","L"])? | (["l","L"])? | (["l","L"])?> +| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*> +| <#HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+> +| <#OCTAL_LITERAL: "0" (["0"-"7"])*> +| )? (["f","F","d","D"])? | "." (["0"-"9"])+ ()? (["f","F","d","D"])? | (["0"-"9"])+ (["f","F","d","D"])? | (["0"-"9"])+ ()? ["f","F","d","D"]> +| <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+> +| : DOUBLE_STRING_LITERAL +| : SINGLE_STRING_LITERAL +| : HEREDOC1 +} + + MORE: { + <"\\">: SSL_SPECIAL +} + + TOKEN: { + : DEFAULT +} + + MORE: +{ <(~[])> +} + + MORE: +{ <["'" , "\\"] > : SINGLE_STRING_LITERAL +| < ~[]> : SINGLE_STRING_LITERAL +} + + TOKEN: { + : DEFAULT +} + + TOKEN: +{ :DSL_SIMPLE_VAR +| :DSL_COMPLEX_VAR +} + + MORE: { + <"\\"> : DSL_SPECIAL +} + + MORE: { + +} + + TOKEN: { + :DOUBLE_STRING_LITERAL +} + + MORE: { + +} + + TOKEN: +{ ("[" "]") ? > :DOUBLE_STRING_LITERAL +} + + TOKEN: +{ :DEFAULT +} + + TOKEN: +{ :DOUBLE_STRING_LITERAL +} + + MORE: { + <["n","t","b","r","f","\\","\"","$","{"]> :DOUBLE_STRING_LITERAL | + <(["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"])> :DOUBLE_STRING_LITERAL | + <("x" | "X") ["0"-"9","A"-"F","a"-"f"](["0"-"9","A"-"F","a"-"f"])?> :DOUBLE_STRING_LITERAL | + < ~[]>:DOUBLE_STRING_LITERAL +} + + + SKIP: { + > { + HereDocEnd = image.toString(); + } :HEREDOC +} + SKIP: { + <~["\n"]> | + <"\n"> :HEREDOC2 +} + + SKIP: { + < "\r" | " " > +} + + SKIP: { + <"\n"> | + > + { + SwitchTo( HereDocEnd.equals(image.toString()) ? DEFAULT : HEREDOC ) ; + } | + <~[] > :HEREDOC +} + + TOKEN : { + | + | + | + | + + | + + | + | + + | + | + | + | + + | + + | + + | + + | + | + + | + | + + | + | + | + | + | + | + | + + | + + | + | + | + | + | + | + | + | + | + | + | + | + | + | + + | + + | + + | + + | + + " > : HTML_STATE | + :VAR_NAME_STATE | + +| +| +| +} + + TOKEN : +{ ( | )*> : DEFAULT +| <#LETTER1: ["A"-"Z","_","a"-"z"]> +| <#DIGIT1: ["0"-"9"]> +| +} + + TOKEN: { + +} + + + TOKEN : { + ( | )*> +| <#LETTER: ["A"-"Z","_","a"-"z"]> +| <#DIGIT: ["0"-"9"]> +} + +void PhpPage() : {} +{ + (HtmlBlock())* + ( + (Statement())* + | + ) +} + +void HtmlBlock() : {} +{ +| +| Expression() +} + +void Statement() : {} +{ + LOOKAHEAD(2) LabeledStatement() | + LOOKAHEAD(2) ClassDeclaration() | + LOOKAHEAD(2) InterfaceDeclaration() | + LOOKAHEAD(2) ExpressionStatement() | + CompoundStatement() | + SelectionStatement() | + IterationStatement() | + JumpStatement() | + IncludeStatement() | + EchoStatement() | + DefineStatement() | + MemberDeclaration() +| ThrowStatement() +| TryBlock() +| EndOfStatement() +} + +void ThrowStatement() : {} +{ + ClassInstantiation() EndOfStatement() +} + +void TryBlock() : {} +{ + CompoundStatement() ( "(" Variable() ")" CompoundStatement())+ +} + +void EndOfStatement() : {} +{ + ";" | EmbeddedHtml() +} + +void EmbeddedHtml() : {} +{ ( | )* + ( + + | + ) +} + +void DefineStatement() : {} +{ + "(" String() "," Expression() ")" EndOfStatement() +} + +void LabeledStatement() : {} +{ + Expression() ":" Statement() | + ":" Statement() +} + +void ExpressionStatement() : {} +{ + Expression() EndOfStatement() +} + +void CompoundStatement() : {} +{ + "{" + ( Statement())* + "}" +} + +void SelectionStatement() : {} +{ + "(" Expression() ")" Statement() ( LOOKAHEAD(2) "(" Expression() ")" Statement() )* [ LOOKAHEAD(2) Statement() ] | + "(" Expression() ")" Statement() +} + +void IterationStatement() : {} +{ + "(" Expression() ")" Statement() | + Statement() "(" Expression() ")" EndOfStatement() | + "(" [ Expression() ] ";" [ Expression() ] ";" [ Expression() ] ")" Statement() | + "(" [Expression() ] Variable() ( "=>" ["&"] Variable())? ")" Statement() +} + +void JumpStatement() : {} +{ + [] EndOfStatement() | + [] EndOfStatement() | + [ Expression() ] EndOfStatement() +} + + +void ParameterList() : {} +{ + Parameter() (LOOKAHEAD(2) "," Parameter())* +} + +void Parameter() : {} +{ + [ ] ["&"] Variable() ( "=" Expression())? +} + + +void ClassDeclaration() : {} +{ + [ | ] [ ] [ ( "," ) * ] ClassMembers() +} + +void ClassMembers() : {} +{ + "{" (MemberDeclaration() )* "}" +} + +void MemberDeclaration() : {} +{ + LOOKAHEAD( ( | Visibility() | )* ) ( | Visibility() | )* ["&"] "(" [ParameterList()] ")" CompoundStatement() | + LOOKAHEAD([Visibility()] ) [Visibility()] "=" Expression() EndOfStatement() | + ( | Visibility() | )* [ "=" Expression() ] ("," [ "=" Expression() ])* EndOfStatement() | + Variable() ("," Variable())* EndOfStatement() | + [Visibility()] [] ["&"] "(" [ParameterList()] ")" EndOfStatement() + +} + +void InterfaceDeclaration() : {} +{ + [ ("," )* ] InterfaceMembers() +} + +void InterfaceMembers() : {} +{ + "{" ( [] InterfaceMember() EndOfStatement() )* "}" +} + +void InterfaceMember() : {} +{ + [] ["&"] "(" [ParameterList()] ")" ["{" "}" ]| + ("," )* | + "=" Expression() +} + +void IncludeStatement() : {} +{ + ["@"] ( | | | ) (LOOKAHEAD(2) "(" Expression() ")" | Expression() ) EndOfStatement() +} + +void EchoStatement() : {} +{ + ( | ) ArgumentExpressionList() EndOfStatement() +} + +void Expression() : {} +{ + LogicalTextOrExpression() +} + +void LogicalTextOrExpression() :{} +{ + LogicalTextXorExpression() [LOOKAHEAD(2) LogicalTextOrExpression() ] +} + +void LogicalTextXorExpression() : {} +{ + LogicalTextAndExpression() [LOOKAHEAD(2) LogicalTextXorExpression() ] +} + +void LogicalTextAndExpression() : {} +{ + AssignmentExpression() [LOOKAHEAD(2) LogicalTextAndExpression() ] +} + +void AssignmentExpression() : {} +{ + ConditionalExpression() [LOOKAHEAD(2) AssignmentOperator() Expression()] +} + +void AssignmentOperator() : {} +{ + ( "=" | "+=" | "-=" | "*=" | "/=" | ".=" | "%=" | "&=" | "|=" | "^=" | "<<=" | ">>=" ) +} + +void ConditionalExpression() : {} +{ + Logical_Or_Expression() [LOOKAHEAD(2) "?" Expression() ":" Expression() ] +} + + +void Logical_Or_Expression() : {} +{ + Logical_And_Expression() [LOOKAHEAD(2) "||" Logical_Or_Expression() ] +} + +void Logical_And_Expression() : {} +{ + BitwiseOrExpression() [LOOKAHEAD(2) "&&" Logical_And_Expression() ] +} + +void BitwiseOrExpression() : {} +{ + BitwiseXorExpression() [LOOKAHEAD(2) "|" BitwiseOrExpression() ] +} + +void BitwiseXorExpression() : {} +{ + BitwiseAndExpression() [LOOKAHEAD(2) "^" BitwiseXorExpression() ] +} + +void BitwiseAndExpression() : {} +{ + EqualityExpression() [LOOKAHEAD(2) "&" BitwiseAndExpression() ] +} + +void EqualityExpression() : {} +{ + RelationalExpression() [LOOKAHEAD(2) ( "==" | "!=" | "===" | "!==" ) EqualityExpression() ] +} + +void RelationalExpression() : {} +{ + ShiftExpression() [LOOKAHEAD(2) ( "<" | ">" | "<=" | ">=" ) RelationalExpression() ] +} + +void ShiftExpression() : {} +{ + AdditiveExpression() [LOOKAHEAD(2) ( "<<" | ">>" ) ShiftExpression() ] +} + +void AdditiveExpression() : {} +{ + MultiplicativeExpression() [LOOKAHEAD(2) ( "+" | "-" | "." ) AdditiveExpression() ] +} + +void MultiplicativeExpression() : {} +{ + CastExpression() [LOOKAHEAD(2) ( "*" | "/" | "%" ) MultiplicativeExpression() ] +} + +void CastExpression() : {} +{ + [ LOOKAHEAD("(" ")") "(" ")" ] UnaryExpression() +} + +void UnaryExpression() : {} +{ + ("&" | "-" | "~" | "!")* PrefixIncDecExpression() +} + +void PrefixIncDecExpression() : {} +{ + ("++" | "--" )* PostfixIncDecExpression() +} + +void PostfixIncDecExpression() : {} +{ + InstanceOfExpression() ("++" | "--" )* +} + +void InstanceOfExpression() : {} +{ + PostfixExpression() [LOOKAHEAD(2) Expression() ] +} + +void PostfixExpression() : {} +{ + PrimaryExpression() ( "(" ArgumentExpressionList() ")" | + "->" PostfixExpression() | /* TODO: There is a problem here. Variable members + can have reserved names since they are preceded + by a $, but the $ is ommitted here and this + parser will complain. If you have declared: + private $array + you can have: + $this->array + which is fine with PHP, + but will generate an error in this parser */ + + "::" PostfixExpression() | + "[" [ Expression()] "]" | + "{" Expression() "}" + )* +} + +void PrimaryExpression() : {} +{ + + LOOKAHEAD(2) ["@"] Variable() | + ["@"] Constant() | + "(" Expression() ")" | + ClassInstantiation() | + Array() +} + +void Array() : {} +{ + "(" [Expression() ["=>" Expression() ]] ( "," Expression() ["=>" Expression()] )* ")" +} + +void ClassInstantiation() : {} +{ + Expression() [LOOKAHEAD(3) "(" ArgumentExpressionList() ")"] | + Variable() +} + + +void Variable() : {} +{ + ()* +} + + +void ArgumentExpressionList() : {} +{ + [Expression()] ( "," Expression() )* +} + +void Constant() : {} +{ + | | String() | | +} + +void String() : {} +{ + DoubleStringLiteral() | + | + +} + +void DoubleStringLiteral() : {} +{ + + ( + LOOKAHEAD(2) + | ( + + ( + + | + ) + | + )* + ) +} + +void Visibility() : {} +{ + | | +} \ No newline at end of file diff --git a/javacc/examples/SPL.jjt b/javacc/examples/SPL.jjt new file mode 100644 index 0000000000..2c4728f487 --- /dev/null +++ b/javacc/examples/SPL.jjt @@ -0,0 +1,366 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +options { + MULTI=true; + NODE_EXTENDS="MyNode"; + TRACK_TOKENS=true; +} + +PARSER_BEGIN(SPLParser) +class SPLParser { +} +PARSER_END(SPLParser) + + +SKIP : /* WHITE SPACE */ +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +TOKEN : /* Types */ +{ + < INT: "int" > + | + < BOOL: "boolean" > +} + +TOKEN : /* LITERALS */ +{ + < INTEGER_LITERAL: ()+ > +} + +/* + * Program structuring syntax follows. + */ + +/** Compilation unit. */ +void CompilationUnit() : +{ + String name; +} +{ + ( + VarDeclaration() ";" + | + Statement() + )* + +} + +/** Variable declaration. */ +void VarDeclaration() : +{ Token t; } +{ + ( + "boolean" { jjtThis.type = BOOL; } + | + "int" { jjtThis.type = INT; } + ) + t = + { jjtThis.name = t.image; } +} + +/* + * Expression syntax follows. + */ + +/** Expression. */ +void Expression() #void: +{} +{ + LOOKAHEAD( PrimaryExpression() "=" ) + Assignment() +| + ConditionalOrExpression() +} + +/** Assignment. */ +void Assignment() #Assignment(2) : +{} +{ + PrimaryExpression() "=" Expression() +} + +/** Conditional or expression. */ +void ConditionalOrExpression() #void : +{} +{ + ConditionalAndExpression() + ( "||" ConditionalAndExpression() #OrNode(2) )* +} + +/** Conditional and expression. */ +void ConditionalAndExpression() #void : +{} +{ + InclusiveOrExpression() + ( "&&" InclusiveOrExpression() #AndNode(2) )* +} + +/** Inclusive or expression. */ +void InclusiveOrExpression() #void : +{} +{ + ExclusiveOrExpression() + ( "|" ExclusiveOrExpression() #BitwiseOrNode(2) )* +} + +/** Exclusive or expression. */ +void ExclusiveOrExpression() #void : +{} +{ + AndExpression() + ( "^" AndExpression() #BitwiseXorNode(2) )* +} + +/** And expression. */ +void AndExpression() #void : +{} +{ + EqualityExpression() + ( "&" EqualityExpression() #BitwiseAndNode(2) )* +} + +/** Equality expression. */ +void EqualityExpression() #void : +{} +{ + RelationalExpression() + ( + "==" RelationalExpression() #EQNode(2) + | + "!=" RelationalExpression() #NENode(2) + )* +} + +/** Relational expression. */ +void RelationalExpression() #void : +{} +{ + AdditiveExpression() + ( + "<" AdditiveExpression() #LTNode(2) + | + ">" AdditiveExpression() #GTNode(2) + | + "<=" AdditiveExpression() #LENode(2) + | + ">=" AdditiveExpression() #GENode(2) + )* +} + +/** Additive expression. */ +void AdditiveExpression() #void : +{} +{ + MultiplicativeExpression() + ( + "+" MultiplicativeExpression() #AddNode(2) + | + "-" MultiplicativeExpression() #SubtractNode(2) + )* +} + +/** Multiplicative expression. */ +void MultiplicativeExpression() #void : +{} +{ + UnaryExpression() + ( + "*" UnaryExpression() #MulNode(2) + | + "/" UnaryExpression() #DivNode(2) + | + "%" UnaryExpression() #ModNode(2) + )* +} + +/** Unary expression. */ +void UnaryExpression() #void : +{} +{ + "~" UnaryExpression() #BitwiseComplNode(1) +| + "!" UnaryExpression() #NotNode(1) +| + PrimaryExpression() +} + +/** Primary expression. */ +void PrimaryExpression() #void : +{ + String name; +} +{ + Literal() +| + Id() +| + "(" Expression() ")" +} + +/** An Id. */ +void Id() : +{ + Token t; +} +{ + t = { jjtThis.name = t.image; } +} + +/** A literal. */ +void Literal() #void : +{ + Token t; +} +{ + ( + t= + { + jjtThis.val = Integer.parseInt(t.image); + } + )#IntConstNode +| + BooleanLiteral() +} + +/** A boolean literal. */ +void BooleanLiteral() #void : +{} +{ + "true" #TrueNode +| + "false" #FalseNode +} + +/* + * Statement syntax follows. + */ + +/** A statement. */ +void Statement() #void : +{} +{ + ";" +| + LOOKAHEAD(2) + LabeledStatement() +| + Block() +| + StatementExpression() +| + IfStatement() +| + WhileStatement() +| + IOStatement() +} + +/** A labeled statement. */ +void LabeledStatement() #void : +{} +{ + ":" Statement() +} + +/** A block. */ +void Block() : +{} +{ + "{" ( Statement() )* "}" +} + +/** A statement expression. */ +void StatementExpression() : +/* + * The last expansion of this production accepts more than the legal + * SPL expansions for StatementExpression. + */ +{} +{ + Assignment() ";" +} + +/** An if statement. */ +void IfStatement() : +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +{} +{ + "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] +} + +/** A while statement. */ +void WhileStatement() : +{} +{ + "while" "(" Expression() ")" Statement() +} + +/** An IO statement. */ +void IOStatement() #void : +{ String name; } +{ + ReadStatement() + | + WriteStatement() +} + +/** A read statement. */ +void ReadStatement() : +{ Token t; } +{ + "read" t = + { jjtThis.name = t.image; } +} + +/** A write statement. */ +void WriteStatement() : +{ Token t; } +{ + "write" t = + { jjtThis.name = t.image; } +} + +TOKEN : /* IDENTIFIERS */ +{ + < IDENTIFIER: (|)* > +| + < #LETTER: [ "a"-"z", "A"-"Z" ] > +| + < #DIGIT: [ "0"-"9"] > +} diff --git a/javacc/examples/Simple1.jj b/javacc/examples/Simple1.jj new file mode 100644 index 0000000000..d160c75e21 --- /dev/null +++ b/javacc/examples/Simple1.jj @@ -0,0 +1,77 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + LOOKAHEAD = 1; + CHOICE_AMBIGUITY_CHECK = 2; + OTHER_AMBIGUITY_CHECK = 1; + STATIC = true; + DEBUG_PARSER = false; + DEBUG_LOOKAHEAD = false; + DEBUG_TOKEN_MANAGER = false; + ERROR_REPORTING = true; + JAVA_UNICODE_ESCAPE = false; + UNICODE_INPUT = false; + IGNORE_CASE = false; + USER_TOKEN_MANAGER = false; + USER_CHAR_STREAM = false; + BUILD_PARSER = true; + BUILD_TOKEN_MANAGER = true; + SANITY_CHECK = true; + FORCE_LA_CHECK = false; +} + +PARSER_BEGIN(Simple1) + +/** Simple brace matcher. */ +public class Simple1 { + + /** Main entry point. */ + public static void main(String args[]) throws ParseException { + Simple1 parser = new Simple1(System.in); + parser.Input(); + } + +} + +PARSER_END(Simple1) + +/** Root production. */ +void Input() : +{} +{ + MatchedBraces() ("\n"|"\r")* +} + +/** Brace matching production. */ +void MatchedBraces() : +{} +{ + "{" [ MatchedBraces() ] "}" +} diff --git a/javacc/examples/Simple2.jj b/javacc/examples/Simple2.jj new file mode 100644 index 0000000000..39b287baa8 --- /dev/null +++ b/javacc/examples/Simple2.jj @@ -0,0 +1,65 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Simple2) + +/** Simple brace matcher. */ +public class Simple2 { + + /** Main entry point. */ + public static void main(String args[]) throws ParseException { + Simple2 parser = new Simple2(System.in); + parser.Input(); + } + +} + +PARSER_END(Simple2) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +/** Root production. */ +void Input() : +{} +{ + MatchedBraces() +} + +/** Brace matching production. */ +void MatchedBraces() : +{} +{ + "{" [ MatchedBraces() ] "}" +} diff --git a/javacc/examples/Simple3.jj b/javacc/examples/Simple3.jj new file mode 100644 index 0000000000..aedef44929 --- /dev/null +++ b/javacc/examples/Simple3.jj @@ -0,0 +1,73 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +PARSER_BEGIN(Simple3) + +/** Simple brace matcher. */ +public class Simple3 { + + /** Main entry point. */ + public static void main(String args[]) throws ParseException { + Simple3 parser = new Simple3(System.in); + parser.Input(); + } + +} + +PARSER_END(Simple3) + +SKIP : +{ + " " +| "\t" +| "\n" +| "\r" +} + +TOKEN : +{ + +| +} + +/** Root production. */ +void Input() : +{ int count; } +{ + count=MatchedBraces() + { System.out.println("The levels of nesting is " + count); } +} + +/** Brace counting production. */ +int MatchedBraces() : +{ int nested_count=0; } +{ + [ nested_count=MatchedBraces() ] + { return ++nested_count; } +} diff --git a/javacc/examples/ToyJava.jjt b/javacc/examples/ToyJava.jjt new file mode 100644 index 0000000000..ef014106cd --- /dev/null +++ b/javacc/examples/ToyJava.jjt @@ -0,0 +1,1074 @@ +/* Copyright (c) 2006, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +options { + MULTI = true; + NODE_DEFAULT_VOID = true; + JAVA_UNICODE_ESCAPE = true; +} + +PARSER_BEGIN(ToyParser) + +import java.io.*; + +public class ToyParser { + + public static void main(String args[]) throws Exception { + ToyParser parser; + ASTCompilationUnit node; + if (args.length == 2) { + System.out.println("Toy Preprocessor: Reading from file " + args[0] + " . . ."); + try { + parser = new ToyParser(new FileInputStream(args[0])); + } catch (FileNotFoundException e) { + System.out.println("Toy Preprocessor: File " + args[0] + " not found."); + return; + } + } else { + System.out.println("Toy Preprocessor: Usage is \"java ToyParser inputfile outputfile\""); + return; + } + try { + node = parser.CompilationUnit(); + PrintWriter ostr = new PrintWriter(new FileWriter(args[1])); + node.process(ostr); + ostr.close(); + System.out.println("Toy Preprocessor: Transformation completed successfully."); + } catch (ParseException e) { + System.out.println("Toy Preprocessor: Encountered errors during parse."); + } catch (IOException e) { + System.out.println("Toy Preprocessor: Could not create file " + args[1]); + } + } + +} + +PARSER_END(ToyParser) + + +SPECIAL_TOKEN : /* WHITE SPACE */ +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +SPECIAL_TOKEN : /* COMMENTS */ +{ + +| +| +} + +TOKEN : /* RESERVED WORDS AND LITERALS */ +{ + < 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 : /* LITERALS */ +{ + < INTEGER_LITERAL: + (["l","L"])? + | (["l","L"])? + | (["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"])* ()? (["f","F","d","D"])? + | "." (["0"-"9"])+ ()? (["f","F","d","D"])? + | (["0"-"9"])+ (["f","F","d","D"])? + | (["0"-"9"])+ ()? ["f","F","d","D"] + > +| + < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > +| + < CHARACTER_LITERAL: + "'" + ( (~["'","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + ) + "'" + > +| + < STRING_LITERAL: + "\"" + ( (~["\"","\\","\n","\r"]) + | ("\\" + ( ["n","t","b","r","f","\\","'","\""] + | ["0"-"7"] ( ["0"-"7"] )? + | ["0"-"3"] ["0"-"7"] ["0"-"7"] + ) + ) + )* + "\"" + > +} + +TOKEN : /* IDENTIFIERS */ +{ + < IDENTIFIER: (|)* > +| + < #LETTER: + [ + "\u0024", + "\u0041"-"\u005a", + "\u005f", + "\u0061"-"\u007a", + "\u00c0"-"\u00d6", + "\u00d8"-"\u00f6", + "\u00f8"-"\u00ff", + "\u0100"-"\u1fff", + "\u3040"-"\u318f", + "\u3300"-"\u337f", + "\u3400"-"\u3d2d", + "\u4e00"-"\u9fff", + "\uf900"-"\ufaff" + ] + > +| + < #DIGIT: + [ + "\u0030"-"\u0039", + "\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 : /* SEPARATORS */ +{ + < LPAREN: "(" > +| < RPAREN: ")" > +| < LBRACE: "{" > +| < RBRACE: "}" > +| < LBRACKET: "[" > +| < RBRACKET: "]" > +| < SEMICOLON: ";" > +| < COMMA: "," > +| < DOT: "." > +} + +TOKEN : /* OPERATORS */ +{ + < 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: ">>>=" > +} + + +/***************************************** + * THE JAVA LANGUAGE GRAMMAR STARTS HERE * + *****************************************/ + +/* + * Program structuring syntax follows. + */ + +ASTCompilationUnit CompilationUnit() #CompilationUnit : +{} +{ + { + jjtThis.setFirstToken(getToken(1)); + } + [ PackageDeclaration() ] + ( ImportDeclaration() )* + ( TypeDeclaration() )* + + { + return jjtThis; + } +} + +void PackageDeclaration() : +{} +{ + "package" Name() ";" +} + +void ImportDeclaration() : +{} +{ + "import" Name() [ "." "*" ] ";" +} + +void TypeDeclaration() : +{} +{ + LOOKAHEAD( ( "abstract" | "final" | "public" )* "class" ) + ClassDeclaration() +| + InterfaceDeclaration() +| + ";" +} + + +/* + * Declaration syntax follows. + */ + +void ClassDeclaration() : +{} +{ + ( "abstract" | "final" | "public" )* + UnmodifiedClassDeclaration() +} + +void UnmodifiedClassDeclaration() : +{} +{ + "class" [ "extends" Name() ] [ "implements" NameList() ] + ClassBody() +} + +void ClassBody() : +{} +{ + "{" ( ClassBodyDeclaration() )* "}" +} + +void NestedClassDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedClassDeclaration() +} + +void ClassBodyDeclaration() : +{} +{ + LOOKAHEAD(2) + Initializer() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( [ "public" | "protected" | "private" ] Name() "(" ) + ConstructorDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +// This production is to determine lookahead only. +void MethodDeclarationLookahead() : +{} +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() "(" +} + +void InterfaceDeclaration() : +{} +{ + ( "abstract" | "public" )* + UnmodifiedInterfaceDeclaration() +} + +void NestedInterfaceDeclaration() : +{} +{ + ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* + UnmodifiedInterfaceDeclaration() +} + +void UnmodifiedInterfaceDeclaration() : +{} +{ + "interface" [ "extends" NameList() ] + "{" ( InterfaceMemberDeclaration() )* "}" +} + +void InterfaceMemberDeclaration() : +{} +{ + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "class" ) + NestedClassDeclaration() +| + LOOKAHEAD( ( "static" | "abstract" | "final" | "public" | "protected" | "private" )* "interface" ) + NestedInterfaceDeclaration() +| + LOOKAHEAD( MethodDeclarationLookahead() ) + MethodDeclaration() +| + FieldDeclaration() +} + +void FieldDeclaration() : +{} +{ + ( "public" | "protected" | "private" | "static" | "final" | "transient" | "volatile" )* + Type() VariableDeclarator() ( "," VariableDeclarator() )* ";" +} + +void VariableDeclarator() : +{} +{ + VariableDeclaratorId() [ "=" VariableInitializer() ] +} + +void VariableDeclaratorId() : +{} +{ + ( "[" "]" )* +} + +void VariableInitializer() : +{} +{ + ArrayInitializer() +| + Expression() +} + +void ArrayInitializer() : +{} +{ + "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}" +} + +void MethodDeclaration() : + { + Token t; + } +{ + ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )* + ResultType() MethodDeclarator() [ "throws" NameList() ] + ( + { + t = getToken(1); + } + Block() + [ + ( + ( + ( "catch" "(" FormalParameter() ")" Block() )+ + [ "finally" Block() ] + | + "finally" Block() + ) + { + jjtThis.setFirstToken(t); + jjtThis.setLastToken(getToken(0)); + } + ) #SpecialBlock + ] + | + ";" + ) +} + +void MethodDeclarator() : +{} +{ + FormalParameters() ( "[" "]" )* +} + +void FormalParameters() : +{} +{ + "(" [ FormalParameter() ( "," FormalParameter() )* ] ")" +} + +void FormalParameter() : +{} +{ + [ "final" ] Type() VariableDeclaratorId() +} + +void ConstructorDeclaration() : +{} +{ + [ "public" | "protected" | "private" ] + FormalParameters() [ "throws" NameList() ] + "{" + [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ] + ( BlockStatement() )* + "}" +} + +void ExplicitConstructorInvocation() : +{} +{ + LOOKAHEAD("this" Arguments() ";") + "this" Arguments() ";" +| + [ LOOKAHEAD(2) PrimaryExpression() "." ] "super" Arguments() ";" +} + +void Initializer() : +{} +{ + [ "static" ] Block() +} + + +/* + * Type, name and expression syntax follows. + */ + +void Type() : +{} +{ + ( PrimitiveType() | Name() ) ( "[" "]" )* +} + +void PrimitiveType() : +{} +{ + "boolean" +| + "char" +| + "byte" +| + "short" +| + "int" +| + "long" +| + "float" +| + "double" +} + +void ResultType() : +{} +{ + "void" +| + Type() +} + +void Name() : +/* + * A lookahead of 2 is required below since "Name" can be followed + * by a ".*" when used in the context of an "ImportDeclaration". + */ +{} +{ + + ( LOOKAHEAD(2) "." + )* +} + +void NameList() : +{} +{ + Name() + ( "," Name() + )* +} + + +/* + * Expression syntax follows. + */ + +void Expression() : +{} +{ + LOOKAHEAD( PrimaryExpression() AssignmentOperator() ) + Assignment() +| + ConditionalExpression() +} + +void Assignment() : +{} +{ + PrimaryExpression() AssignmentOperator() Expression() +} + +void AssignmentOperator() : +{} +{ + "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" +} + +void ConditionalExpression() : +{} +{ + ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() ] +} + +void ConditionalOrExpression() : +{} +{ + ConditionalAndExpression() ( "||" ConditionalAndExpression() )* +} + +void ConditionalAndExpression() : +{} +{ + InclusiveOrExpression() ( "&&" InclusiveOrExpression() )* +} + +void InclusiveOrExpression() : +{} +{ + ExclusiveOrExpression() ( "|" ExclusiveOrExpression() )* +} + +void ExclusiveOrExpression() : +{} +{ + AndExpression() ( "^" AndExpression() )* +} + +void AndExpression() : +{} +{ + EqualityExpression() ( "&" EqualityExpression() )* +} + +void EqualityExpression() : +{} +{ + InstanceOfExpression() ( ( "==" | "!=" ) InstanceOfExpression() )* +} + +void InstanceOfExpression() : +{} +{ + RelationalExpression() [ "instanceof" Type() ] +} + +void RelationalExpression() : +{} +{ + ShiftExpression() ( ( "<" | ">" | "<=" | ">=" ) ShiftExpression() )* +} + +void ShiftExpression() : +{} +{ + AdditiveExpression() ( ( "<<" | ">>" | ">>>" ) AdditiveExpression() )* +} + +void AdditiveExpression() : +{} +{ + MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )* +} + +void MultiplicativeExpression() : +{} +{ + UnaryExpression() ( ( "*" | "/" | "%" ) UnaryExpression() )* +} + +void UnaryExpression() : +{} +{ + ( "+" | "-" ) UnaryExpression() +| + PreIncrementExpression() +| + PreDecrementExpression() +| + UnaryExpressionNotPlusMinus() +} + +void PreIncrementExpression() : +{} +{ + "++" PrimaryExpression() +} + +void PreDecrementExpression() : +{} +{ + "--" PrimaryExpression() +} + +void UnaryExpressionNotPlusMinus() : +{} +{ + ( "~" | "!" ) UnaryExpression() +| + LOOKAHEAD( CastLookahead() ) + CastExpression() +| + PostfixExpression() +} + +// This production is to determine lookahead only. The LOOKAHEAD specifications +// below are not used, but they are there just to indicate that we know about +// this. +void CastLookahead() : +{} +{ + LOOKAHEAD(2) + "(" PrimitiveType() +| + LOOKAHEAD("(" Name() "[") + "(" Name() "[" "]" +| + "(" Name() ")" ( "~" | "!" | "(" | | "this" | "super" | "new" | Literal() ) +} + +void PostfixExpression() : +{} +{ + PrimaryExpression() [ "++" | "--" ] +} + +void CastExpression() : +{} +{ + LOOKAHEAD("(" PrimitiveType()) + "(" Type() ")" UnaryExpression() +| + LOOKAHEAD("(" Name()) + "(" Type() ")" UnaryExpressionNotPlusMinus() +} + +void PrimaryExpression() : +{} +{ + PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* +} + +void PrimaryPrefix() : +{} +{ + Literal() +| + Name() +| + "this" +| + "super" "." +| + "(" Expression() ")" +| + AllocationExpression() +} + +void PrimarySuffix() : +{} +{ + LOOKAHEAD(2) + "." "this" +| + LOOKAHEAD(2) + "." "class" +| + LOOKAHEAD(2) + "." AllocationExpression() +| + "[" Expression() "]" +| + "." +| + Arguments() +} + +void Literal() : +{} +{ + +| + +| + +| + +| + BooleanLiteral() +| + NullLiteral() +} + +void BooleanLiteral() : +{} +{ + "true" +| + "false" +} + +void NullLiteral() : +{} +{ + "null" +} + +void Arguments() : +{} +{ + "(" [ ArgumentList() ] ")" +} + +void ArgumentList() : +{} +{ + Expression() ( "," Expression() )* +} + +void AllocationExpression() : +{} +{ + LOOKAHEAD(2) + "new" PrimitiveType() ArrayDimensions() [ ArrayInitializer() ] +| + "new" Name() + ( + ArrayDimensions() [ ArrayInitializer() ] + | + Arguments() [ ClassBody() ] + ) +} + +/* + * The second LOOKAHEAD specification below is to parse to PrimarySuffix + * if there is an expression between the "[...]". + */ +void ArrayDimensions() : +{} +{ + ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )* +} + + +/* + * Statement syntax follows. + */ + +void Statement() : +{} +{ + LOOKAHEAD(2) + LabeledStatement() +| + Block() +| + EmptyStatement() +| + StatementExpression() ";" +| + SwitchStatement() +| + IfStatement() +| + WhileStatement() +| + DoStatement() +| + ForStatement() +| + BreakStatement() +| + ContinueStatement() +| + ReturnStatement() +| + ThrowStatement() +| + SynchronizedStatement() +| + TryStatement() +} + +void LabeledStatement() : +{} +{ + ":" Statement() +} + +void Block() : +{} +{ + "{" ( BlockStatement() )* "}" +} + +void BlockStatement() : +{} +{ + LOOKAHEAD([ "final" ] Type() ) + LocalVariableDeclaration() ";" +| + Statement() +| + UnmodifiedClassDeclaration() +| + UnmodifiedInterfaceDeclaration() +} + +void LocalVariableDeclaration() : +{} +{ + [ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )* +} + +void EmptyStatement() : +{} +{ + ";" +} + +void StatementExpression() : +/* + * The last expansion of this production accepts more than the legal + * Java expansions for StatementExpression. + */ +{} +{ + PreIncrementExpression() +| + PreDecrementExpression() +| + LOOKAHEAD( PrimaryExpression() AssignmentOperator() ) + Assignment() +| + PostfixExpression() +} + +void SwitchStatement() : +{} +{ + "switch" "(" Expression() ")" "{" + ( SwitchLabel() ( BlockStatement() )* )* + "}" +} + +void SwitchLabel() : +{} +{ + "case" Expression() ":" +| + "default" ":" +} + +void IfStatement() : +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +{} +{ + "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] +} + +void WhileStatement() : +{} +{ + "while" "(" Expression() ")" Statement() +} + +void DoStatement() : +{} +{ + "do" Statement() "while" "(" Expression() ")" ";" +} + +void ForStatement() : +{} +{ + "for" "(" [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ] ")" Statement() +} + +void ForInit() : +{} +{ + LOOKAHEAD( [ "final" ] Type() ) + LocalVariableDeclaration() +| + StatementExpressionList() +} + +void StatementExpressionList() : +{} +{ + StatementExpression() ( "," StatementExpression() )* +} + +void ForUpdate() : +{} +{ + StatementExpressionList() +} + +void BreakStatement() : +{} +{ + "break" [ ] ";" +} + +void ContinueStatement() : +{} +{ + "continue" [ ] ";" +} + +void ReturnStatement() : +{} +{ + "return" [ Expression() ] ";" +} + +void ThrowStatement() : +{} +{ + "throw" Expression() ";" +} + +void SynchronizedStatement() : +{} +{ + "synchronized" "(" Expression() ")" Block() +} + +void TryStatement() : +/* + * Semantic check required here to make sure that at least one + * finally/catch is present. + */ +{} +{ + "try" Block() + ( "catch" "(" FormalParameter() ")" Block() )* + [ "finally" Block() ] +} diff --git a/javacc/pom.xml b/javacc/pom.xml new file mode 100644 index 0000000000..bfe28dcd79 --- /dev/null +++ b/javacc/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + antlr4 + jar + Javacc grammar + + org.antlr.grammars + grammarsv4 + 1.0-SNAPSHOT + + + + + org.antlr + antlr4-maven-plugin + ${antlr.version} + + ${basedir} + + Javacc.g4 + + true + true + + + + + antlr4 + + + + + + com.khubla.antlr + antlr4test-maven-plugin + ${antlr4test-maven-plugin.version} + + false + false + javacc_input + Javacc + + examples/ + + + + + test + + + + + + + diff --git a/javacc/readme.md b/javacc/readme.md new file mode 100644 index 0000000000..bef176985c --- /dev/null +++ b/javacc/readme.md @@ -0,0 +1,21 @@ +# Javacc grammar + +## Authors + +Ken Domino, 2025 + +## Description + +Javacc is a parser generator. This grammar was adapted from the +[JavaCC.jj grammar](https://github.com/javacc/javacc/blob/50a95965a86f59e7d843587b1ce55b5647d00f4e/src/main/javacc/JavaCC.jj). + +## Links + +* https://github.com/javacc/javacc +* https://pldb.io/concepts/javacc.html +* https://en.wikipedia.org/wiki/JavaCC + +## License + +[MIT](https://opensource.org/license/mit) + diff --git a/pom.xml b/pom.xml index 9ef0a26827..21740e4781 100644 --- a/pom.xml +++ b/pom.xml @@ -229,6 +229,7 @@ jam janus java + javacc javadoc javascript joss @@ -321,14 +322,14 @@ rfc3080 robotwars romannumerals - ron + ron rpn ruby rust scala scotty scss - semver + semver sexpression sgf sharc diff --git a/sql/mariadb/MariaDBLexer.g4 b/sql/mariadb/MariaDBLexer.g4 index 1b4c38c24d..fee08d6915 100644 --- a/sql/mariadb/MariaDBLexer.g4 +++ b/sql/mariadb/MariaDBLexer.g4 @@ -215,6 +215,8 @@ STACKED : 'STACKED'; STARTING : 'STARTING'; STATEMENT : 'STATEMENT'; STRAIGHT_JOIN : 'STRAIGHT_JOIN'; +SYSTEM : 'SYSTEM'; +SYSTEM_TIME : 'SYSTEM_TIME'; TABLE : 'TABLE'; TERMINATED : 'TERMINATED'; THEN : 'THEN'; @@ -232,6 +234,7 @@ USAGE : 'USAGE'; USE : 'USE'; USING : 'USING'; VALUES : 'VALUES'; +VERSIONING : 'VERSIONING'; WHEN : 'WHEN'; WHERE : 'WHERE'; WHILE : 'WHILE'; @@ -403,6 +406,7 @@ AT : 'AT'; AUTHORS : 'AUTHORS'; AUTOCOMMIT : 'AUTOCOMMIT'; AUTOEXTEND_SIZE : 'AUTOEXTEND_SIZE'; +AUTO : 'AUTO'; AUTO_INCREMENT : 'AUTO_INCREMENT'; AVG_ROW_LENGTH : 'AVG_ROW_LENGTH'; BEGIN : 'BEGIN'; diff --git a/sql/mariadb/MariaDBParser.g4 b/sql/mariadb/MariaDBParser.g4 index a45c2b1c8c..d4c65b0044 100644 --- a/sql/mariadb/MariaDBParser.g4 +++ b/sql/mariadb/MariaDBParser.g4 @@ -573,6 +573,7 @@ tableOption | tablespaceStorage # tableOptionTablespace | TRANSACTIONAL '='? ('0' | '1') # tableOptionTransactional | UNION '='? '(' tables ')' # tableOptionUnion + | WITH SYSTEM VERSIONING # tableOptionWithSystemVersioning // MariaDB-specific only ; tableType @@ -595,6 +596,19 @@ partitionFunctionDefinition | LINEAR? KEY (ALGORITHM '=' algType = ('1' | '2'))? '(' uidList ')' # partitionFunctionKey | RANGE ('(' expression ')' | COLUMNS '(' uidList ')') # partitionFunctionRange | LIST ('(' expression ')' | COLUMNS '(' uidList ')') # partitionFunctionList + | SYSTEM_TIME (expression | LIMIT expression) ( + STARTS (TIMESTAMP timestampValue | timestampValue) + )? AUTO? partitionSystemVersionDefinitions? # partitionSystemVersion // MariaDB-specific + ; + +// MariaDB-specific +partitionSystemVersionDefinitions + : '(' partitionSystemVersionDefinition (',' partitionSystemVersionDefinition)* ')' + ; + +// MariaDB-specific +partitionSystemVersionDefinition + : PARTITION uid (HISTORY | CURRENT) ; subpartitionFunctionDefinition @@ -709,7 +723,8 @@ alterSpecification | ADD indexFormat = (INDEX | KEY) ifNotExists? uid? indexType? // here ifNotExists is MariaDB-specific only indexColumnNames indexOption* # alterByAddIndex | ADD (CONSTRAINT name = uid?)? PRIMARY KEY index = uid? indexType? indexColumnNames indexOption* # alterByAddPrimaryKey - | ADD (CONSTRAINT name = uid?)? UNIQUE indexFormat = (INDEX | KEY)? ifNotExists? indexName = uid? indexType? indexColumnNames indexOption* #alterByAddUniqueKey + | ADD (CONSTRAINT name = uid?)? UNIQUE indexFormat = (INDEX | KEY)? ifNotExists? indexName = uid? indexType? indexColumnNames indexOption* # + alterByAddUniqueKey | ADD keyType = (FULLTEXT | SPATIAL) indexFormat = (INDEX | KEY)? uid? indexColumnNames indexOption* # alterByAddSpecialIndex | ADD (CONSTRAINT name = uid?)? FOREIGN KEY ifNotExists? // here ifNotExists is MariaDB-specific only indexName = uid? indexColumnNames referenceDefinition # alterByAddForeignKey @@ -1662,7 +1677,7 @@ privilege : ALL PRIVILEGES? | ALTER ROUTINE? | CREATE (TEMPORARY TABLES | ROUTINE | VIEW | USER | TABLESPACE | ROLE)? - | DELETE + | DELETE (HISTORY)? // HISTORY is MariaDB-specific | DROP (ROLE)? | EVENT | EXECUTE @@ -2304,10 +2319,15 @@ dataType ) # spatialDataType | typeName = LONG VARCHAR? BINARY? (charSet charsetName)? (COLLATE collationName)? # longVarcharDataType // LONG VARCHAR is the same as LONG | LONG VARBINARY # longVarbinaryDataType + | UUID # uuidDataType // MariaDB-specific only ; collectionOptions - : '(' STRING_LITERAL (',' STRING_LITERAL)* ')' + : '(' collectionOption (',' collectionOption)* ')' + ; + +collectionOption + : STRING_LITERAL ; convertedDataType @@ -3227,6 +3247,7 @@ keywordsCanBeId | SETVAL | SKIP_ | STATEMENT + | UUID | VIA | MONITOR | READ_ONLY diff --git a/sql/mysql/Positive-Technologies/MySqlLexer.g4 b/sql/mysql/Positive-Technologies/MySqlLexer.g4 index 72da513647..6f57b3d012 100644 --- a/sql/mysql/Positive-Technologies/MySqlLexer.g4 +++ b/sql/mysql/Positive-Technologies/MySqlLexer.g4 @@ -437,7 +437,7 @@ COMMIT : 'COMMIT'; COMPACT : 'COMPACT'; COMPLETION : 'COMPLETION'; COMPRESSED : 'COMPRESSED'; -COMPRESSION : 'COMPRESSION'; +COMPRESSION : 'COMPRESSION' | QUOTE_SYMB? 'COMPRESSION' QUOTE_SYMB?; CONCURRENT : 'CONCURRENT'; CONNECT : 'CONNECT'; CONNECTION : 'CONNECTION'; @@ -768,6 +768,9 @@ WEEK : 'WEEK'; SECOND : 'SECOND'; MICROSECOND : 'MICROSECOND'; +// Azure Database for MySQL Single Server instance: +FIREWALL_RULES: 'FIREWALL_RULES'; + // PRIVILEGES ADMIN : 'ADMIN'; @@ -1089,6 +1092,7 @@ ROW_COUNT : 'ROW_COUNT'; RPAD : 'RPAD'; RTRIM : 'RTRIM'; SEC_TO_TIME : 'SEC_TO_TIME'; +SECONDARY_ENGINE : 'SECONDARY_ENGINE'; SECONDARY_ENGINE_ATTRIBUTE : 'SECONDARY_ENGINE_ATTRIBUTE'; SESSION_USER : 'SESSION_USER'; SHA : 'SHA'; @@ -1169,6 +1173,7 @@ SUBSTRING_INDEX : 'SUBSTRING_INDEX'; SUBTIME : 'SUBTIME'; SYSTEM_USER : 'SYSTEM_USER'; TAN : 'TAN'; +TELEMETRY_LOG_ADMIN : 'TELEMETRY_LOG_ADMIN'; TIMEDIFF : 'TIMEDIFF'; TIMESTAMPADD : 'TIMESTAMPADD'; TIMESTAMPDIFF : 'TIMESTAMPDIFF'; @@ -1272,9 +1277,9 @@ DECIMAL_LITERAL : DEC_DIGIT+; HEXADECIMAL_LITERAL : 'X' '\'' (HEX_DIGIT HEX_DIGIT)+ '\'' | '0X' HEX_DIGIT+; REAL_LITERAL: - DEC_DIGIT* '.' DEC_DIGIT+ + (DEC_DIGIT+)? '.' DEC_DIGIT* | DEC_DIGIT+ '.' EXPONENT_NUM_PART - | DEC_DIGIT* '.' (DEC_DIGIT+ EXPONENT_NUM_PART) + | (DEC_DIGIT+)? '.' (DEC_DIGIT+ EXPONENT_NUM_PART) | DEC_DIGIT+ EXPONENT_NUM_PART ; NULL_SPEC_LITERAL : '\\' 'N'; @@ -1354,4 +1359,4 @@ fragment IP_ADDRESS : [0-9]+ '.' [0-9.]+ | [0-9A-F]* ':' [0-9A-F]* ':' [0 // Last tokens must generate Errors -ERROR_RECONGNIGION: . -> channel(ERRORCHANNEL); +ERROR_RECONGNIGION: . -> channel(ERRORCHANNEL); \ No newline at end of file diff --git a/sql/mysql/Positive-Technologies/MySqlParser.g4 b/sql/mysql/Positive-Technologies/MySqlParser.g4 index 65ec8eeea4..9f8993ba1d 100644 --- a/sql/mysql/Positive-Technologies/MySqlParser.g4 +++ b/sql/mysql/Positive-Technologies/MySqlParser.g4 @@ -237,7 +237,7 @@ createLogfileGroup ; createProcedure - : CREATE ownerStatement? PROCEDURE fullId '(' procedureParameter? (',' procedureParameter)* ')' routineOption* routineBody + : CREATE ownerStatement? PROCEDURE ifNotExists? fullId '(' procedureParameter? (',' procedureParameter)* ')' routineOption* routineBody ; createFunction @@ -286,11 +286,12 @@ createTablespaceNdb ; createTrigger - : CREATE ownerStatement? TRIGGER ifNotExists? thisTrigger = fullId triggerTime = (BEFORE | AFTER) triggerEvent = ( - INSERT - | UPDATE - | DELETE - ) ON tableName FOR EACH ROW (triggerPlace = (FOLLOWS | PRECEDES) otherTrigger = fullId)? routineBody + : CREATE ownerStatement? TRIGGER ifNotExists? thisTrigger = fullId triggerTime = ( + BEFORE + | AFTER + ) triggerEvent = (INSERT | UPDATE | DELETE) ON tableName FOR EACH ROW ( + triggerPlace = (FOLLOWS | PRECEDES) otherTrigger = fullId + )? routineBody ; withClause @@ -444,6 +445,7 @@ columnConstraint | INVISIBLE # invisibilityColumnConstraint | (AUTO_INCREMENT | ON UPDATE currentTimestamp) # autoIncrementColumnConstraint | PRIMARY? KEY # primaryKeyColumnConstraint + | CLUSTERING KEY # clusteringKeyColumnConstraint // Tokudb-specific only | UNIQUE KEY? # uniqueKeyColumnConstraint | COMMENT STRING_LITERAL # commentColumnConstraint | COLUMN_FORMAT colformat = (FIXED | DYNAMIC | DEFAULT) # formatColumnConstraint @@ -460,6 +462,8 @@ tableConstraint | (CONSTRAINT name = uid?)? UNIQUE indexFormat = (INDEX | KEY)? index = uid? indexType? indexColumnNames indexOption* # uniqueKeyTableConstraint | (CONSTRAINT name = uid?)? FOREIGN KEY index = uid? indexColumnNames referenceDefinition # foreignKeyTableConstraint | (CONSTRAINT name = uid?)? CHECK '(' expression ')' # checkTableConstraint + | CLUSTERING KEY index = uid? indexColumnNames # clusteringKeyTableConstraint + // Tokudb-specific only ; referenceDefinition @@ -519,6 +523,8 @@ tableOption | ID ) # tableOptionRowFormat | START TRANSACTION # tableOptionStartTransaction + | SECONDARY_ENGINE '='? (ID | STRING_LITERAL) # tableOptionSecondaryEngine + // HeatWave-specific only | SECONDARY_ENGINE_ATTRIBUTE '='? STRING_LITERAL # tableOptionSecondaryEngineAttribute | STATS_AUTO_RECALC '='? extBoolValue = (DEFAULT | '0' | '1') # tableOptionRecalculation | STATS_PERSISTENT '='? extBoolValue = (DEFAULT | '0' | '1') # tableOptionPersistent @@ -632,7 +638,7 @@ alterServer ; alterTable - : ALTER intimeAction = (ONLINE | OFFLINE)? IGNORE? TABLE tableName waitNowaitClause? ( + : ALTER intimeAction = (ONLINE | OFFLINE)? IGNORE? TABLE tableName ( alterSpecification (',' alterSpecification)* )? partitionDefinitions? ; @@ -685,7 +691,7 @@ alterSpecification | DROP DEFAULT ) # alterByAlterColumnDefault | ALTER INDEX uid (VISIBLE | INVISIBLE) # alterByAlterIndexVisibility - | DROP FOREIGN KEY uid # alterByDropForeignKey + | DROP FOREIGN KEY uid dottedId? # alterByDropForeignKey | DISABLE KEYS # alterByDisableKeys | ENABLE KEYS # alterByEnableKeys | RENAME renameFormat = (TO | AS)? (uid | fullId) # alterByRename @@ -939,7 +945,7 @@ handlerCloseStatement ; singleUpdateStatement - : UPDATE priority = LOW_PRIORITY? IGNORE? tableName (AS? uid)? SET updatedElement ( + : UPDATE priority = LOW_PRIORITY? IGNORE? tableSources (AS? uid)? SET updatedElement ( ',' updatedElement )* (WHERE expression)? orderByClause? limitClause? ; @@ -1011,12 +1017,12 @@ queryExpressionNointo ; querySpecification - : SELECT selectSpec* selectElements selectIntoExpression? fromClause groupByClause? havingClause? windowClause? orderByClause? limitClause? - | SELECT selectSpec* selectElements fromClause groupByClause? havingClause? windowClause? orderByClause? limitClause? selectIntoExpression? + : SELECT selectSpec* selectElements selectIntoExpression? fromClause? groupByClause? havingClause? windowClause? orderByClause? limitClause? + | SELECT selectSpec* selectElements fromClause? groupByClause? havingClause? windowClause? orderByClause? limitClause? selectIntoExpression? ; querySpecificationNointo - : SELECT selectSpec* selectElements fromClause groupByClause? havingClause? windowClause? orderByClause? limitClause? unionStatement? + : SELECT selectSpec* selectElements fromClause? groupByClause? havingClause? windowClause? orderByClause? limitClause? unionStatement? ; unionParenthesis @@ -1039,7 +1045,7 @@ lateralStatement // https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html jsonTable - : JSON_TABLE '(' STRING_LITERAL ',' STRING_LITERAL COLUMNS '(' jsonColumnList ')' ')' (AS? uid)? + : JSON_TABLE '(' expression ',' STRING_LITERAL COLUMNS '(' jsonColumnList ')' ')' (AS? uid)? ; jsonColumnList @@ -1171,7 +1177,7 @@ releaseStatement ; lockTables - : LOCK (TABLE | TABLES) lockTableElement (',' lockTableElement)* waitNowaitClause? + : LOCK (TABLE | TABLES) lockTableElement (',' lockTableElement)* ; unlockTables @@ -1541,16 +1547,17 @@ renameUser ; revokeStatement - : REVOKE ifExists? (privelegeClause | uid) (',' privelegeClause | uid)* - ON - privilegeObject=(TABLE | FUNCTION | PROCEDURE)? - privilegeLevel - FROM userName (',' userName)* (IGNORE UNKNOWN USER)? #detailRevoke - | REVOKE ifExists? ALL PRIVILEGES? ',' GRANT OPTION - FROM userName (',' userName)* (IGNORE UNKNOWN USER)? #shortRevoke - | REVOKE ifExists? (userName | uid) (',' (userName | uid))* - FROM (userName | uid) (',' (userName | uid))* - (IGNORE UNKNOWN USER)? #roleRevoke + : REVOKE ifExists? (privelegeClause | uid) (',' privelegeClause | uid)* ON privilegeObject = ( + TABLE + | FUNCTION + | PROCEDURE + )? privilegeLevel FROM userName (',' userName)* (IGNORE UNKNOWN USER)? # detailRevoke + | REVOKE ifExists? ALL PRIVILEGES? ',' GRANT OPTION FROM userName (',' userName)* ( + IGNORE UNKNOWN USER + )? # shortRevoke + | REVOKE ifExists? (userName | uid) (',' (userName | uid))* FROM (userName | uid) ( + ',' (userName | uid) + )* (IGNORE UNKNOWN USER)? # roleRevoke ; revokeProxy @@ -1681,6 +1688,7 @@ privilege | SYSTEM_USER | SYSTEM_VARIABLES_ADMIN | TABLE_ENCRYPTION_ADMIN + | TELEMETRY_LOG_ADMIN | TP_CONNECTION_ADMIN | VERSION_TOKEN_ADMIN | XA_RECOVER_ADMIN @@ -1868,6 +1876,8 @@ cacheIndexStatement flushStatement : FLUSH flushFormat = (NO_WRITE_TO_BINLOG | LOCAL)? flushOption (',' flushOption)* + // Specific for Azure Database for MySQL Single Server instance. + | FLUSH FIREWALL_RULES ; killStatement @@ -2222,10 +2232,10 @@ dataType SIGNED | UNSIGNED | ZEROFILL - )* # dimensionDataType - | typeName = (DATE | TINYBLOB | MEDIUMBLOB | LONGBLOB | BOOL | BOOLEAN | SERIAL) # simpleDataType + )* # dimensionDataType + | typeName = (DATE | TINYBLOB | MEDIUMBLOB | LONGBLOB | BOOL | BOOLEAN | SERIAL) # simpleDataType | typeName = (BIT | TIME | TIMESTAMP | DATETIME | BINARY | VARBINARY | BLOB | YEAR | VECTOR) lengthOneDimension? # dimensionDataType - | typeName = (ENUM | SET) collectionOptions BINARY? (charSet charsetName)? # collectionDataType + | typeName = (ENUM | SET) collectionOptions BINARY? (charSet charsetName)? # collectionDataType | typeName = ( GEOMETRYCOLLECTION | GEOMCOLLECTION @@ -2243,7 +2253,11 @@ dataType ; collectionOptions - : '(' STRING_LITERAL (',' STRING_LITERAL)* ')' + : '(' collectionOption (',' collectionOption)* ')' + ; + +collectionOption + : STRING_LITERAL ; convertedDataType @@ -2341,11 +2355,6 @@ orReplace : OR REPLACE ; -waitNowaitClause - : WAIT decimalLiteral - | NOWAIT - ; - // Functions functionCall @@ -2439,7 +2448,7 @@ nonAggregateWindowedFunction ; overClause - : OVER ('(' windowSpec ')' | windowName) + : OVER ('(' windowSpec? ')' | windowName) ; windowSpec @@ -2715,6 +2724,7 @@ keywordsCanBeId | AGGREGATE | ALGORITHM | ANY + | APPLICATION_PASSWORD_ADMIN | ARRAY | AT | AUDIT_ADMIN @@ -2838,11 +2848,16 @@ keywordsCanBeId | FIRST | FIXED | FLUSH + | FLUSH_OPTIMIZER_COSTS + | FLUSH_STATUS + | FLUSH_TABLES + | FLUSH_USER_RESOURCES | FOLLOWS | FOUND | FULL | FUNCTION | GENERAL + | GEOMETRY | GLOBAL | GRANTS | GROUP @@ -2862,6 +2877,7 @@ keywordsCanBeId | INDEXES | INITIAL_SIZE | INNODB_REDO_LOG_ARCHIVE + | INNODB_REDO_LOG_ENABLE | INPLACE | INSERT_METHOD | INSTALL @@ -2934,6 +2950,7 @@ keywordsCanBeId | MYSQL_ERRNO | NAME | NAMES + | NATIONAL | NCHAR | NDB_STORED_USER | NESTED @@ -3082,10 +3099,12 @@ keywordsCanBeId | SWAPS | SWITCHES | SYSTEM_VARIABLES_ADMIN + | SYSTEM_USER | TABLE_NAME | TABLESPACE | TABLE_ENCRYPTION_ADMIN | TABLE_TYPE + | TELEMETRY_LOG_ADMIN | TEMPORARY | TEMPTABLE | THAN @@ -3497,4 +3516,4 @@ functionNameBase | JSON_ARRAYAGG | JSON_OBJECTAGG | STATEMENT - ; + ; \ No newline at end of file diff --git a/sql/mysql/Positive-Technologies/examples/ddl_alter.sql b/sql/mysql/Positive-Technologies/examples/ddl_alter.sql index 63cb46de6a..26de8296d3 100644 --- a/sql/mysql/Positive-Technologies/examples/ddl_alter.sql +++ b/sql/mysql/Positive-Technologies/examples/ddl_alter.sql @@ -1,7 +1,8 @@ #begin -- Alter Table -alter table ship_class add column ship_spec varchar(150) first, add somecol int after start_build; +alter table ship_class add column ship_spec varchar(150) first, add somecol int after start_build, algorithm=instant; alter table t3 add column (c2 decimal(10, 2) comment 'comment`' null, c3 enum('abc', 'cba', 'aaa')), add index t3_i1 using btree (c2) comment 'some index'; +alter table t3 add column (c4 decimal(10, 2) comment 'comment`' null), add index t3_i2 using btree (c4) comment 'some index'; alter table t3 add column (c2 decimal(10, 2), c3 int); ALTER TABLE `deals` ADD INDEX `idx_custom_field_30c4f4a7c529ccf0825b2fac732bebfd843ed764` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."30c4f4a7c529ccf0825b2fac732bebfd843ed764".value')) as DOUBLE))); ALTER TABLE `deals` ADD INDEX `idx_custom_field_30c4f4a7c529ccf0825b2fac732bebfd843ed764` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."30c4f4a7c529ccf0825b2fac732bebfd843ed764".value')) as FLOAT))); @@ -30,7 +31,7 @@ alter table with_check add check (c1 in (1, 2, 3, 4)); alter table with_partition add partition (partition p201901 values less than (737425) engine = InnoDB); alter table with_partition add partition (partition p1 values less than (837425) engine = InnoDB, partition p2 values less than (MAXVALUE) engine = InnoDB); alter table t1 stats_auto_recalc=default stats_sample_pages=50; -alter table t1 stats_auto_recalc=default, stats_sample_pages=50; +alter table t1 stats_auto_recalc=default, stats_sample_pages=50.0; alter table t1 stats_auto_recalc=default, stats_sample_pages=default; alter table t1 modify column c1 enum('abc','cba','aaa') character set 'utf8' collate 'utf8_unicode_ci' not null default 'abc'; alter table table1 add primary key (id); @@ -43,6 +44,10 @@ alter table table1 add column yes varchar(255) default '' null; alter table add_test add column col1 int not null; alter table `some_table` add (primary key `id` (`id`),`k_id` int unsigned not null,`another_field` smallint not null,index `k_id` (`k_id`)); alter table `some_table` add column (unique key `another_field` (`another_field`)); +alter table add_test add column optional bool default 0 null; +alter table add_test add column empty varchar(255); +alter table add_test add column geometry int; +alter table add_test drop foreign key fk; alter table default.task add column xxxx varchar(200) comment 'cdc test'; ALTER TABLE `hcore`.comments COLLATE='utf8mb4_general_ci', CONVERT TO CHARSET UTF8MB4; ALTER TABLE T1 ADD FOREIGN KEY ( I ) REFERENCES TT ( I ) ON DELETE SET DEFAULT; @@ -101,9 +106,34 @@ alter tablespace tblsp_2 drop datafile 'deletedfilename' wait engine ndb; alter view my_view1 as select 1 union select 2 limit 0,5; alter algorithm = merge view my_view2(col1, col2) as select * from t2 with check option; alter definer = 'ivan'@'%' view my_view3 as select count(*) from t3; -alter definer = current_user sql security invoker view my_view4(c1, 1c, _, c1_2) +alter definer = current_user sql security invoker view my_view4(c1, 1c, _, c1_2) as select * from (t1 as tt1, t2 as tt2) inner join t1 on t1.col1 = tt1.col1; +#end +#begin -- Alter user +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password history default; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password history 90; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password reuse interval default; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password reuse interval 360 DAY; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password require current; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password require current optional; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password require current default; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock failed_login_attempts 5; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password_lock_time 2; +alter user 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password_lock_time unbounded; +alter user 'user'@'%' identified by 'newpassword' retain current password; +alter user if exists 'user'@'%' identified with 'mysql_native_password' as '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' + require none password expire default account unlock password history default; ALTER USER 'mattias.hultman' DEFAULT ROLE `prod-spain-mysql-read-only`@`%`; rename user user1@100.200.1.1 to user2@100.200.1.2; rename user user1@100.200.1.1 to user2@2001:0db8:85a3:0000:0000:8a2e:0370:7334; @@ -116,4 +146,4 @@ ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*247 ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' AS 'REDACTED' RETAIN CURRENT PASSWORD; ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' BY '2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REPLACE 'current_auth_string' RETAIN CURRENT PASSWORD; ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' BY RANDOM PASSWORD REPLACE 'current_auth_string' RETAIN CURRENT PASSWORD; -#end +#end \ No newline at end of file diff --git a/sql/mysql/Positive-Technologies/examples/ddl_create.sql b/sql/mysql/Positive-Technologies/examples/ddl_create.sql index 31a4f485a5..38fd32a371 100644 --- a/sql/mysql/Positive-Technologies/examples/ddl_create.sql +++ b/sql/mysql/Positive-Technologies/examples/ddl_create.sql @@ -1,4 +1,15 @@ #begin +GET DIAGNOSTICS @p1 = NUMBER, @p2 = ROW_COUNT; +GET DIAGNOSTICS CONDITION 1 @p1 = MYSQL_ERRNO; +GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT; +GET DIAGNOSTICS CONDITION 1 @p3 = RETURNED_SQLSTATE, @p4 = MESSAGE_TEXT; +GET DIAGNOSTICS CONDITION 1 @p5 = SCHEMA_NAME, @p6 = TABLE_NAME; +GET DIAGNOSTICS CONDITION 1 @errno = MYSQL_ERRNO; +GET DIAGNOSTICS @cno = NUMBER; +GET DIAGNOSTICS CONDITION @cno @errno = MYSQL_ERRNO; +GET CURRENT DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT; +GET STACKED DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT; +GET CURRENT DIAGNOSTICS errcount = NUMBER; -- Create User CREATE USER 'test_crm_debezium'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' PASSWORD EXPIRE NEVER COMMENT '-'; CREATE USER 'jim'@'localhost' ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}'; @@ -69,8 +80,13 @@ create table table_with_character_set_eq (id int, data varchar(50)) character se create table table_with_character_set (id int, data varchar(50)) character set default; create table table_with_visible_index (id int, data varchar(50), UNIQUE INDEX `data_UNIQUE` (`data` ASC) INVISIBLE VISIBLE); create table table_with_index (id int, data varchar(50), UNIQUE INDEX `data_UNIQUE` (`data` ASC)); +create table table_with_keyword_as_column_name (geometry int, national int); +create table transactional_table(name varchar(255), class_id int, id int) transactional=1; +create table transactional(name varchar(255), class_id int, id int); +create table add_test(col1 varchar(255), col2 int, col3 int); create table blob_test(id int, col1 blob(45)); create table žluťoučký (kůň int); +CREATE TABLE staff (PRIMARY KEY (staff_num), staff_num INT(5) NOT NULL, first_name VARCHAR(100) NOT NULL, pens_in_drawer INT(2) NOT NULL, CONSTRAINT pens_in_drawer_range CHECK(pens_in_drawer BETWEEN 1 AND 99)); create table column_names_as_aggr_funcs(min varchar(100), max varchar(100), sum varchar(100), count varchar(100)); CREATE TABLE char_table (c1 CHAR VARYING(10), c2 CHARACTER VARYING(10), c3 NCHAR VARYING(10)); create table rack_shelf_bin ( id int unsigned not null auto_increment unique primary key, bin_volume decimal(20, 4) default (bin_len * bin_width * bin_height)); @@ -79,6 +95,7 @@ create table invisible_column_test(id int, col1 int INVISIBLE); create table visible_column_test(id int, col1 int VISIBLE); create table table_with_buckets(id int(11) auto_increment NOT NULL COMMENT 'ID', buckets int(11) NOT NULL COMMENT '分桶数'); CREATE TABLE foo (c1 decimal(19), c2 decimal(19.5), c3 decimal(0.0), c4 decimal(0.2), c5 decimal(19,2)); +create table statement(id int); CREATE TABLE table_items (id INT, purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) SUBPARTITION BY HASH( TO_DAYS(purchased) ) @@ -209,6 +226,14 @@ CREATE TABLE `daily_intelligences`( PRIMARY KEY (`id`) ) ENGINE=innodb DEFAULT CHAR SET=utf8 COMMENT ''; +CREATE TABLE IF NOT EXISTS `contract_center`.`ent_folder_letter_relationship` ( +`id` BIGINT(19) UNSIGNED NOT NULL COMMENT '唯一标识', +`layer` TINYINT(4) UNSIGNED DEFAULT _UTF8MB4'0' COMMENT '文档所属层级,0-主关联文档, 1-次关联文档', +`deleted` TINYINT(1) NOT NULL DEFAULT _UTF8MB4'0' COMMENT '0-有效记录, 1-删除', +`data_create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '创建时间', +`data_update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP() COMMENT '更新时间', +PRIMARY KEY(`id`)) ENGINE = InnoDB DEFAULT CHARACTER SET = UTF8MB4; + CREATE TABLE `auth_realm_clients` ( `pk_realm` int unsigned NOT NULL DEFAULT '0', `fk_realm` int unsigned DEFAULT NULL, @@ -231,6 +256,20 @@ CREATE TABLE `\\test_table`(id INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE = IN CREATE TABLE `\\test\\_table\\`(id INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE = INNODB; CREATE TABLE TableWithVector (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, vec1 VECTOR, vec2 VECTOR); + +CREATE TABLE PARTICIPATE_ACTIVITIES ( + ID BIGINT NOT NULL AUTO_INCREMENT, + USER_ID BIGINT NOT NULL, + PRIMARY KEY (ID) USING BTREE) +ENGINE=INNODB AUTO_INCREMENT=1979503 DEFAULT CHARSET=UTF8MB4 COLLATE=UTF8MB4_GENERAL_CI SECONDARY_ENGINE=RAPID; + +CREATE TABLE `TABLE1` ( +`COL1` INT(10) UNSIGNED NOT NULL, +`COL2` VARCHAR(32) NOT NULL, +`COL3` ENUM (`VAR1`,`VAR2`, `VAR3`) NOT NULL, +PRIMARY KEY (`COL1`, `COL2`, `COL3`), +CLUSTERING KEY `CLKEY1` (`COL3`, `COL2`)) +ENGINE=TOKUDB DEFAULT CHARSET=CP1251; #end #begin -- Rename table @@ -288,6 +327,7 @@ create index index5 on antlr_tokens(token(30) asc) algorithm default; create index index6 on antlr_tokens(token(30) asc) algorithm default lock default; create index index7 on antlr_tokens(token(30) asc) lock default algorithm default; create index index8 on t1(col1) comment 'test index' using btree; +create index myindex on t1(col1) comment 'test index' comment 'some test' using btree; CREATE INDEX `idx_custom_field_30c4f4a7c529ccf0825b2fac732bebfd843ed764` ON `deals` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."30c4f4a7c529ccf0825b2fac732bebfd843ed764".value')) as double))); CREATE INDEX `idx_custom_field_d3bb7ad91ba729aaa20df0af037cb7ed8ce3ffc8` ON `deals` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."d3bb7ad91ba729aaa20df0af037cb7ed8ce3ffc8".value')) as float))); #end @@ -363,6 +403,9 @@ END create trigger trg_my1 before delete on test.t1 for each row begin insert into log_table values ("delete row from test.t1"); insert into t4 values (old.col1, old.col1 + 5, old.col1 + 7); end; -- //-- delimiter ; #end #begin +-- Create trigger 7 +-- delimiter // +CREATE TRIGGER IF NOT EXISTS `my_trigger` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN SET NEW.my_col = CONCAT(NEW.mycol, NEW.id); END; -- //-- delimiter ; -- Create view create or replace view my_view1 as select 1 union select 2 limit 0,5; create algorithm = merge view my_view2(col1, col2) as select * from t2 with check option; @@ -394,14 +437,13 @@ RETURN SUBSTR(_uuid, 25) )) #end #begin --- From MariaDB 10.4.3, the JSON_VALID function is automatically used as a CHECK constraint for the JSON data type alias in order to ensure that a valid json document is inserted. --- src: https://mariadb.com/kb/en/json_valid/ -CREATE TABLE `global_priv` ( - `Host` CHAR(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` CHAR(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Privilege` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '{}' CHECK (json_valid(`Privilege`)), - PRIMARY KEY (`Host`,`User`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 COMMENT='Users and global privileges'; +-- Use UTC_TIMESTAMP without parenthesis +CREATE FUNCTION IF NOT EXISTS myfunc(a INT) RETURNS INT +BEGIN + DECLARE result INT; + SET result = UTC_TIMESTAMP; + RETURN result; +END; #end #begin -- https://dev.mysql.com/doc/refman/8.0/en/json-validation-functions.html#json-validation-functions-constraints @@ -476,6 +518,17 @@ BEGIN insert into order_config(order_id, attribute, value, performer) END #end #begin +-- Create procedure +-- delimiter // +CREATE PROCEDURE makesignal(p1 INT) +BEGIN + DECLARE error_text VARCHAR(255); + IF (error_text != 'OK') THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_text; + END IF; +END -- //-- delimiter ; +#end +#begin CREATE DEFINER=`bettingservice`@`stage-us-nj-app%` PROCEDURE `AggregatePlayerFactDaily`() BEGIN DECLARE CID_min BIGINT; @@ -536,6 +589,7 @@ END -- //-- delimiter ; -- delimiter // CREATE PROCEDURE set_unique_check() BEGIN + SET unique_checks=off; SET unique_checks=on; END; -- //-- delimiter ; #end @@ -742,10 +796,15 @@ WITH RECURSIVE cte (n) AS ) SELECT * FROM cte; #end - +#begin +CREATE VIEW `invoice_payments_stats` AS +SELECT + `i`.`id` AS `id` +FROM (`invoices` `i` JOIN lateral (SELECT MAX(`ip`.`date`) AS `latest_payment` FROM `invoice_payments` `ip`) `ps`); +#end #begin lock tables t1 read; -lock table t1 read local wait 100; +lock table t1 read local; #end #begin @@ -824,8 +883,13 @@ ORDER BY 1 ; END #end + #begin --- Create trigger 7 --- delimiter // -CREATE TRIGGER IF NOT EXISTS `my_trigger` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN SET NEW.my_col = CONCAT(NEW.mycol, NEW.id); END; -- //-- delimiter ; -#end +CREATE PROCEDURE TEST_UPDATE() +BEGIN + UPDATE TEST_AUTO_INC AI + JOIN TEST_JOIN_LIMIT JL ON JL.ID = AI.ID + SET AI.COL_1 = NULL + LIMIT 500; +END +#end \ No newline at end of file diff --git a/sql/mysql/Positive-Technologies/examples/ddl_flush.sql b/sql/mysql/Positive-Technologies/examples/ddl_flush.sql index 15e72ba36a..4616f95b4d 100644 --- a/sql/mysql/Positive-Technologies/examples/ddl_flush.sql +++ b/sql/mysql/Positive-Technologies/examples/ddl_flush.sql @@ -1,4 +1,6 @@ #begin +flush no_write_to_binlog hosts; +flush local hosts; flush hosts, status; #end #begin @@ -15,4 +17,8 @@ flush table; flush local table Foo; flush TABLE Foo, Bar; flush table Foo, Bar for export; +flush table Foo, Bar with read lock; #end + +-- Azure Database for MySQL Single Server instance. This type of database server is being decommissioned on Sept 16 2024 and is succeeded by their "Flexible Server" offering. +FLUSH FIREWALL_RULES; diff --git a/sql/mysql/Positive-Technologies/examples/dml_select.sql b/sql/mysql/Positive-Technologies/examples/dml_select.sql index b3d95af395..3c19320451 100644 --- a/sql/mysql/Positive-Technologies/examples/dml_select.sql +++ b/sql/mysql/Positive-Technologies/examples/dml_select.sql @@ -23,6 +23,7 @@ select * from `select` where `varchar` = 'abc \' ' and `varchar2` = '\'bca'; #begin -- -- -- Number literal SELECT 1; +SELECT 1.; select 1.e-3 as 123e; select del1.e123 as c from del1; select -1, 3e-2, 2.34E0; @@ -31,6 +32,7 @@ SELECT .1e10; SELECT -.1e10; select 15e3, .2e5 as col1; select .2e3 c1, .2e-4 as c5; +select * from tab where `field` = 1.; #end #begin -- -- -- Number float collision test @@ -189,13 +191,25 @@ SELECT * FROM test LIMIT LIMIT1,LIMIT2; SELECT SCHEMA(); -- Functions SELECT REPEAT('X',2); -SELECT mod(3,2);SELECT * FROM TEST WHERE TB_SCHEMA = SCHEMA(); +SELECT mod(3,2); +SELECT * FROM TEST WHERE TB_SCHEMA = SCHEMA(); -- Group By with computed column SELECT 1 AS col1, t1.Id FROM t1 GROUP BY col1; -- Non Aggregate Functions SELECT pk, LEAD(pk) OVER (ORDER BY pk) AS l; SELECT COALESCE(LAG(last_eq.end_variation) OVER (PARTITION BY eq.account_id, eq.execution_name_id, eq.currency ORDER BY eq.start_date), 0) AS start_variation FROM t1; -- Window Functions +SELECT + year, country, product, profit, + SUM(profit) OVER() AS total_profit, + SUM(profit) OVER(PARTITION BY country) AS country_profit +FROM sales + ORDER BY country, year, product, profit; +SELECT + year, country, product, profit, + ROW_NUMBER() OVER(PARTITION BY country) AS row_num1, + ROW_NUMBER() OVER(PARTITION BY country ORDER BY year, product) AS row_num2 +FROM sales; SELECT e.id, SUM(e.bin_volume) AS bin_volume, @@ -218,6 +232,21 @@ SELECT FROM table2 WINDOW w AS (PARTITION BY id, bin_volume ORDER BY id ROWS UNBOUNDED PRECEDING), w2 AS (PARTITION BY id, bin_volume ORDER BY id DESC ROWS 10 PRECEDING); +#begin +-- https://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html +SELECT + salesperson.name, + max_sale.amount, + max_sale.customer_name +FROM + salesperson, + LATERAL + (SELECT amount, customer_name + FROM all_sales + WHERE all_sales.salesperson_id = salesperson.id + ORDER BY amount DESC LIMIT 1) + AS max_sale; +#end -- Index hints: https://dev.mysql.com/doc/refman/5.7/en/index-hints.html SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3; SELECT * FROM table1 FORCE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3; diff --git a/sql/mysql/Positive-Technologies/examples/dml_table.sql b/sql/mysql/Positive-Technologies/examples/dml_table.sql index 9e931dd23a..f427601d88 100644 --- a/sql/mysql/Positive-Technologies/examples/dml_table.sql +++ b/sql/mysql/Positive-Technologies/examples/dml_table.sql @@ -10,6 +10,3 @@ TABLE t LIMIT 3; #begin TABLE t ORDER BY b LIMIT 3; #end - - - diff --git a/sql/mysql/Positive-Technologies/examples/grant.sql b/sql/mysql/Positive-Technologies/examples/grant.sql index 24cb1bc1c8..e77e920abb 100644 --- a/sql/mysql/Positive-Technologies/examples/grant.sql +++ b/sql/mysql/Positive-Technologies/examples/grant.sql @@ -12,6 +12,8 @@ GRANT ALL on db.tbl to 'admin'; GRANT ALL on `db`.`tbl` to 'admin'; GRANT ALL on `db`.tbl to 'admin'; GRANT ALL on db.`tbl` to 'admin'; +GRANT ALL ON *.* TO `foo2` @`%`; +GRANT ALL ON *.* TO `foo2` @test; GRANT SESSION_VARIABLES_ADMIN on *.* to 'u2'; GRANT 'SESSION_VARIABLES_ADMIN' on *.* to 'u2'; GRANT `SESSION_VARIABLES_ADMIN` on *.* to 'u2'; @@ -22,7 +24,7 @@ GRANT AUDIT_ADMIN, BACKUP_ADMIN, BINLOG_ADMIN, BINLOG_ENCRYPTION_ADMIN, CLONE_AD ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN, FIREWALL_USER, GROUP_REPLICATION_ADMIN, INNODB_REDO_LOG_ARCHIVE, NDB_STORED_USER, PERSIST_RO_VARIABLES_ADMIN, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, RESOURCE_GROUP_ADMIN, RESOURCE_GROUP_USER, ROLE_ADMIN, SESSION_VARIABLES_ADMIN, SET_USER_ID, SHOW_ROUTINE, SYSTEM_VARIABLES_ADMIN, AUTHENTICATION_POLICY_ADMIN, -TABLE_ENCRYPTION_ADMIN, VERSION_TOKEN_ADMIN, XA_RECOVER_ADMIN, AUDIT_ABORT_EXEMPT, FIREWALL_EXEMPT, SKIP_QUERY_REWRITE, TP_CONNECTION_ADMIN ON *.* TO `admin`@`localhost`; +TABLE_ENCRYPTION_ADMIN, VERSION_TOKEN_ADMIN, XA_RECOVER_ADMIN, AUDIT_ABORT_EXEMPT, FIREWALL_EXEMPT, SKIP_QUERY_REWRITE, TELEMETRY_LOG_ADMIN, TP_CONNECTION_ADMIN ON *.* TO `admin`@`localhost`; GRANT SELECT, INSERT, UPDATE ON *.* TO u4 AS u1 WITH ROLE r1; GRANT SELECT, RELOAD, REPLICATION SLAVE, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'xuser1'@'%', 'xuser2'@'%' AS 'root'@'%' WITH ROLE 'cloudsqlsuperuser'@'%'; @@ -92,6 +94,72 @@ GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'localhost' GRANT TABLE_ENCRYPTION_ADMIN ON *.* TO 'admin'@'localhost' GRANT VERSION_TOKEN_ADMIN ON *.* TO 'admin'@'localhost' GRANT XA_RECOVER_ADMIN ON *.* TO 'admin'@'localhost' +GRANT ALTER ON *.* TO 'mysqluser'@'localhost' +GRANT ALTER ROUTINE ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE TEMPORARY TABLES ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE ROUTINE ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE VIEW ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE USER ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE TABLESPACE ON *.* TO 'mysqluser'@'localhost' +GRANT CREATE ROLE ON *.* TO 'mysqluser'@'localhost' +GRANT DELETE ON *.* TO 'mysqluser'@'localhost' +GRANT DROP ON *.* TO 'mysqluser'@'localhost' +GRANT DROP ROLE ON *.* TO 'mysqluser'@'localhost' +GRANT EVENT ON *.* TO 'mysqluser'@'localhost' +GRANT EXECUTE ON *.* TO 'mysqluser'@'localhost' +GRANT FILE ON *.* TO 'mysqluser'@'localhost' +GRANT GRANT OPTION ON *.* TO 'mysqluser'@'localhost' +GRANT INDEX ON *.* TO 'mysqluser'@'localhost' +GRANT INSERT ON *.* TO 'mysqluser'@'localhost' +GRANT LOCK TABLES ON *.* TO 'mysqluser'@'localhost' +GRANT PROCESS ON *.* TO 'mysqluser'@'localhost' +GRANT PROXY ON *.* TO 'mysqluser'@'localhost' +GRANT REFERENCES ON *.* TO 'mysqluser'@'localhost' +GRANT RELOAD ON *.* TO 'mysqluser'@'localhost' +GRANT REPLICATION CLIENT ON *.* TO 'mysqluser'@'localhost' +GRANT REPLICATION SLAVE ON *.* TO 'mysqluser'@'localhost' +GRANT SELECT ON *.* TO 'mysqluser'@'localhost' +GRANT SHOW VIEW ON *.* TO 'mysqluser'@'localhost' +GRANT SHOW DATABASES ON *.* TO 'mysqluser'@'localhost' +GRANT SHUTDOWN ON *.* TO 'mysqluser'@'localhost' +GRANT SUPER ON *.* TO 'mysqluser'@'localhost' +GRANT TRIGGER ON *.* TO 'mysqluser'@'localhost' +GRANT UPDATE ON *.* TO 'mysqluser'@'localhost' +GRANT USAGE ON *.* TO 'mysqluser'@'localhost' +GRANT APPLICATION_PASSWORD_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT AUDIT_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT BACKUP_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT BINLOG_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT BINLOG_ENCRYPTION_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT CLONE_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT CONNECTION_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT ENCRYPTION_KEY_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT FIREWALL_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT FIREWALL_USER ON *.* TO 'mysqluser'@'localhost' +GRANT FLUSH_OPTIMIZER_COSTS ON *.* TO 'mysqluser'@'localhost' +GRANT FLUSH_STATUS ON *.* TO 'mysqluser'@'localhost' +GRANT FLUSH_TABLES ON *.* TO 'mysqluser'@'localhost' +GRANT FLUSH_USER_RESOURCES ON *.* TO 'mysqluser'@'localhost' +GRANT GROUP_REPLICATION_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT INNODB_REDO_LOG_ARCHIVE ON *.* TO 'mysqluser'@'localhost' +GRANT INNODB_REDO_LOG_ENABLE ON *.* TO 'mysqluser'@'localhost' +GRANT NDB_STORED_USER ON *.* TO 'mysqluser'@'localhost' +GRANT PERSIST_RO_VARIABLES_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT REPLICATION_APPLIER ON *.* TO 'mysqluser'@'localhost' +GRANT REPLICATION_SLAVE_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT RESOURCE_GROUP_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT RESOURCE_GROUP_USER ON *.* TO 'mysqluser'@'localhost' +GRANT ROLE_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT SERVICE_CONNECTION_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT SESSION_VARIABLES_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT SET_USER_ID ON *.* TO 'mysqluser'@'localhost' +GRANT SHOW_ROUTINE ON *.* TO 'mysqluser'@'localhost' +GRANT SYSTEM_USER ON *.* TO 'mysqluser'@'localhost' +GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT TABLE_ENCRYPTION_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT VERSION_TOKEN_ADMIN ON *.* TO 'mysqluser'@'localhost' +GRANT XA_RECOVER_ADMIN ON *.* TO 'mysqluser'@'localhost' GRANT reader TO 'mysqluser'@'localhost' GRANT reader TO topreader GRANT reader TO topreader WITH ADMIN OPTION; @@ -102,7 +170,7 @@ REVOKE reader FROM topreader REVOKE `cloudsqlsuperuser`@`%` FROM `sarmonitoring`@`10.90.29.%` REVOKE IF EXISTS SELECT ON test.t1 FROM jerry@localhost; REVOKE IF EXISTS Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER; - +REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'retool'@ -- Set Role SET ROLE DEFAULT; SET ROLE 'role1', 'role2'; diff --git a/swift/swift5/Swift5Parser.g4 b/swift/swift5/Swift5Parser.g4 index 9446f507bc..9f6f930fdb 100644 --- a/swift/swift5/Swift5Parser.g4 +++ b/swift/swift5/Swift5Parser.g4 @@ -220,7 +220,7 @@ catch_clause ; catch_pattern_list - : catch_pattern (catch_pattern COMMA catch_pattern)* + : catch_pattern (COMMA catch_pattern)* ; catch_pattern diff --git a/swift/swift5/examples/Error Handling/Contents.swift b/swift/swift5/examples/Error Handling/Contents.swift index 5620d2e575..89d4c8202c 100644 --- a/swift/swift5/examples/Error Handling/Contents.swift +++ b/swift/swift5/examples/Error Handling/Contents.swift @@ -8,12 +8,20 @@ enum PrinterError: Error { case onFire } +// One more error +enum JustError: Error { + case someError +} + //: Use `throw` to throw an error and `throws` to mark a function that can throw an error. If you throw an error in a function, the function returns immediately and the code that called the function handles the error. //: func send(job: Int, toPrinter printerName: String) throws -> String { if printerName == "Never Has Toner" { throw PrinterError.noToner } + if printerName == "Throw error" { + throw JustError.someError + } return "Job sent" } @@ -42,6 +50,22 @@ do { print(error) } +//: - Experiment: +//: Change the printer name to `"Throw error"`, so that the `send(job:toPrinter:)` function throws an error. +//: +//: You can catch multiple error cases inside a single catch block +//: +do { + let printerResponse = try send(job: 1440, toPrinter: "Gutenberg") + print(printerResponse) +} catch is JustError, PrinterError.noToner { + print("Error.") +} catch let printerError as PrinterError { + print("Printer error: \(printerError).") +} catch { + print(error) +} + //: - Experiment: //: Add code to throw an error inside the `do` block. What kind of error do you need to throw so that the error is handled by the first `catch` block? What about the second and third blocks? //: