12feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/* 268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * [The "BSD licence"] 32feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver 468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * All rights reserved. 52feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com * 668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * are met: 968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 1068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 1168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 1268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 1368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 1468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 1568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com * 1768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com */ 2868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 2968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparser grammar smaliParser; 3068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 3168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comoptions { 3240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver output=AST; 3340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ASTLabelType=CommonTree; 3468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 3568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 3668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comtokens { 3748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver //Lexer tokens 3848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ACCESS_SPEC; 3948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ANNOTATION_DIRECTIVE; 4048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ANNOTATION_VISIBILITY; 4148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARRAY_DATA_DIRECTIVE; 4248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARRAY_DESCRIPTOR; 4348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARROW; 4448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_ARRAY_DESCRIPTOR; 4548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_CHAR_LITERAL; 4648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_CLASS_DESCRIPTOR; 4748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_FLOAT; 4848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_FLOAT_OR_ID; 4948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_INTEGER; 5048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_PRIMITIVE_TYPE; 5148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_SIMPLE_NAME; 5248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_STRING_LITERAL; 5348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_TYPE; 5448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BINARY_EXPONENT; 5548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BOOL_LITERAL; 5648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BYTE_LITERAL; 5748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CATCH_DIRECTIVE; 5848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CATCHALL_DIRECTIVE; 5948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CHAR_LITERAL; 6048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLASS_DESCRIPTOR; 6148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLASS_DIRECTIVE; 6248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLOSE_BRACE; 6348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLOSE_PAREN; 6448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver COLON; 6548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver COMMA; 6648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DECIMAL_EXPONENT; 6748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOTDOT; 6848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOUBLE_LITERAL; 6948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOUBLE_LITERAL_OR_ID; 7048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_ANNOTATION_DIRECTIVE; 7148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_ARRAY_DATA_DIRECTIVE; 7248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_FIELD_DIRECTIVE; 7348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_LOCAL_DIRECTIVE; 7448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_METHOD_DIRECTIVE; 7548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_PACKED_SWITCH_DIRECTIVE; 7648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_PARAMETER_DIRECTIVE; 7748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_SPARSE_SWITCH_DIRECTIVE; 7848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_SUBANNOTATION_DIRECTIVE; 7948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ENUM_DIRECTIVE; 8048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver EPILOGUE_DIRECTIVE; 8148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver EQUAL; 8248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ESCAPE_SEQUENCE; 8348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FIELD_DIRECTIVE; 8448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FIELD_OFFSET; 8548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FLOAT_LITERAL; 8648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FLOAT_LITERAL_OR_ID; 8748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver HEX_DIGIT; 8848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver HEX_DIGITS; 8948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver HEX_PREFIX; 9048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver IMPLEMENTS_DIRECTIVE; 9148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INLINE_INDEX; 9248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10t; 9348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10x; 9448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10x_ODEX; 9548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT11n; 9648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT11x; 9748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT12x; 9848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT12x_OR_ID; 9948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT20bc; 10048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT20t; 10148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_FIELD; 10248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX; 10348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_STRING; 10448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_TYPE; 1056c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver INSTRUCTION_FORMAT21ih; 1066c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver INSTRUCTION_FORMAT21lh; 10748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21s; 10848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21t; 10948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22b; 11048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_FIELD; 11148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX; 11248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_TYPE; 11348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22cs_FIELD; 11448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22s; 11548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22s_OR_ID; 11648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22t; 11748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22x; 11848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT23x; 11948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT30t; 12048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31c; 12148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31i; 12248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31i_OR_ID; 12348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31t; 12448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT32x; 12548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_METHOD; 12648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX; 12748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_TYPE; 12848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35mi_METHOD; 12948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35ms_METHOD; 13048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_METHOD; 13148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX; 13248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_TYPE; 13348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rmi_METHOD; 13448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rms_METHOD; 13548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT51l; 13648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INVALID_TOKEN; 13748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LINE_COMMENT; 13848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LINE_DIRECTIVE; 13948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LOCAL_DIRECTIVE; 14048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LOCALS_DIRECTIVE; 14148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LONG_LITERAL; 14248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver METHOD_DIRECTIVE; 143569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver MEMBER_NAME; 14448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver NEGATIVE_INTEGER_LITERAL; 14548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver NULL_LITERAL; 14648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OPEN_BRACE; 14748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OPEN_PAREN; 14848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PACKED_SWITCH_DIRECTIVE; 14948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAM_LIST; 15048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAM_LIST_OR_ID; 15148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAMETER_DIRECTIVE; 15248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver POSITIVE_INTEGER_LITERAL; 15348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PRIMITIVE_TYPE; 15448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PROLOGUE_DIRECTIVE; 15548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver REGISTER; 15648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver REGISTERS_DIRECTIVE; 15748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver RESTART_LOCAL_DIRECTIVE; 15848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SHORT_LITERAL; 15948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SIMPLE_NAME; 16048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SOURCE_DIRECTIVE; 16148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SPARSE_SWITCH_DIRECTIVE; 16248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver STRING_LITERAL; 16348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SUBANNOTATION_DIRECTIVE; 16448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SUPER_DIRECTIVE; 16548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VERIFICATION_ERROR_TYPE; 16648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VOID_TYPE; 16748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VTABLE_INDEX; 16848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver WHITE_SPACE; 16948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver 17048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver //A couple of generated types that we remap other tokens to, to simplify the generated AST 17148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LABEL; 17248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INTEGER_LITERAL; 17348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver 17440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //I_* tokens are imaginary tokens used as parent AST nodes 17540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CLASS_DEF; 17640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SUPER; 17740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_IMPLEMENTS; 17840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SOURCE; 17940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ACCESS_LIST; 18040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHODS; 18140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELDS; 18240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD; 18340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD_TYPE; 18440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD_INITIAL_VALUE; 18540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD; 18640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD_PROTOTYPE; 18740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD_RETURN_TYPE; 18840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTERS; 18940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LOCALS; 19040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LABEL; 19140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATIONS; 19240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATION; 19340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATION_ELEMENT; 19440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SUBANNOTATION; 19540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_FIELD; 19640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_METHOD; 19740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_ENUM; 19840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_ARRAY; 19940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ARRAY_ELEMENT_SIZE; 20040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ARRAY_ELEMENTS; 20140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PACKED_SWITCH_START_KEY; 2026c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_PACKED_SWITCH_ELEMENTS; 2036c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_SPARSE_SWITCH_ELEMENTS; 20440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCH; 20540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCHALL; 20640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCHES; 20740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETER; 20840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETERS; 20940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETER_NOT_SPECIFIED; 21040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LINE; 21140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LOCAL; 21240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_END_LOCAL; 21340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_RESTART_LOCAL; 21440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PROLOGUE; 21540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_EPILOGUE; 216766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver I_ORDERED_METHOD_ITEMS; 21740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT10t; 21840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT10x; 21940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT11n; 22040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT11x; 22140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT12x; 22240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT20bc; 22340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT20t; 22440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_TYPE; 22540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_FIELD; 22640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_STRING; 2276c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_STATEMENT_FORMAT21ih; 2286c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_STATEMENT_FORMAT21lh; 22940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21s; 23040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21t; 23140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22b; 23240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22c_FIELD; 23340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22c_TYPE; 23440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22s; 23540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22t; 23640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22x; 23740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT23x; 23840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT30t; 23940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31c; 24040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31i; 24140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31t; 24240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT32x; 24340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT35c_METHOD; 24440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT35c_TYPE; 24540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT3rc_METHOD; 24640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT3rc_TYPE; 24740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT51l; 24840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_ARRAY_DATA; 24940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_PACKED_SWITCH; 25040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_SPARSE_SWITCH; 25140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTER_RANGE; 25240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTER_LIST; 25368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 25468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 25568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header { 256b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali; 25768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 2586c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Format; 2596c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Opcode; 26083f77f51aa888998486c0c9ad693047480b060b0Ben Gruverimport org.jf.dexlib2.Opcodes; 26168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 26268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 26368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 26468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members { 26540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public static final int ERROR_CHANNEL = 100; 26640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 26740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private boolean verboseErrors = false; 26840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private boolean allowOdex = false; 26983f77f51aa888998486c0c9ad693047480b060b0Ben Gruver private int apiLevel = 15; 27083f77f51aa888998486c0c9ad693047480b060b0Ben Gruver private Opcodes opcodes = new Opcodes(apiLevel); 27140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setVerboseErrors(boolean verboseErrors) { 27340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.verboseErrors = verboseErrors; 27440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 27540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setAllowOdex(boolean allowOdex) { 27740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.allowOdex = allowOdex; 27840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 27940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 28040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setApiLevel(int apiLevel) { 28183f77f51aa888998486c0c9ad693047480b060b0Ben Gruver this.opcodes = new Opcodes(apiLevel); 28240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.apiLevel = apiLevel; 28340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 28440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 28540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getErrorMessage(RecognitionException e, 28640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String[] tokenNames) { 28740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 28840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (verboseErrors) { 28940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List stack = getRuleInvocationStack(e, this.getClass().getName()); 29040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String msg = null; 29140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 29240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (e instanceof NoViableAltException) { 29340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver NoViableAltException nvae = (NoViableAltException)e; 29440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+ 29540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " (decision="+nvae.decisionNumber+ 29640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " state "+nvae.stateNumber+")"+ 29740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " decision=<<"+nvae.grammarDecisionDescription+">>"; 29840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else { 29940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver msg = super.getErrorMessage(e, tokenNames); 30040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 30240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return stack + " " + msg; 30340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else { 30440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return super.getErrorMessage(e, tokenNames); 30540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 30840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getTokenErrorDisplay(Token t) { 30940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!verboseErrors) { 31040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String s = t.getText(); 31140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( s==null ) { 31240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( t.getType()==Token.EOF ) { 31340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = "<EOF>"; 31440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver else { 31640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = "<"+tokenNames[t.getType()]+">"; 31740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\n","\\\\n"); 32040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\r","\\\\r"); 32140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\t","\\\\t"); 32240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return "'"+s+"'"; 32340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 32540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken ct = (CommonToken)t; 32640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 32740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String channelStr = ""; 32840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (t.getChannel()>0) { 32940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver channelStr=",channel="+t.getChannel(); 33040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 33140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String txt = t.getText(); 33240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( txt!=null ) { 33340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\n","\\\\n"); 33440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\r","\\\\r"); 33540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\t","\\\\t"); 33640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 33740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver else { 33840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = "<no text>"; 33940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]"; 34140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 34340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getErrorHeader(RecognitionException e) { 34440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]"; 34540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 34740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonTree buildTree(int type, String text, List<CommonTree> children) { 34840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(new CommonToken(type, text)); 34940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver for (CommonTree child: children) { 35040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(child); 35140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 35240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return root; 35340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 35440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 35540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) { 35640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken token = new CommonToken(baseToken); 35740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStartIndex(baseToken.getStartIndex() + typeStartIndex); 35840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 35940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver switch (str.charAt(typeStartIndex)) { 36040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'Z': 36140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'B': 36240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'S': 36340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'C': 36440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'I': 36540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'J': 36640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'F': 36740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'D': 36840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 36940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(PRIMITIVE_TYPE); 37040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, typeStartIndex+1)); 37140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + typeStartIndex); 37240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 37340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 37440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'L': 37540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 37640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i = typeStartIndex; 37740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(++i) != ';'); 37840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 37940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(CLASS_DESCRIPTOR); 38040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, i + 1)); 38140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + i); 38240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 38340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 38440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case '[': 38540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 38640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i = typeStartIndex; 38740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(++i) == '['); 38840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 38940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (str.charAt(i++) == 'L') { 39040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(i++) != ';'); 39140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 39240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 39340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(ARRAY_DESCRIPTOR); 39440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, i)); 39540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + i - 1); 39640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 39740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 39840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver default: 39940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex)); 40040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 40240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return token; 40340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 40540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonTree parseParamList(CommonToken paramListToken) { 40640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String paramList = paramListToken.getText(); 40740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(); 40840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 40940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int startIndex = paramListToken.getStartIndex(); 41040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 41140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i=0; 41240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (i<paramList.length()) { 41340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken token = getParamListSubToken(paramListToken, paramList, i); 41440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(new CommonTree(token)); 41540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver i += token.getText().length(); 41640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 41740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 41840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (root.getChildCount() == 0) { 41940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return null; 42040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return root; 42240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 42440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private void throwOdexedInstructionException(IntStream input, String odexedInstruction) 42540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throws OdexedInstructionException { 42640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver /*this has to be done in a separate method, otherwise java will complain about the 42740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver auto-generated code in the rule after the throw not being reachable*/ 42840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new OdexedInstructionException(input, odexedInstruction); 42940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 43068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 43168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 43268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 43368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file 43440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope 43540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 43640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasClassSpec; 43740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasSuperSpec; 43840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasSourceSpec; 43940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> classAnnotations; 44040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init 44240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false; 44340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $smali_file::classAnnotations = new ArrayList<CommonTree>(); 44440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : 44640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;} 44740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;} 44840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | implements_spec 44940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;} 45040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | method 45140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | field 45240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | annotation {$smali_file::classAnnotations.add($annotation.tree);} 45340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver )+ 45440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver EOF 45540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 45640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$smali_file::hasClassSpec) { 45740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, "The file must contain a .class directive"); 45840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 45940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 46040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$smali_file::hasSuperSpec) { 46140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$class_spec.className.equals("Ljava/lang/Object;")) { 46240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, "The file must contain a .super directive"); 46340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 46440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 46540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 46640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_CLASS_DEF 46740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver class_spec 46840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver super_spec? 46940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver implements_spec* 47040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver source_spec? 47140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)}); 4722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 47369c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className] 47440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list; 47568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 47668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec 47740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR); 47868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 47968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec 48040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR); 4812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 48268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec 48340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL); 48468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 48568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list 48640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*); 48768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 48868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 4894c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations 4904c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse 4914c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we 4924c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/ 4932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield 49440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 495569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor (EQUAL literal)? 49640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 49740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( END_FIELD_DIRECTIVE 498569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> ^(I_FIELD[$start, "I_FIELD"] member_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*)) 49940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);} 500569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> ^(I_FIELD[$start, "I_FIELD"] member_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS)) 50140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 50240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 5032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod 505569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives 50640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver END_METHOD_DIRECTIVE 507569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> ^(I_METHOD[$start, "I_METHOD"] member_name method_prototype access_list statements_and_directives); 50868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 50968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives 51040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope 51140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 51240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasRegistersDirective; 51340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> methodAnnotations; 51440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 51540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : { 51640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::hasRegistersDirective = false; 51740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>(); 51840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 519766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver ( ordered_method_item 52040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | registers_directive 52140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | catch_directive 52240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | catchall_directive 52340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | parameter_directive 52440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | annotation {$statements_and_directives::methodAnnotations.add($annotation.tree);} 52540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver )* 52640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> registers_directive? 527766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver ^(I_ORDERED_METHOD_ITEMS ordered_method_item*) 52840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_CATCHES catch_directive* catchall_directive*) 52940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_PARAMETERS parameter_directive*) 53040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)}; 53168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 532766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver/* Method items whose order/location is important */ 533766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverordered_method_item 534766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : label 535766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | instruction 536766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | debug_directive; 537766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver 53868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive 53940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ( 54040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount) 54140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2) 54240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 54340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 54440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ($statements_and_directives::hasRegistersDirective) { 54540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method"); 54640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 54740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::hasRegistersDirective=true; 54840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 5492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be 5512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/ 5522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name 55340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SIMPLE_NAME 55440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] 55540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] 55640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] 55740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] 55840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] 55940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] 56040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] 56140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] 56240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | REGISTER -> SIMPLE_NAME[$REGISTER] 56340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PARAM_LIST_OR_ID -> SIMPLE_NAME[$PARAM_LIST_OR_ID] 56440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] 56540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] 56640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] 56740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] 56840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] 56940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] 57040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] 57140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] 57240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] 57340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] 57440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] 57540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] 57640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] 57740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] 57840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] 57940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] 58040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] 58140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] 58240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] 58340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] 58440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] 58540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] 58640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] 58740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] 58840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] 58940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] 59040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] 59140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l]; 5922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 593569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruvermember_name 59440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : simple_name 595569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME]; 5962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype 59840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : OPEN_PAREN param_list CLOSE_PAREN type_descriptor 59940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?); 6002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list 60240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PARAM_LIST -> { parseParamList((CommonToken)$PARAM_LIST) } 60340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PARAM_LIST_OR_ID -> { parseParamList((CommonToken)$PARAM_LIST_OR_ID) } 60440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | nonvoid_type_descriptor*; 6052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor 60740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : VOID_TYPE 60840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE 60940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CLASS_DESCRIPTOR 61040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ARRAY_DESCRIPTOR; 6112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor 61340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PRIMITIVE_TYPE 61440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CLASS_DESCRIPTOR 61540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ARRAY_DESCRIPTOR; 6162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor 61840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DESCRIPTOR 61940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ARRAY_DESCRIPTOR; 6202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal 62240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] 62340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL]; 6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal 62640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] 62740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | FLOAT_LITERAL; 6282feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal 63040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] 63140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | DOUBLE_LITERAL; 6322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral 63440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 63540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 63640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 63740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL 63840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal 63940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | double_literal 64040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 64140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | STRING_LITERAL 64240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL 64340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NULL_LITERAL 64440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | array_literal 64540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | subannotation 64640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | type_field_method_literal 64740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | enum_literal; 6482feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 649450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruverparsed_integer_literal returns[int value] 650450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver : integer_literal { $value = LiteralTools.parseInt($integer_literal.text); }; 651450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver 6522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal 65340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 65440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 65540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 65640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 65740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL; 6582feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal 66040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 66140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 66240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 66340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL 66440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal 66540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 66640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL; 6672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 668766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverfixed_literal 669766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : integer_literal 670766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | LONG_LITERAL 671766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | SHORT_LITERAL 672766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | BYTE_LITERAL 673766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | float_literal 674766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | double_literal 675766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | CHAR_LITERAL 676766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | BOOL_LITERAL; 6772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal 67940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE 68040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*); 6812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element 68340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : simple_name EQUAL literal 68440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal); 6852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation 68740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR 68840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver annotation_element* END_ANNOTATION_DIRECTIVE 68940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*)); 6902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation 69240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE 69340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*); 6942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal 69640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ENUM_DIRECTIVE reference_type_descriptor ARROW simple_name COLON reference_type_descriptor 69740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ENCODED_ENUM reference_type_descriptor simple_name reference_type_descriptor); 6982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal 70040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : reference_type_descriptor 70140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( ARROW 702569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver ( member_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor member_name nonvoid_type_descriptor) 703569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver | member_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor member_name method_prototype) 70440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 70540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | -> reference_type_descriptor 70640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 70740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE 70840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VOID_TYPE; 7092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_method 711569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver : reference_type_descriptor ARROW member_name method_prototype 712569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> reference_type_descriptor member_name method_prototype; 7132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_field 715569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver : reference_type_descriptor ARROW member_name COLON nonvoid_type_descriptor 716569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> reference_type_descriptor member_name nonvoid_type_descriptor; 7172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel 719766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name); 7202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 721a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruverlabel_ref 722a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver : COLON simple_name -> simple_name; 7232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list 72540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*) 72640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]); 7272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7282feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range 72940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?); 73068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 73194e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference 73240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method; 73394e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver 73468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive 735a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref 736766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_CATCH[$start, "I_CATCH"] nonvoid_type_descriptor $from $to $using); 73768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 7382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive 739a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref 740766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_CATCHALL[$start, "I_CATCHALL"] $from $to $using); 74168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 7424c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations 7434c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse 7444c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we 7454c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/ 74668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive 74740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 7483e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver : PARAMETER_DIRECTIVE REGISTER (COMMA STRING_LITERAL)? 74940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 7504fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com 75140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( END_PARAMETER_DIRECTIVE 7523e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS annotation*)) 75340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);} 7543e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS)) 75540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 75668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 757766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverdebug_directive 75840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : line_directive 75940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | local_directive 76040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | end_local_directive 76140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | restart_local_directive 76240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | prologue_directive 76340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | epilogue_directive 76440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | source_directive; 76568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 76668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive 76740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LINE_DIRECTIVE integral_literal 768766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_LINE[$start, "I_LINE"] integral_literal); 7692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 77068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive 7713e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver : LOCAL_DIRECTIVE REGISTER (COMMA (NULL_LITERAL | name=STRING_LITERAL) COLON (VOID_TYPE | nonvoid_type_descriptor) 7723e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver (COMMA signature=STRING_LITERAL)? )? 773766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER NULL_LITERAL? $name? nonvoid_type_descriptor? $signature?); 77468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 77568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive 77640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : END_LOCAL_DIRECTIVE REGISTER 777766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER); 7782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 77968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive 78040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : RESTART_LOCAL_DIRECTIVE REGISTER 781766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER); 78268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 78368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive 78440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PROLOGUE_DIRECTIVE 785766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_PROLOGUE[$start, "I_PROLOGUE"]); 78668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 78768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive 78840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : EPILOGUE_DIRECTIVE 789766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_EPILOGUE[$start, "I_EPILOGUE"]); 7902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 79168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive 792b6435e7a475c64189906fb12e5408041bf3e750aBen Gruver : SOURCE_DIRECTIVE STRING_LITERAL? 793766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL?); 7942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x 79640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT12x 79740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID]; 7982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s 80040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT22s 80140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID]; 8022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 8032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i 80440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT31i 80540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID]; 8062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 80747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 80847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 809766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinstruction 810766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : insn_format10t 811766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format10x 812766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format10x_odex 813766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format11n 814766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format11x 815766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format12x 816766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format20bc 817766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format20t 818766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_field 819766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_field_odex 820766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_string 821766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_type 822766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21ih 823766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21lh 824766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21s 825766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21t 826766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22b 827766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22c_field 828766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22c_field_odex 829766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22c_type 830766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22cs_field 831766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22s 832766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22t 833766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22x 834766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format23x 835766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format30t 836766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format31c 837766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format31i 838766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format31t 839766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format32x 840766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35c_method 841766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35c_type 842766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35c_method_odex 843766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35mi_method 844766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35ms_method 845766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rc_method 846766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rc_method_odex 847766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rc_type 848766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rmi_method 849766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rms_method 850766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format51l 851766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_array_data_directive 852766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_packed_switch_directive 853766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_sparse_switch_directive; 854766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver 855766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10t 85640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto endloop: 85740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //e.g. goto +3 858766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT10t label_ref 859a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref); 86047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 861766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10x 86240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. return-void 863766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT10x 86440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x); 86547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 866766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10x_odex 86740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. return-void-barrier 868766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT10x_ODEX 86940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 87040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text); 87140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 87247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 873766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format11n 87440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/4 v0, 5 875766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal 87640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal); 87747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 878766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format11x 87940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move-result-object v1 880766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT11x REGISTER 88140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER); 88247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 883766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format12x 88440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move v1 v2 885766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver instruction_format12x REGISTER COMMA REGISTER 88640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER); 88747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 888766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format20bc 88940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. throw-verification-error generic-error, Lsome/class; 890766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference 89140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 89283f77f51aa888998486c0c9ad693047480b060b0Ben Gruver if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) { 89340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text); 89440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 89540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 89640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference); 89747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 898766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format20t 89940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto/16 endloop: 900766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT20t label_ref 901a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref); 90247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 903766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_field 90440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream; 905766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field 90640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field); 90747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 908766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_field_odex 90940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream; 910766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field 91140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 91283f77f51aa888998486c0c9ad693047480b060b0Ben Gruver if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) { 91340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text); 91440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 91540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 91640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field); 91747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 918766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_string 91940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-string v1, "Hello World!" 920766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL 92140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL); 92247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 923766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_type 92440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2; 925304aadf6e680af54eaf867a8e705e046a1e7a906Ben Gruver INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor 926304aadf6e680af54eaf867a8e705e046a1e7a906Ben Gruver -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor); 92747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 928766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21ih 92940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/high16 v1, 1234 930766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal 931feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver -> ^(I_STATEMENT_FORMAT21ih[$start, "I_STATEMENT_FORMAT21ih"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal); 9326c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver 933766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21lh 9346c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver : //e.g. const-wide/high16 v1, 1234 935766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal 936feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver -> ^(I_STATEMENT_FORMAT21lh[$start, "I_STATEMENT_FORMAT21lh"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal); 93747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 938766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21s 93940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/16 v1, 1234 940766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal 94140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal); 94247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 943766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21t 94440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. if-eqz v0, endloop: 945766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21t REGISTER COMMA label_ref 946a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref); 94747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 948766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22b 94940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int v0, v1, 123 950766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal 95140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal); 95247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 953766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_field 95440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 955766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field 95640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field); 95747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 958766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_field_odex 95940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 960766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field 96140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 96283f77f51aa888998486c0c9ad693047480b060b0Ben Gruver if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) { 96340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text); 96440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 96540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 96640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER fully_qualified_field); 96747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 968766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_type 96940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. instance-of v0, v1, Ljava/lang/String; 970766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor 97140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor); 97247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 973766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22cs_field 97440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iget-quick v0, v1, field@0xc 97540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET 97640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 97740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text); 97840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 97947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 980766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22s 98140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int/lit16 v0, v1, 12345 982766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal 98340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal); 98447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 985766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22t 98640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. if-eq v0, v1, endloop: 987766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref 988a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref); 98947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 990766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22x 99140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move/from16 v1, v1234 992766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER 99340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER); 99447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 995766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format23x 99640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int v1, v2, v3 997766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER 99840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER); 99947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1000766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format30t 100140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto/32 endloop: 1002766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT30t label_ref 1003a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref); 100447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1005766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31c 100640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-string/jumbo v1 "Hello World!" 1007766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL 100840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL); 100947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1010766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31i 101140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const v0, 123456 1012766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver instruction_format31i REGISTER COMMA fixed_32bit_literal 101340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal); 101447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1015766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31t 101640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. fill-array-data v0, ArrayData: 1017766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT31t REGISTER COMMA label_ref 1018a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref); 101947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1020766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format32x 102140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move/16 v4567, v1234 1022766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER 102340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER); 102447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1025766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_method 102640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V 1027766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 102840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method); 102947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1030766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_type 103140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. filled-new-array {v0,v1}, I 1032766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor 103340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor); 103447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1035766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_method_odex 103640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V 103740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 103840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 103940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text); 104040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 104147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1042766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35mi_method 104340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. execute-inline {v0, v1}, inline@0x4 104440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX 104540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 104640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text); 104740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 104847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1049766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35ms_method 105040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4 105140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX 105240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 105340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text); 105440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 105547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1056766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_method 105740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 1058766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method 105940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method); 106047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1061766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_method_odex 106240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V 106340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 106440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 106540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text); 106640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 106747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1068766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_type 106940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. filled-new-array/range {v0..v6}, I 1070766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor 107140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor); 107247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1073766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rmi_method 107440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. execute-inline/range {v0 .. v10}, inline@0x14 107540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX 107640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 107740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text); 107840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 107947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1080766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rms_method 108140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14 108240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX 108340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 108440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text); 108540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 108647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1087766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format51l 108840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-wide v0, 5000000000L 1089766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal 109040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal); 109147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1092766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_array_data_directive 1093450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver : ARRAY_DATA_DIRECTIVE 1094450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver parsed_integer_literal 1095450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver { 1096450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver int elementWidth = $parsed_integer_literal.value; 1097450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) { 1098450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver throw new SemanticException(input, $start, "Invalid element width: \%d. Must be 1, 2, 4 or 8", elementWidth); 1099450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver } 1100450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver } 1101766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver fixed_literal* END_ARRAY_DATA_DIRECTIVE 110240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 1103450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE parsed_integer_literal) 110440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_ARRAY_ELEMENTS fixed_literal*)); 110547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1106766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_packed_switch_directive 110747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : PACKED_SWITCH_DIRECTIVE 110840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver fixed_32bit_literal 1109766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver label_ref* 1110766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver END_PACKED_SWITCH_DIRECTIVE 111140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"] 111240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal) 11136c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver ^(I_PACKED_SWITCH_ELEMENTS[$start, "I_PACKED_SWITCH_ELEMENTS"] 1114766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver label_ref*) 111540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 1116d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com 1117766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_sparse_switch_directive 111840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SPARSE_SWITCH_DIRECTIVE 1119766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver (fixed_32bit_literal ARROW label_ref)* 1120766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver END_SPARSE_SWITCH_DIRECTIVE 112140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"] 1122766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver ^(I_SPARSE_SWITCH_ELEMENTS[$start, "I_SPARSE_SWITCH_ELEMENTS"] (fixed_32bit_literal label_ref)*));