smaliParser.g revision feed0d1b84907955d3382f23db2c33eff7389792
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;
14348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  METHOD_NAME;
14448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  NEGATIVE_INTEGER_LITERAL;
14548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  NULL_LITERAL;
14648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OFFSET;
14748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OPEN_BRACE;
14848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OPEN_PAREN;
14948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PACKED_SWITCH_DIRECTIVE;
15048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAM_LIST;
15148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAM_LIST_OR_ID;
15248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAMETER_DIRECTIVE;
15348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  POSITIVE_INTEGER_LITERAL;
15448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PRIMITIVE_TYPE;
15548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PROLOGUE_DIRECTIVE;
15648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  REGISTER;
15748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  REGISTERS_DIRECTIVE;
15848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  RESTART_LOCAL_DIRECTIVE;
15948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SHORT_LITERAL;
16048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SIMPLE_NAME;
16148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SOURCE_DIRECTIVE;
16248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SPARSE_SWITCH_DIRECTIVE;
16348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  STRING_LITERAL;
16448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SUBANNOTATION_DIRECTIVE;
16548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SUPER_DIRECTIVE;
16648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VERIFICATION_ERROR_TYPE;
16748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VOID_TYPE;
16848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VTABLE_INDEX;
16948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  WHITE_SPACE;
17048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver
17148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  //A couple of generated types that we remap other tokens to, to simplify the generated AST
17248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LABEL;
17348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INTEGER_LITERAL;
17448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver
17540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  //I_* tokens are imaginary tokens used as parent AST nodes
17640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CLASS_DEF;
17740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SUPER;
17840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_IMPLEMENTS;
17940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SOURCE;
18040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ACCESS_LIST;
18140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHODS;
18240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELDS;
18340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD;
18440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD_TYPE;
18540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD_INITIAL_VALUE;
18640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD;
18740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD_PROTOTYPE;
18840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD_RETURN_TYPE;
18940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTERS;
19040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LOCALS;
19140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LABELS;
19240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LABEL;
19340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATIONS;
19440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATION;
19540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATION_ELEMENT;
19640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SUBANNOTATION;
19740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_FIELD;
19840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_METHOD;
19940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_ENUM;
20040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_ARRAY;
20140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ARRAY_ELEMENT_SIZE;
20240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ARRAY_ELEMENTS;
20340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_START_KEY;
2046c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_PACKED_SWITCH_ELEMENTS;
20540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_DECLARATION;
20640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_DECLARATIONS;
2076c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_SPARSE_SWITCH_ELEMENTS;
20840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_DECLARATION;
20940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_DECLARATIONS;
21040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ADDRESS;
21140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCH;
21240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCHALL;
21340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCHES;
21440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETER;
21540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETERS;
21640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETER_NOT_SPECIFIED;
21740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ORDERED_DEBUG_DIRECTIVES;
21840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LINE;
21940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LOCAL;
22040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_END_LOCAL;
22140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_RESTART_LOCAL;
22240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PROLOGUE;
22340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_EPILOGUE;
22440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENTS;
22540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT10t;
22640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT10x;
22740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT11n;
22840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT11x;
22940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT12x;
23040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT20bc;
23140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT20t;
23240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_TYPE;
23340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_FIELD;
23440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_STRING;
2356c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_STATEMENT_FORMAT21ih;
2366c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_STATEMENT_FORMAT21lh;
23740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21s;
23840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21t;
23940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22b;
24040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22c_FIELD;
24140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22c_TYPE;
24240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22s;
24340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22t;
24440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22x;
24540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT23x;
24640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT30t;
24740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31c;
24840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31i;
24940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31t;
25040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT32x;
25140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT35c_METHOD;
25240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT35c_TYPE;
25340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT3rc_METHOD;
25440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT3rc_TYPE;
25540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT51l;
25640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_ARRAY_DATA;
25740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_PACKED_SWITCH;
25840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_SPARSE_SWITCH;
25940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTER_RANGE;
26040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTER_LIST;
26168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
26268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
26368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header {
264b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali;
26568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
2666c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Format;
2676c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Opcode;
26868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
26968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
27068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
27168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members {
27240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public static final int ERROR_CHANNEL = 100;
27340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
27440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private boolean verboseErrors = false;
27540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private boolean allowOdex = false;
27640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private int apiLevel;
27740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
27840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setVerboseErrors(boolean verboseErrors) {
27940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    this.verboseErrors = verboseErrors;
28040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
28140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
28240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setAllowOdex(boolean allowOdex) {
28340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      this.allowOdex = allowOdex;
28440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
28540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
28640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setApiLevel(int apiLevel) {
28740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      this.apiLevel = apiLevel;
28840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
28940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
29040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getErrorMessage(RecognitionException e,
29140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String[] tokenNames) {
29240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
29340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (verboseErrors) {
29440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      List stack = getRuleInvocationStack(e, this.getClass().getName());
29540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      String msg = null;
29640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
29740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (e instanceof NoViableAltException) {
29840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        NoViableAltException nvae = (NoViableAltException)e;
29940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+
30040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " (decision="+nvae.decisionNumber+
30140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " state "+nvae.stateNumber+")"+
30240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " decision=<<"+nvae.grammarDecisionDescription+">>";
30340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else {
30440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        msg = super.getErrorMessage(e, tokenNames);
30540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
30640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
30740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return stack + " " + msg;
30840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    } else {
30940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return super.getErrorMessage(e, tokenNames);
31040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
31140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
31240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
31340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getTokenErrorDisplay(Token t) {
31440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!verboseErrors) {
31540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      String s = t.getText();
31640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ( s==null ) {
31740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        if ( t.getType()==Token.EOF ) {
31840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver          s = "<EOF>";
31940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
32040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        else {
32140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver          s = "<"+tokenNames[t.getType()]+">";
32240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
32340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
32440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\n","\\\\n");
32540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\r","\\\\r");
32640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\t","\\\\t");
32740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return "'"+s+"'";
32840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
32940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
33040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonToken ct = (CommonToken)t;
33140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
33240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String channelStr = "";
33340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (t.getChannel()>0) {
33440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      channelStr=",channel="+t.getChannel();
33540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
33640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String txt = t.getText();
33740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if ( txt!=null ) {
33840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\n","\\\\n");
33940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\r","\\\\r");
34040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\t","\\\\t");
34140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
34240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    else {
34340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = "<no text>";
34440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
34540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]";
34640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
34740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
34840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getErrorHeader(RecognitionException e) {
34940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
35040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
35140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
35240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonTree buildTree(int type, String text, List<CommonTree> children) {
35340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonTree root = new CommonTree(new CommonToken(type, text));
35440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    for (CommonTree child: children) {
35540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      root.addChild(child);
35640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
35740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return root;
35840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
35940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
36040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) {
36140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonToken token = new CommonToken(baseToken);
36240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    token.setStartIndex(baseToken.getStartIndex() + typeStartIndex);
36340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
36440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    switch (str.charAt(typeStartIndex)) {
36540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'Z':
36640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'B':
36740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'S':
36840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'C':
36940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'I':
37040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'J':
37140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'F':
37240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'D':
37340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
37440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setType(PRIMITIVE_TYPE);
37540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setText(str.substring(typeStartIndex, typeStartIndex+1));
37640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setStopIndex(baseToken.getStartIndex() + typeStartIndex);
37740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        break;
37840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
37940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'L':
38040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
38140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        int i = typeStartIndex;
38240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        while (str.charAt(++i) != ';');
38340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
38440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setType(CLASS_DESCRIPTOR);
38540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setText(str.substring(typeStartIndex, i + 1));
38640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setStopIndex(baseToken.getStartIndex() + i);
38740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        break;
38840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
38940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case '[':
39040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
39140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        int i = typeStartIndex;
39240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            while (str.charAt(++i) == '[');
39340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
39440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            if (str.charAt(i++) == 'L') {
39540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver                while (str.charAt(i++) != ';');
39640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
39740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
39840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            token.setType(ARRAY_DESCRIPTOR);
39940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            token.setText(str.substring(typeStartIndex, i));
40040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            token.setStopIndex(baseToken.getStartIndex() + i - 1);
40140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            break;
40240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
40340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      default:
40440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex));
40540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
40640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
40740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return token;
40840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
40940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
41040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonTree parseParamList(CommonToken paramListToken) {
41140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String paramList = paramListToken.getText();
41240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonTree root = new CommonTree();
41340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
41440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    int startIndex = paramListToken.getStartIndex();
41540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
41640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    int i=0;
41740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    while (i<paramList.length()) {
41840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      CommonToken token = getParamListSubToken(paramListToken, paramList, i);
41940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      root.addChild(new CommonTree(token));
42040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      i += token.getText().length();
42140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
42240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
42340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (root.getChildCount() == 0) {
42440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return null;
42540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
42640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return root;
42740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
42840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
42940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private void throwOdexedInstructionException(IntStream input, String odexedInstruction)
43040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throws OdexedInstructionException {
43140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    /*this has to be done in a separate method, otherwise java will complain about the
43240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    auto-generated code in the rule after the throw not being reachable*/
43340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    throw new OdexedInstructionException(input, odexedInstruction);
43440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
43568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
43668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
43768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
43868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file
43940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope
44040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
44140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasClassSpec;
44240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasSuperSpec;
44340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasSourceSpec;
44440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> classAnnotations;
44540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
44640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init
44740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false;
44840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    $smali_file::classAnnotations = new ArrayList<CommonTree>();
44940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
45040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :
45140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;}
45240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;}
45340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | implements_spec
45440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;}
45540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | method
45640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | field
45740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | annotation {$smali_file::classAnnotations.add($annotation.tree);}
45840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  )+
45940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  EOF
46040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
46140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!$smali_file::hasClassSpec) {
46240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throw new SemanticException(input, "The file must contain a .class directive");
46340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
46440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
46540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!$smali_file::hasSuperSpec) {
46640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!$class_spec.className.equals("Ljava/lang/Object;")) {
46740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new SemanticException(input, "The file must contain a .super directive");
46840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
46940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
47040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
47140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> ^(I_CLASS_DEF
47240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       class_spec
47340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       super_spec?
47440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       implements_spec*
47540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       source_spec?
47640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)});
4772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
47869c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className]
47940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list;
48068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
48168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec
48240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR);
48368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
48468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec
48540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR);
4862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
48768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec
48840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL);
48968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
49068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list
49140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*);
49268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
49368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
4944c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations
4954c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse
4964c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we
4974c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/
4982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield
49940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
50040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : FIELD_DIRECTIVE access_list simple_name COLON nonvoid_type_descriptor (EQUAL literal)?
50140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
50240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      ( END_FIELD_DIRECTIVE
50340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*))
50440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);}
50540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS))
50640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      )
50740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    );
5082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod
51040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope {int currentAddress;}
51140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : {$method::currentAddress = 0;}
51240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    METHOD_DIRECTIVE access_list method_name method_prototype statements_and_directives
51340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_METHOD_DIRECTIVE
51440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_METHOD[$start, "I_METHOD"] method_name method_prototype access_list statements_and_directives);
51568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
51668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives
51740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope
51840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
51940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasRegistersDirective;
52040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> packedSwitchDeclarations;
52140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> sparseSwitchDeclarations;
52240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> methodAnnotations;
52340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
52440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : {
52540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $method::currentAddress = 0;
52640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::hasRegistersDirective = false;
52740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::packedSwitchDeclarations = new ArrayList<CommonTree>();
52840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::sparseSwitchDeclarations = new ArrayList<CommonTree>();
52940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>();
53040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
53140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( instruction {$method::currentAddress += $instruction.size/2;}
53240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | registers_directive
53340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | label
53440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | catch_directive
53540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | catchall_directive
53640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | parameter_directive
53740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | ordered_debug_directive
53840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | annotation  {$statements_and_directives::methodAnnotations.add($annotation.tree);}
53940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )*
54040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> registers_directive?
54140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_LABELS label*)
54240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_PACKED_SWITCH_DECLARATIONS, "I_PACKED_SWITCH_DECLARATIONS", $statements_and_directives::packedSwitchDeclarations)}
54340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_SPARSE_SWITCH_DECLARATIONS, "I_SPARSE_SWITCH_DECLARATIONS", $statements_and_directives::sparseSwitchDeclarations)}
54440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_STATEMENTS instruction*)
54540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_CATCHES catch_directive* catchall_directive*)
54640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_PARAMETERS parameter_directive*)
54740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_ORDERED_DEBUG_DIRECTIVES ordered_debug_directive*)
54840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)};
54968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
55068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive
55140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : (
55240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount)
55340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2)
55440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )
55540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
55640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ($statements_and_directives::hasRegistersDirective) {
55740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method");
55840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
55940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::hasRegistersDirective=true;
56040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
5612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be
5632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/
5642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name
56540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SIMPLE_NAME
56640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC]
56740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE]
56840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL]
56940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL]
57040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID]
57140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID]
57240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL]
57340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL]
57440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | REGISTER -> SIMPLE_NAME[$REGISTER]
57540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PARAM_LIST_OR_ID -> SIMPLE_NAME[$PARAM_LIST_OR_ID]
57640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE]
57740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE]
57840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY]
57940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t]
58040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x]
58140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX]
58240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x]
58340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID]
58440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD]
58540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX]
58640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING]
58740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE]
58840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t]
58940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD]
59040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX]
59140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE]
59240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD]
59340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID]
59440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t]
59540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x]
59640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID]
59740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t]
59840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
59940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
60040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
60140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
60240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
60340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l];
6042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_name
60640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : simple_name
60740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | METHOD_NAME -> SIMPLE_NAME[$METHOD_NAME];
6082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype
61040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : OPEN_PAREN param_list CLOSE_PAREN type_descriptor
61140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?);
6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list
61440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PARAM_LIST -> { parseParamList((CommonToken)$PARAM_LIST) }
61540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PARAM_LIST_OR_ID -> { parseParamList((CommonToken)$PARAM_LIST_OR_ID) }
61640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | nonvoid_type_descriptor*;
6172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor
61940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : VOID_TYPE
62040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE
62140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CLASS_DESCRIPTOR
62240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ARRAY_DESCRIPTOR;
6232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor
62540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PRIMITIVE_TYPE
62640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CLASS_DESCRIPTOR
62740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ARRAY_DESCRIPTOR;
6282feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor
63040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DESCRIPTOR
63140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ARRAY_DESCRIPTOR;
6322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal
63440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL]
63540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL];
6362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal
63840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID]
63940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | FLOAT_LITERAL;
6402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal
64240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID]
64340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | DOUBLE_LITERAL;
6442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral
64640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
64740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
64840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
64940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL
65040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal
65140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | double_literal
65240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
65340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | STRING_LITERAL
65440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL
65540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NULL_LITERAL
65640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | array_literal
65740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | subannotation
65840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | type_field_method_literal
65940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | enum_literal;
6602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal
66240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
66340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
66440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
66540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
66640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL;
6672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal
66940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
67040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
67140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
67240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL
67340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal
67440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
67540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL;
6762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_literal returns[int size]
67840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : integer_literal {$size = 4;}
67940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | LONG_LITERAL {$size = 8;}
68040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL {$size = 2;}
68140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL {$size = 1;}
68240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal {$size = 4;}
68340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | double_literal {$size = 8;}
68440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL {$size = 2;}
68540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL {$size = 1;};
6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal
68840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE
68940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*);
6902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element
69240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : simple_name EQUAL literal
69340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal);
6942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation
69640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR
69740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    annotation_element* END_ANNOTATION_DIRECTIVE
69840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*));
6992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation
70140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE
70240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*);
7032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal
70540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ENUM_DIRECTIVE reference_type_descriptor ARROW simple_name COLON reference_type_descriptor
70640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> ^(I_ENCODED_ENUM reference_type_descriptor simple_name reference_type_descriptor);
7072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal
70940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor
71040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( ARROW
71140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      ( simple_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor simple_name nonvoid_type_descriptor)
71240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      | method_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor method_name method_prototype)
71340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      )
71440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | -> reference_type_descriptor
71540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )
71640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE
71740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VOID_TYPE;
7182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_method
72040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor ARROW method_name method_prototype
72140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> reference_type_descriptor method_name method_prototype;
7222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_field
72440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor ARROW simple_name COLON nonvoid_type_descriptor
72540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> reference_type_descriptor simple_name nonvoid_type_descriptor;
7262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel
72840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
7292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel_ref_or_offset
73140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : COLON simple_name -> simple_name
73240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | OFFSET
73340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> OFFSET[$NEGATIVE_INTEGER_LITERAL];
7342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list
73640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*)
73740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]);
7382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range
74040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?);
74168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
74294e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference
74340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method;
74494e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver
74568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive
74640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset
74740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_CATCH[$start, "I_CATCH"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] nonvoid_type_descriptor $from $to $using);
74868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
7492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive
75040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset
75140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_CATCHALL[$start, "I_CATCHALL"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] $from $to $using);
75268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
7534c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations
7544c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse
7554c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we
7564c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/
75768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive
75840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
75940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PARAMETER_DIRECTIVE
76040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    STRING_LITERAL?
76140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
7624fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com
76340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( END_PARAMETER_DIRECTIVE
76440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS annotation*))
76540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);}
76640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS))
76740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    );
76868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
76968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comordered_debug_directive
77040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : line_directive
77140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | local_directive
77240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | end_local_directive
77340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | restart_local_directive
77440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | prologue_directive
77540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | epilogue_directive
77640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | source_directive;
77768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
77868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive
77940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LINE_DIRECTIVE integral_literal
78040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_LINE integral_literal I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
7812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
78268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive
78340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LOCAL_DIRECTIVE REGISTER COMMA simple_name COLON nonvoid_type_descriptor (COMMA STRING_LITERAL)?
78440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER simple_name nonvoid_type_descriptor STRING_LITERAL? I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
78568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
78668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive
78740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : END_LOCAL_DIRECTIVE REGISTER
78840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
7892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
79068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive
79140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : RESTART_LOCAL_DIRECTIVE REGISTER
79240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
79368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
79468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive
79540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PROLOGUE_DIRECTIVE
79640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_PROLOGUE[$start, "I_PROLOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
79768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
79868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive
79940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : EPILOGUE_DIRECTIVE
80040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_EPILOGUE[$start, "I_EPILOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
8012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
80268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive
80340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SOURCE_DIRECTIVE STRING_LITERAL
80440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
8052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
8062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x
80740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT12x
80840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID];
8092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
8102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s
81140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT22s
81240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID];
8132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
8142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i
81540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT31i
81640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID];
8172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
81847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
81947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
82068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.cominstruction returns [int size]
82140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : insn_format10t { $size = $insn_format10t.size; }
82240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format10x { $size = $insn_format10x.size; }
82340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format10x_odex { $size = $insn_format10x_odex.size; }
82440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format11n { $size = $insn_format11n.size; }
82540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format11x { $size = $insn_format11x.size; }
82640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format12x { $size = $insn_format12x.size; }
82740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format20bc { $size = $insn_format20bc.size; }
82840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format20t { $size = $insn_format20t.size; }
82940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_field { $size = $insn_format21c_field.size; }
83040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_field_odex { $size = $insn_format21c_field_odex.size; }
83140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_string { $size = $insn_format21c_string.size; }
83240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_type { $size = $insn_format21c_type.size; }
8336c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  | insn_format21ih { $size = $insn_format21ih.size; }
8346c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  | insn_format21lh { $size = $insn_format21lh.size; }
83540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21s { $size = $insn_format21s.size; }
83640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21t { $size = $insn_format21t.size; }
83740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22b { $size = $insn_format22b.size; }
83840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22c_field { $size = $insn_format22c_field.size; }
83940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22c_field_odex { $size = $insn_format22c_field_odex.size; }
84040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22c_type { $size = $insn_format22c_type.size; }
84140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22cs_field { $size = $insn_format22cs_field.size; }
84240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22s { $size = $insn_format22s.size; }
84340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22t { $size = $insn_format22t.size; }
84440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22x { $size = $insn_format22x.size; }
84540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format23x { $size = $insn_format23x.size; }
84640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format30t { $size = $insn_format30t.size; }
84740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format31c { $size = $insn_format31c.size; }
84840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format31i { $size = $insn_format31i.size; }
84940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format31t { $size = $insn_format31t.size; }
85040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format32x { $size = $insn_format32x.size; }
85140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35c_method { $size = $insn_format35c_method.size; }
85240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35c_type { $size = $insn_format35c_type.size; }
85340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35c_method_odex { $size = $insn_format35c_method_odex.size; }
85440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35mi_method { $size = $insn_format35mi_method.size; }
85540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35ms_method { $size = $insn_format35ms_method.size; }
85640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rc_method { $size = $insn_format3rc_method.size; }
85740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rc_method_odex { $size = $insn_format3rc_method_odex.size; }
85840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rc_type { $size = $insn_format3rc_type.size; }
85940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rmi_method { $size = $insn_format3rmi_method.size; }
86040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rms_method { $size = $insn_format3rms_method.size; }
86140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format51l { $size = $insn_format51l.size; }
86240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_array_data_directive { $size = $insn_array_data_directive.size; }
86340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_packed_switch_directive { $size = $insn_packed_switch_directive.size; }
86440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_sparse_switch_directive { $size = $insn_sparse_switch_directive.size; };
86547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
86647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10t returns [int size]
86740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto endloop:
86840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    //e.g. goto +3
86940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT10t label_ref_or_offset {$size = Format.Format10t.size;}
87040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref_or_offset);
87147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
87247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x returns [int size]
87340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. return-void
87440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT10x {$size = Format.Format10x.size;}
87540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x);
87647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
87747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x_odex returns [int size]
87840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. return-void-barrier
87940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT10x_ODEX {$size = Format.Format10x.size;}
88040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
88140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text);
88240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
88347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
88447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11n returns [int size]
88540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/4 v0, 5
88640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal {$size = Format.Format11n.size;}
88740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal);
88847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
88947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11x returns [int size]
89040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move-result-object v1
89140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT11x REGISTER {$size = Format.Format11x.size;}
89240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER);
89347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
89447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format12x returns [int size]
89540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move v1 v2
89640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    instruction_format12x REGISTER COMMA REGISTER {$size = Format.Format12x.size;}
89740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER);
89847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
89947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20bc returns [int size]
90040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. throw-verification-error generic-error, Lsome/class;
90140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference {$size += Format.Format20bc.size;}
90240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
90340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) {
90440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text);
90540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
90640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
90740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference);
90840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    //TODO: check if dalvik has a jumbo version of throw-verification-error
90947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
91047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20t returns [int size]
91140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto/16 endloop:
91240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;}
91340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset);
91447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
91547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field returns [int size]
91640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream;
91740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
91840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field);
91947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
92047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field_odex returns [int size]
92140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream;
92240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
92340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
92440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) {
92540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text);
92640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
92740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
92840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field);
92947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
93047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_string returns [int size]
93140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-string v1, "Hello World!"
93240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL {$size = Format.Format21c.size;}
93340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL);
93447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
93547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_type returns [int size]
93640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2;
93740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;}
93840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor);
93947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
9406c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverinsn_format21ih returns [int size]
94140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/high16 v1, 1234
942feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver    INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal {$size = Format.Format21ih.size;}
943feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver    -> ^(I_STATEMENT_FORMAT21ih[$start, "I_STATEMENT_FORMAT21ih"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal);
9446c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver
9456c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverinsn_format21lh returns [int size]
9466c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  : //e.g. const-wide/high16 v1, 1234
947feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver    INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal {$size = Format.Format21lh.size;}
948feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver    -> ^(I_STATEMENT_FORMAT21lh[$start, "I_STATEMENT_FORMAT21lh"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal);
94947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
95047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21s returns [int size]
95140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/16 v1, 1234
95240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal {$size = Format.Format21s.size;}
95340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal);
95447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
95547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21t returns [int size]
95640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. if-eqz v0, endloop:
95740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21t REGISTER COMMA (label_ref_or_offset) {$size = Format.Format21t.size;}
95840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref_or_offset);
95947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
96047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22b returns [int size]
96140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int v0, v1, 123
96240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22b.size;}
96340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal);
96447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
96547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field returns [int size]
96640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
96740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;}
96840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field);
96947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
97047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field_odex returns [int size]
97140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
97240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;}
97340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
97440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) {
97540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text);
97640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
97740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
97840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER fully_qualified_field);
97947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
98047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_type returns [int size]
98140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. instance-of v0, v1, Ljava/lang/String;
98240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format22c.size;}
98340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
98447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
98547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22cs_field returns [int size]
98640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iget-quick v0, v1, field@0xc
98740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
98840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
98940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text);
99040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
99147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
99247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22s returns [int size]
99340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int/lit16 v0, v1, 12345
99440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22s.size;}
99540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal);
99647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
99747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22t returns [int size]
99840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. if-eq v0, v1, endloop:
99940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref_or_offset {$size = Format.Format22t.size;}
100040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref_or_offset);
100147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
100247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22x returns [int size]
100340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move/from16 v1, v1234
100440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER {$size = Format.Format22x.size;}
100540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER);
100647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
100747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format23x returns [int size]
100840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int v1, v2, v3
100940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER {$size = Format.Format23x.size;}
101040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER);
101147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
101247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format30t returns [int size]
101340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto/32 endloop:
101440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT30t label_ref_or_offset {$size = Format.Format30t.size;}
101540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref_or_offset);
101647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
101747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31c returns [int size]
101840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-string/jumbo v1 "Hello World!"
101940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL {$size = Format.Format31c.size;}
102040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL);
102147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
102247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31i returns [int size]
102340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const v0, 123456
102440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    instruction_format31i REGISTER COMMA fixed_32bit_literal {$size = Format.Format31i.size;}
102540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal);
102647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
102747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31t returns [int size]
102840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. fill-array-data v0, ArrayData:
102940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT31t REGISTER COMMA label_ref_or_offset {$size = Format.Format31t.size;}
103040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
103140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ($INSTRUCTION_FORMAT31t.text.equals("packed-switch")) {
103240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree root = new CommonTree(new CommonToken(I_PACKED_SWITCH_DECLARATION, "I_PACKED_SWITCH_DECLARATION"));
103340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress)));
103440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild(address);
103540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild($label_ref_or_offset.tree.dupNode());
103640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $statements_and_directives::packedSwitchDeclarations.add(root);
103740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else if ($INSTRUCTION_FORMAT31t.text.equals("sparse-switch")) {
103840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree root = new CommonTree(new CommonToken(I_SPARSE_SWITCH_DECLARATION, "I_SPARSE_SWITCH_DECLARATION"));
103940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress)));
104040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild(address);
104140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild($label_ref_or_offset.tree.dupNode());
104240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $statements_and_directives::sparseSwitchDeclarations.add(root);
104340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
104440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
104540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref_or_offset);
104647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
104747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format32x returns [int size]
104840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move/16 v4567, v1234
104940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER {$size = Format.Format32x.size;}
105040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER);
105147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
105247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method returns [int size]
105340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
105440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format35c.size;}
105540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method);
105647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
105747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_type returns [int size]
105840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. filled-new-array {v0,v1}, I
105940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format35c.size;}
106040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor);
106147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
106247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method_odex returns [int size]
106340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
106440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method
106540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
106640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text);
106740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
106847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
106947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35mi_method returns [int size]
107040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. execute-inline {v0, v1}, inline@0x4
107140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
107240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
107340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text);
107440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
107547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
107647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35ms_method returns [int size]
107740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4
107840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
107940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
108040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text);
108140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
108247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
108347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method returns [int size]
108440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
108540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format3rc.size;}
108640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method);
108747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
108847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method_odex returns [int size]
108940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V
109040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method
109140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
109240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text);
109340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
109447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
109547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_type returns [int size]
109640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. filled-new-array/range {v0..v6}, I
109740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format3rc.size;}
109840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor);
109947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
110047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rmi_method returns [int size]
110140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. execute-inline/range {v0 .. v10}, inline@0x14
110240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
110340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
110440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text);
110540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
110647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
110747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rms_method returns [int size]
110840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14
110940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
111040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
111140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text);
111240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
111347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
111447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format51l returns [int size]
111540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-wide v0, 5000000000L
111640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;}
111740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal);
111847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
111947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_array_data_directive returns [int size]
112040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :   ARRAY_DATA_DIRECTIVE
112140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
112240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    integral_literal (fixed_literal {$size+=$fixed_literal.size;})* END_ARRAY_DATA_DIRECTIVE
112340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {$size = (($size + 1)/2)*2 + 8;}
112440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
112540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE integral_literal)
112640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_ARRAY_ELEMENTS fixed_literal*));
112747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
112847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_packed_switch_directive returns [int size]
112947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    :   PACKED_SWITCH_DIRECTIVE
113040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    fixed_32bit_literal
113140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
11326c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver    (switch_target += label_ref_or_offset {$size+=4;})*
113340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
113440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_PACKED_SWITCH_DIRECTIVE {$size = $size + 8;}
113540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
113640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
113740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
11386c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver         ^(I_PACKED_SWITCH_ELEMENTS[$start, "I_PACKED_SWITCH_ELEMENTS"]
11396c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver          $switch_target*)
114040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       );
1141d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com
114247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_sparse_switch_directive returns [int size]
114340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :   SPARSE_SWITCH_DIRECTIVE
11446c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver    (fixed_32bit_literal ARROW switch_target += label_ref_or_offset {$size += 8;})*
114540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
114640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_SPARSE_SWITCH_DIRECTIVE {$size = $size + 4;}
114740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
114840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
11496c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver       ^(I_SPARSE_SWITCH_ELEMENTS[$start, "I_SPARSE_SWITCH_ELEMENTS"] (fixed_32bit_literal $switch_target)*));