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;
10548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21h;
10648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21s;
10748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21t;
10848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22b;
10948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22c_FIELD;
11048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22c_FIELD_ODEX;
11148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22c_TYPE;
11248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22cs_FIELD;
11348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22s;
11448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22s_OR_ID;
11548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22t;
11648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22x;
11748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT23x;
11848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT30t;
11948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31c;
12048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31i;
12148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31i_OR_ID;
12248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31t;
12348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT32x;
12448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35c_METHOD;
12548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35c_METHOD_ODEX;
12648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35c_TYPE;
12748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35mi_METHOD;
12848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35ms_METHOD;
12948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rc_METHOD;
13048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rc_METHOD_ODEX;
13148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rc_TYPE;
13248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rmi_METHOD;
13348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rms_METHOD;
13448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT51l;
13548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INVALID_TOKEN;
13648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LINE_COMMENT;
13748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LINE_DIRECTIVE;
13848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LOCAL_DIRECTIVE;
13948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LOCALS_DIRECTIVE;
14048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LONG_LITERAL;
14148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  METHOD_DIRECTIVE;
14248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  METHOD_NAME;
14348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  NEGATIVE_INTEGER_LITERAL;
14448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  NULL_LITERAL;
14548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OFFSET;
14648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OPEN_BRACE;
14748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OPEN_PAREN;
14848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PACKED_SWITCH_DIRECTIVE;
14948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAM_LIST;
15048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAM_LIST_OR_ID;
15148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAMETER_DIRECTIVE;
15248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  POSITIVE_INTEGER_LITERAL;
15348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PRIMITIVE_TYPE;
15448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PROLOGUE_DIRECTIVE;
15548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  REGISTER;
15648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  REGISTERS_DIRECTIVE;
15748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  RESTART_LOCAL_DIRECTIVE;
15848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SHORT_LITERAL;
15948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SIMPLE_NAME;
16048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SOURCE_DIRECTIVE;
16148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SPARSE_SWITCH_DIRECTIVE;
16248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  STRING_LITERAL;
16348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SUBANNOTATION_DIRECTIVE;
16448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SUPER_DIRECTIVE;
16548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VERIFICATION_ERROR_TYPE;
16648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VOID_TYPE;
16748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VTABLE_INDEX;
16848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  WHITE_SPACE;
16948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver
17048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  //A couple of generated types that we remap other tokens to, to simplify the generated AST
17148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LABEL;
17248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INTEGER_LITERAL;
17348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver
17440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  //I_* tokens are imaginary tokens used as parent AST nodes
17540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CLASS_DEF;
17640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SUPER;
17740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_IMPLEMENTS;
17840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SOURCE;
17940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ACCESS_LIST;
18040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHODS;
18140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELDS;
18240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD;
18340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD_TYPE;
18440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD_INITIAL_VALUE;
18540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD;
18640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD_PROTOTYPE;
18740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD_RETURN_TYPE;
18840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTERS;
18940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LOCALS;
19040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LABELS;
19140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LABEL;
19240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATIONS;
19340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATION;
19440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATION_ELEMENT;
19540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SUBANNOTATION;
19640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_FIELD;
19740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_METHOD;
19840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_ENUM;
19940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_ARRAY;
20040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ARRAY_ELEMENT_SIZE;
20140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ARRAY_ELEMENTS;
20240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_START_KEY;
20340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_TARGET_COUNT;
20440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_TARGETS;
20540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_DECLARATION;
20640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_DECLARATIONS;
20740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_KEYS;
20840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_TARGET_COUNT;
20940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_TARGETS;
21040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_DECLARATION;
21140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SPARSE_SWITCH_DECLARATIONS;
21240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ADDRESS;
21340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCH;
21440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCHALL;
21540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCHES;
21640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETER;
21740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETERS;
21840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETER_NOT_SPECIFIED;
21940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ORDERED_DEBUG_DIRECTIVES;
22040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LINE;
22140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LOCAL;
22240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_END_LOCAL;
22340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_RESTART_LOCAL;
22440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PROLOGUE;
22540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_EPILOGUE;
22640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENTS;
22740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT10t;
22840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT10x;
22940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT11n;
23040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT11x;
23140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT12x;
23240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT20bc;
23340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT20t;
23440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_TYPE;
23540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_FIELD;
23640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_STRING;
23740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21h;
23840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21s;
23940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21t;
24040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22b;
24140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22c_FIELD;
24240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22c_TYPE;
24340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22s;
24440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22t;
24540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22x;
24640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT23x;
24740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT30t;
24840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31c;
24940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31i;
25040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31t;
25140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT32x;
25240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT35c_METHOD;
25340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT35c_TYPE;
25440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT3rc_METHOD;
25540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT3rc_TYPE;
2569a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  I_STATEMENT_FORMAT41c_TYPE;
2579a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  I_STATEMENT_FORMAT41c_FIELD;
25840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT51l;
2599a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  I_STATEMENT_FORMAT52c_TYPE;
2609a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  I_STATEMENT_FORMAT52c_FIELD;
2619a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  I_STATEMENT_FORMAT5rc_METHOD;
2629a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  I_STATEMENT_FORMAT5rc_TYPE;
26340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_ARRAY_DATA;
26440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_PACKED_SWITCH;
26540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_SPARSE_SWITCH;
26640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTER_RANGE;
26740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTER_LIST;
26868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
26968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
27068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header {
271b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali;
27268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
2730871036088eb43bbfe82bfe2a9411a79a87c9791JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.*;
2749c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruverimport org.jf.dexlib.Code.Opcode;
27568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
27668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
27768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
27868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members {
27940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public static final int ERROR_CHANNEL = 100;
28040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
28140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private boolean verboseErrors = false;
28240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private boolean allowOdex = false;
28340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private int apiLevel;
28440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
28540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setVerboseErrors(boolean verboseErrors) {
28640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    this.verboseErrors = verboseErrors;
28740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
28840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
28940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setAllowOdex(boolean allowOdex) {
29040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      this.allowOdex = allowOdex;
29140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
29240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
29340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setApiLevel(int apiLevel) {
29440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      this.apiLevel = apiLevel;
29540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
29640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
29740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getErrorMessage(RecognitionException e,
29840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String[] tokenNames) {
29940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
30040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (verboseErrors) {
30140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      List stack = getRuleInvocationStack(e, this.getClass().getName());
30240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      String msg = null;
30340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
30440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (e instanceof NoViableAltException) {
30540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        NoViableAltException nvae = (NoViableAltException)e;
30640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+
30740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " (decision="+nvae.decisionNumber+
30840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " state "+nvae.stateNumber+")"+
30940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " decision=<<"+nvae.grammarDecisionDescription+">>";
31040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else {
31140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        msg = super.getErrorMessage(e, tokenNames);
31240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
31340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
31440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return stack + " " + msg;
31540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    } else {
31640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return super.getErrorMessage(e, tokenNames);
31740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
31840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
31940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
32040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getTokenErrorDisplay(Token t) {
32140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!verboseErrors) {
32240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      String s = t.getText();
32340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ( s==null ) {
32440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        if ( t.getType()==Token.EOF ) {
32540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver          s = "<EOF>";
32640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
32740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        else {
32840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver          s = "<"+tokenNames[t.getType()]+">";
32940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
33040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
33140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\n","\\\\n");
33240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\r","\\\\r");
33340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\t","\\\\t");
33440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return "'"+s+"'";
33540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
33640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
33740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonToken ct = (CommonToken)t;
33840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
33940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String channelStr = "";
34040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (t.getChannel()>0) {
34140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      channelStr=",channel="+t.getChannel();
34240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
34340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String txt = t.getText();
34440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if ( txt!=null ) {
34540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\n","\\\\n");
34640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\r","\\\\r");
34740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\t","\\\\t");
34840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
34940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    else {
35040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = "<no text>";
35140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
35240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]";
35340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
35440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
35540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getErrorHeader(RecognitionException e) {
35640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
35740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
35840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
35940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonTree buildTree(int type, String text, List<CommonTree> children) {
36040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonTree root = new CommonTree(new CommonToken(type, text));
36140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    for (CommonTree child: children) {
36240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      root.addChild(child);
36340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
36440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return root;
36540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
36640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
36740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) {
36840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonToken token = new CommonToken(baseToken);
36940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    token.setStartIndex(baseToken.getStartIndex() + typeStartIndex);
37040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
37140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    switch (str.charAt(typeStartIndex)) {
37240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'Z':
37340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'B':
37440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'S':
37540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'C':
37640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'I':
37740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'J':
37840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'F':
37940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'D':
38040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
38140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setType(PRIMITIVE_TYPE);
38240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setText(str.substring(typeStartIndex, typeStartIndex+1));
38340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setStopIndex(baseToken.getStartIndex() + typeStartIndex);
38440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        break;
38540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
38640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'L':
38740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
38840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        int i = typeStartIndex;
38940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        while (str.charAt(++i) != ';');
39040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
39140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setType(CLASS_DESCRIPTOR);
39240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setText(str.substring(typeStartIndex, i + 1));
39340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setStopIndex(baseToken.getStartIndex() + i);
39440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        break;
39540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
39640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case '[':
39740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
39840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        int i = typeStartIndex;
39940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            while (str.charAt(++i) == '[');
40040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
40140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            if (str.charAt(i++) == 'L') {
40240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver                while (str.charAt(i++) != ';');
40340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
40440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
40540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            token.setType(ARRAY_DESCRIPTOR);
40640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            token.setText(str.substring(typeStartIndex, i));
40740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            token.setStopIndex(baseToken.getStartIndex() + i - 1);
40840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver            break;
40940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
41040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      default:
41140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex));
41240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
41340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
41440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return token;
41540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
41640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
41740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonTree parseParamList(CommonToken paramListToken) {
41840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String paramList = paramListToken.getText();
41940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonTree root = new CommonTree();
42040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
42140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    int startIndex = paramListToken.getStartIndex();
42240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
42340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    int i=0;
42440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    while (i<paramList.length()) {
42540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      CommonToken token = getParamListSubToken(paramListToken, paramList, i);
42640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      root.addChild(new CommonTree(token));
42740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      i += token.getText().length();
42840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
42940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
43040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (root.getChildCount() == 0) {
43140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return null;
43240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
43340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return root;
43440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
43540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
43640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private void throwOdexedInstructionException(IntStream input, String odexedInstruction)
43740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throws OdexedInstructionException {
43840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    /*this has to be done in a separate method, otherwise java will complain about the
43940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    auto-generated code in the rule after the throw not being reachable*/
44040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    throw new OdexedInstructionException(input, odexedInstruction);
44140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
44268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
44368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
44468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
44568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file
44640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope
44740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
44840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasClassSpec;
44940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasSuperSpec;
45040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasSourceSpec;
45140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> classAnnotations;
45240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
45340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init
45440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false;
45540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    $smali_file::classAnnotations = new ArrayList<CommonTree>();
45640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
45740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :
45840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;}
45940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;}
46040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | implements_spec
46140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;}
46240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | method
46340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | field
46440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | annotation {$smali_file::classAnnotations.add($annotation.tree);}
46540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  )+
46640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  EOF
46740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
46840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!$smali_file::hasClassSpec) {
46940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throw new SemanticException(input, "The file must contain a .class directive");
47040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
47140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
47240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!$smali_file::hasSuperSpec) {
47340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!$class_spec.className.equals("Ljava/lang/Object;")) {
47440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new SemanticException(input, "The file must contain a .super directive");
47540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
47640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
47740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
47840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> ^(I_CLASS_DEF
47940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       class_spec
48040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       super_spec?
48140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       implements_spec*
48240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       source_spec?
48340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)});
4842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
48569c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className]
48640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list;
48768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
48868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec
48940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR);
49068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
49168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec
49240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR);
4932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
49468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec
49540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL);
49668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
49768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list
49840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*);
49968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
50068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
5014c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations
5024c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse
5034c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we
5044c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/
5052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield
50640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
50740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : FIELD_DIRECTIVE access_list simple_name COLON nonvoid_type_descriptor (EQUAL literal)?
50840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
50940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      ( END_FIELD_DIRECTIVE
51040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*))
51140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);}
51240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS))
51340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      )
51440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    );
5152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod
51740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope {int currentAddress;}
51840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : {$method::currentAddress = 0;}
51940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    METHOD_DIRECTIVE access_list method_name method_prototype statements_and_directives
52040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_METHOD_DIRECTIVE
52140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_METHOD[$start, "I_METHOD"] method_name method_prototype access_list statements_and_directives);
52268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
52368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives
52440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope
52540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
52640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasRegistersDirective;
52740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> packedSwitchDeclarations;
52840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> sparseSwitchDeclarations;
52940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> methodAnnotations;
53040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
53140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : {
53240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $method::currentAddress = 0;
53340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::hasRegistersDirective = false;
53440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::packedSwitchDeclarations = new ArrayList<CommonTree>();
53540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::sparseSwitchDeclarations = new ArrayList<CommonTree>();
53640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>();
53740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
53840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( instruction {$method::currentAddress += $instruction.size/2;}
53940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | registers_directive
54040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | label
54140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | catch_directive
54240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | catchall_directive
54340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | parameter_directive
54440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | ordered_debug_directive
54540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | annotation  {$statements_and_directives::methodAnnotations.add($annotation.tree);}
54640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )*
54740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> registers_directive?
54840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_LABELS label*)
54940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_PACKED_SWITCH_DECLARATIONS, "I_PACKED_SWITCH_DECLARATIONS", $statements_and_directives::packedSwitchDeclarations)}
55040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_SPARSE_SWITCH_DECLARATIONS, "I_SPARSE_SWITCH_DECLARATIONS", $statements_and_directives::sparseSwitchDeclarations)}
55140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_STATEMENTS instruction*)
55240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_CATCHES catch_directive* catchall_directive*)
55340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_PARAMETERS parameter_directive*)
55440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_ORDERED_DEBUG_DIRECTIVES ordered_debug_directive*)
55540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)};
55668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
55768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive
55840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : (
55940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount)
56040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2)
56140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )
56240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
56340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ($statements_and_directives::hasRegistersDirective) {
56440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method");
56540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
56640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::hasRegistersDirective=true;
56740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
5682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be
5702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/
5712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name
57240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SIMPLE_NAME
57340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC]
57440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE]
57540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL]
57640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL]
57740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID]
57840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID]
57940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL]
58040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL]
58140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | REGISTER -> SIMPLE_NAME[$REGISTER]
58240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PARAM_LIST_OR_ID -> SIMPLE_NAME[$PARAM_LIST_OR_ID]
58340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE]
58440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE]
58540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY]
58640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t]
58740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x]
58840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX]
58940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x]
59040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID]
59140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD]
59240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX]
59340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING]
59440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE]
59540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t]
59640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD]
59740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX]
59840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE]
59940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD]
60040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID]
60140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t]
60240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x]
60340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID]
60440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t]
60540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
60640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
60740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
60840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
60940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
61040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l];
6112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_name
61340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : simple_name
61440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | METHOD_NAME -> SIMPLE_NAME[$METHOD_NAME];
6152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype
61740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : OPEN_PAREN param_list CLOSE_PAREN type_descriptor
61840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?);
6192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list
62140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PARAM_LIST -> { parseParamList((CommonToken)$PARAM_LIST) }
62240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PARAM_LIST_OR_ID -> { parseParamList((CommonToken)$PARAM_LIST_OR_ID) }
62340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | nonvoid_type_descriptor*;
6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor
62640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : VOID_TYPE
62740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE
62840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CLASS_DESCRIPTOR
62940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ARRAY_DESCRIPTOR;
6302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor
63240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PRIMITIVE_TYPE
63340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CLASS_DESCRIPTOR
63440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ARRAY_DESCRIPTOR;
6352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor
63740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DESCRIPTOR
63840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ARRAY_DESCRIPTOR;
6392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal
64140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL]
64240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL];
6432feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal
64540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID]
64640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | FLOAT_LITERAL;
6472feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6482feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal
64940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID]
65040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | DOUBLE_LITERAL;
6512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral
65340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
65440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
65540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
65640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL
65740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal
65840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | double_literal
65940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
66040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | STRING_LITERAL
66140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL
66240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NULL_LITERAL
66340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | array_literal
66440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | subannotation
66540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | type_field_method_literal
66640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | enum_literal;
6672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal
66940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
67040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
67140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
67240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
67340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL;
6742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal
67640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
67740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
67840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
67940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL
68040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal
68140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
68240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL;
6832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_literal returns[int size]
68540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : integer_literal {$size = 4;}
68640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | LONG_LITERAL {$size = 8;}
68740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL {$size = 2;}
68840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL {$size = 1;}
68940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal {$size = 4;}
69040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | double_literal {$size = 8;}
69140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL {$size = 2;}
69240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL {$size = 1;};
6932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal
69540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE
69640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*);
6972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element
69940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : simple_name EQUAL literal
70040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal);
7012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation
70340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR
70440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    annotation_element* END_ANNOTATION_DIRECTIVE
70540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*));
7062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation
70840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE
70940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*);
7102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal
71240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ENUM_DIRECTIVE reference_type_descriptor ARROW simple_name COLON reference_type_descriptor
71340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> ^(I_ENCODED_ENUM reference_type_descriptor simple_name reference_type_descriptor);
7142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal
71640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor
71740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( ARROW
71840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      ( simple_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor simple_name nonvoid_type_descriptor)
71940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      | method_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor method_name method_prototype)
72040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      )
72140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | -> reference_type_descriptor
72240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )
72340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE
72440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VOID_TYPE;
7252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_method
72740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor ARROW method_name method_prototype
72840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> reference_type_descriptor method_name method_prototype;
7292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_field
73140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor ARROW simple_name COLON nonvoid_type_descriptor
73240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> reference_type_descriptor simple_name nonvoid_type_descriptor;
7332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel
73540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
7362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel_ref_or_offset
73840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : COLON simple_name -> simple_name
73940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | OFFSET
74040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> OFFSET[$NEGATIVE_INTEGER_LITERAL];
7412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list
74340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*)
74440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]);
7452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7462feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range
74740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?);
74868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
74994e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference
75040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method;
75194e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver
75268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive
75340c48da564efb8c95ed0599f0783b0fd676b6c1fBen 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
75440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_CATCH[$start, "I_CATCH"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] nonvoid_type_descriptor $from $to $using);
75568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
7562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive
75740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset
75840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_CATCHALL[$start, "I_CATCHALL"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] $from $to $using);
75968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
7604c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations
7614c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse
7624c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we
7634c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/
76468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive
76540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
76640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PARAMETER_DIRECTIVE
76740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    STRING_LITERAL?
76840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
7694fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com
77040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( END_PARAMETER_DIRECTIVE
77140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS annotation*))
77240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);}
77340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS))
77440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    );
77568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
77668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comordered_debug_directive
77740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : line_directive
77840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | local_directive
77940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | end_local_directive
78040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | restart_local_directive
78140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | prologue_directive
78240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | epilogue_directive
78340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | source_directive;
78468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
78568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive
78640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LINE_DIRECTIVE integral_literal
78740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_LINE integral_literal I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
7882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
78968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive
79040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LOCAL_DIRECTIVE REGISTER COMMA simple_name COLON nonvoid_type_descriptor (COMMA STRING_LITERAL)?
79140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER simple_name nonvoid_type_descriptor STRING_LITERAL? I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
79268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
79368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive
79440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : END_LOCAL_DIRECTIVE REGISTER
79540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
7962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
79768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive
79840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : RESTART_LOCAL_DIRECTIVE REGISTER
79940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
80068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
80168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive
80240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PROLOGUE_DIRECTIVE
80340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_PROLOGUE[$start, "I_PROLOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
80468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
80568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive
80640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : EPILOGUE_DIRECTIVE
80740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_EPILOGUE[$start, "I_EPILOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
8082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
80968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive
81040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SOURCE_DIRECTIVE STRING_LITERAL
81140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
8122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
8132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x
81440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT12x
81540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID];
8162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
8172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s
81840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT22s
81940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID];
8202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
8212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i
82240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT31i
82340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID];
8242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
82547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
82647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
82768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.cominstruction returns [int size]
82840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : insn_format10t { $size = $insn_format10t.size; }
82940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format10x { $size = $insn_format10x.size; }
83040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format10x_odex { $size = $insn_format10x_odex.size; }
83140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format11n { $size = $insn_format11n.size; }
83240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format11x { $size = $insn_format11x.size; }
83340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format12x { $size = $insn_format12x.size; }
83440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format20bc { $size = $insn_format20bc.size; }
83540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format20t { $size = $insn_format20t.size; }
83640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_field { $size = $insn_format21c_field.size; }
83740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_field_odex { $size = $insn_format21c_field_odex.size; }
83840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_string { $size = $insn_format21c_string.size; }
83940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21c_type { $size = $insn_format21c_type.size; }
84040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21h { $size = $insn_format21h.size; }
84140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21s { $size = $insn_format21s.size; }
84240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format21t { $size = $insn_format21t.size; }
84340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22b { $size = $insn_format22b.size; }
84440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22c_field { $size = $insn_format22c_field.size; }
84540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22c_field_odex { $size = $insn_format22c_field_odex.size; }
84640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22c_type { $size = $insn_format22c_type.size; }
84740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22cs_field { $size = $insn_format22cs_field.size; }
84840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22s { $size = $insn_format22s.size; }
84940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22t { $size = $insn_format22t.size; }
85040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format22x { $size = $insn_format22x.size; }
85140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format23x { $size = $insn_format23x.size; }
85240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format30t { $size = $insn_format30t.size; }
85340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format31c { $size = $insn_format31c.size; }
85440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format31i { $size = $insn_format31i.size; }
85540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format31t { $size = $insn_format31t.size; }
85640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format32x { $size = $insn_format32x.size; }
85740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35c_method { $size = $insn_format35c_method.size; }
85840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35c_type { $size = $insn_format35c_type.size; }
85940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35c_method_odex { $size = $insn_format35c_method_odex.size; }
86040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35mi_method { $size = $insn_format35mi_method.size; }
86140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format35ms_method { $size = $insn_format35ms_method.size; }
86240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rc_method { $size = $insn_format3rc_method.size; }
86340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rc_method_odex { $size = $insn_format3rc_method_odex.size; }
86440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rc_type { $size = $insn_format3rc_type.size; }
86540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rmi_method { $size = $insn_format3rmi_method.size; }
86640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format3rms_method { $size = $insn_format3rms_method.size; }
8679a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  | insn_format41c_type { $size = $insn_format41c_type.size; }
8689a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  | insn_format41c_field { $size = $insn_format41c_field.size; }
8699a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  | insn_format41c_field_odex { $size = $insn_format41c_field_odex.size; }
87040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_format51l { $size = $insn_format51l.size; }
8719a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  | insn_format52c_type { $size = $insn_format52c_type.size; }
8729a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  |  insn_format52c_field { $size = $insn_format52c_field.size; }
8739a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  |  insn_format52c_field_odex { $size = $insn_format52c_field_odex.size; }
8749a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  |  insn_format5rc_method { $size = $insn_format5rc_method.size; }
8759a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  |  insn_format5rc_method_odex { $size = $insn_format5rc_method_odex.size; }
8769a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  |  insn_format5rc_type { $size = $insn_format5rc_type.size; }
87740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_array_data_directive { $size = $insn_array_data_directive.size; }
87840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_packed_switch_directive { $size = $insn_packed_switch_directive.size; }
87940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | insn_sparse_switch_directive { $size = $insn_sparse_switch_directive.size; };
88047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
88147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10t returns [int size]
88240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto endloop:
88340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    //e.g. goto +3
88440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT10t label_ref_or_offset {$size = Format.Format10t.size;}
88540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref_or_offset);
88647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
88747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x returns [int size]
88840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. return-void
88940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT10x {$size = Format.Format10x.size;}
89040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x);
89147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
89247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x_odex returns [int size]
89340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. return-void-barrier
89440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT10x_ODEX {$size = Format.Format10x.size;}
89540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
89640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text);
89740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
89847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
89947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11n returns [int size]
90040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/4 v0, 5
90140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal {$size = Format.Format11n.size;}
90240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal);
90347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
90447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11x returns [int size]
90540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move-result-object v1
90640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT11x REGISTER {$size = Format.Format11x.size;}
90740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER);
90847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
90947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format12x returns [int size]
91040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move v1 v2
91140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    instruction_format12x REGISTER COMMA REGISTER {$size = Format.Format12x.size;}
91240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER);
91347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
91447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20bc returns [int size]
91540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. throw-verification-error generic-error, Lsome/class;
91640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference {$size += Format.Format20bc.size;}
91740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
91840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) {
91940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text);
92040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
92140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
92240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference);
92340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    //TODO: check if dalvik has a jumbo version of throw-verification-error
92447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
92547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20t returns [int size]
92640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto/16 endloop:
92740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;}
92840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset);
92947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
93047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field returns [int size]
93140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream;
93240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
93340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field);
93447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
93547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field_odex returns [int size]
93640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream;
93740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
93840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
93940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) {
94040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text);
94140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
94240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
94340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field);
94447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
94547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_string returns [int size]
94640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-string v1, "Hello World!"
94740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL {$size = Format.Format21c.size;}
94840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL);
94947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
95047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_type returns [int size]
95140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2;
95240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;}
95340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor);
95447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
95547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21h returns [int size]
95640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/high16 v1, 1234
95740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21h REGISTER COMMA integral_literal {$size = Format.Format21h.size;}
95840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21h[$start, "I_STATEMENT_FORMAT21h"] INSTRUCTION_FORMAT21h REGISTER integral_literal);
95947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
96047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21s returns [int size]
96140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/16 v1, 1234
96240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal {$size = Format.Format21s.size;}
96340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal);
96447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
96547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21t returns [int size]
96640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. if-eqz v0, endloop:
96740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT21t REGISTER COMMA (label_ref_or_offset) {$size = Format.Format21t.size;}
96840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref_or_offset);
96947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
97047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22b returns [int size]
97140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int v0, v1, 123
97240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22b.size;}
97340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal);
97447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
97547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field returns [int size]
97640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
97740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;}
97840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field);
97947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
98047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field_odex returns [int size]
98140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
98240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;}
98340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
98440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) {
98540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text);
98640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
98740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
98840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER fully_qualified_field);
98947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
99047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_type returns [int size]
99140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. instance-of v0, v1, Ljava/lang/String;
99240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format22c.size;}
99340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
99447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
99547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22cs_field returns [int size]
99640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iget-quick v0, v1, field@0xc
99740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
99840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
99940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text);
100040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
100147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
100247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22s returns [int size]
100340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int/lit16 v0, v1, 12345
100440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22s.size;}
100540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal);
100647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
100747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22t returns [int size]
100840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. if-eq v0, v1, endloop:
100940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref_or_offset {$size = Format.Format22t.size;}
101040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref_or_offset);
101147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
101247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22x returns [int size]
101340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move/from16 v1, v1234
101440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER {$size = Format.Format22x.size;}
101540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER);
101647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
101747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format23x returns [int size]
101840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int v1, v2, v3
101940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER {$size = Format.Format23x.size;}
102040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER);
102147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
102247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format30t returns [int size]
102340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto/32 endloop:
102440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT30t label_ref_or_offset {$size = Format.Format30t.size;}
102540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref_or_offset);
102647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
102747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31c returns [int size]
102840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-string/jumbo v1 "Hello World!"
102940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL {$size = Format.Format31c.size;}
103040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL);
103147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
103247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31i returns [int size]
103340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const v0, 123456
103440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    instruction_format31i REGISTER COMMA fixed_32bit_literal {$size = Format.Format31i.size;}
103540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal);
103647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
103747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31t returns [int size]
103840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. fill-array-data v0, ArrayData:
103940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT31t REGISTER COMMA label_ref_or_offset {$size = Format.Format31t.size;}
104040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
104140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ($INSTRUCTION_FORMAT31t.text.equals("packed-switch")) {
104240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree root = new CommonTree(new CommonToken(I_PACKED_SWITCH_DECLARATION, "I_PACKED_SWITCH_DECLARATION"));
104340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress)));
104440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild(address);
104540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild($label_ref_or_offset.tree.dupNode());
104640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $statements_and_directives::packedSwitchDeclarations.add(root);
104740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else if ($INSTRUCTION_FORMAT31t.text.equals("sparse-switch")) {
104840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree root = new CommonTree(new CommonToken(I_SPARSE_SWITCH_DECLARATION, "I_SPARSE_SWITCH_DECLARATION"));
104940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress)));
105040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild(address);
105140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        root.addChild($label_ref_or_offset.tree.dupNode());
105240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $statements_and_directives::sparseSwitchDeclarations.add(root);
105340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
105440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
105540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref_or_offset);
105647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
105747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format32x returns [int size]
105840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move/16 v4567, v1234
105940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER {$size = Format.Format32x.size;}
106040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER);
106147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
106247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method returns [int size]
106340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
106440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format35c.size;}
106540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method);
106647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
106747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_type returns [int size]
106840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. filled-new-array {v0,v1}, I
106940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format35c.size;}
107040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor);
107147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
107247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method_odex returns [int size]
107340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
107440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method
107540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
107640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text);
107740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
107847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
107947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35mi_method returns [int size]
108040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. execute-inline {v0, v1}, inline@0x4
108140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
108240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
108340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text);
108440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
108547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
108647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35ms_method returns [int size]
108740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4
108840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
108940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
109040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text);
109140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
109247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
109347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method returns [int size]
109440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
109540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format3rc.size;}
109640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method);
109747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
109847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method_odex returns [int size]
109940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V
110040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method
110140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
110240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text);
110340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
110447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
110547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_type returns [int size]
110640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. filled-new-array/range {v0..v6}, I
110740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format3rc.size;}
110840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor);
110947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
111047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rmi_method returns [int size]
111140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. execute-inline/range {v0 .. v10}, inline@0x14
111240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
111340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
111440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text);
111540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
111647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
111747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rms_method returns [int size]
111840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14
111940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
112040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
112140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text);
112240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
112347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
11249a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format41c_type returns [int size]
11259a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. const-class/jumbo v2, Lorg/jf/HelloWorld2/HelloWorld2;
11269a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT41c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format41c.size;}
11279a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    -> ^(I_STATEMENT_FORMAT41c_TYPE[$start, "I_STATEMENT_FORMAT41c"] INSTRUCTION_FORMAT41c_TYPE REGISTER reference_type_descriptor);
11289a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11299a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format41c_field returns [int size]
11309a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. sget-object/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
11319a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT41c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
11329a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    -> ^(I_STATEMENT_FORMAT41c_FIELD[$start, "I_STATEMENT_FORMAT41c_FIELD"] INSTRUCTION_FORMAT41c_FIELD REGISTER fully_qualified_field);
11339a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11349a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format41c_field_odex returns [int size]
11359a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. sget-object-volatile/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
11369a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT41c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
11379a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    {
11389a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT41c_FIELD_ODEX.text);
11399a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    };
11409a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
114147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format51l returns [int size]
114240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-wide v0, 5000000000L
114340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;}
114440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal);
114547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
11469a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format52c_type returns [int size]
11479a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. instance-of/jumbo v0, v1, Ljava/lang/String;
11489a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT52c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format52c.size;}
11499a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    -> ^(I_STATEMENT_FORMAT52c_TYPE[$start, "I_STATEMENT_FORMAT52c_TYPE"] INSTRUCTION_FORMAT52c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
11509a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11519a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format52c_field returns [int size]
11529a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. iput-object/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
11539a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT52c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
11549a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    -> ^(I_STATEMENT_FORMAT52c_FIELD[$start, "I_STATEMENT_FORMAT52c_FIELD"] INSTRUCTION_FORMAT52c_FIELD REGISTER REGISTER fully_qualified_field);
11559a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11569a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format52c_field_odex returns [int size]
11579a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. iput-object-volatile/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
11589a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT52c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
11599a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    {
11609a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT52c_FIELD_ODEX.text);
11619a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    };
11629a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11639a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format5rc_method returns [int size]
11649a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. invoke-virtual/jumbo {v25..v26}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
11659a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT5rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;}
11669a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    -> ^(I_STATEMENT_FORMAT5rc_METHOD[$start, "I_STATEMENT_FORMAT5rc_METHOD"] INSTRUCTION_FORMAT5rc_METHOD register_range fully_qualified_method);
11679a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11689a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format5rc_method_odex returns [int size]
11699a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. invoke-object-init/jumbo {v25}, Ljava/lang/Object-><init>()V
11709a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT5rc_METHOD_ODEX OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;}
11719a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    {
11729a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT5rc_METHOD_ODEX.text);
11739a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    };
11749a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
11759a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruverinsn_format5rc_type returns [int size]
11769a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver  : //e.g. filled-new-array/jumbo {v0..v6}, I
11779a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    INSTRUCTION_FORMAT5rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format5rc.size;}
11789a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver    -> ^(I_STATEMENT_FORMAT5rc_TYPE[$start, "I_STATEMENT_FORMAT5rc_TYPE"] INSTRUCTION_FORMAT5rc_TYPE register_range nonvoid_type_descriptor);
11799a9a664af23fb4582ef65ec6df4462b94690f0eeBen Gruver
118047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_array_data_directive returns [int size]
118147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    @init {boolean needsNop = false;}
118240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :   ARRAY_DATA_DIRECTIVE
118340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
118440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (($method::currentAddress \% 2) != 0) {
118540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        needsNop = true;
118640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $size = 2;
118740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else {
118840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $size = 0;
118940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
119040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
119140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
119240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    integral_literal (fixed_literal {$size+=$fixed_literal.size;})* END_ARRAY_DATA_DIRECTIVE
119340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {$size = (($size + 1)/2)*2 + 8;}
119440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
119540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    /*add a nop statement before this if needed to force the correct alignment*/
119640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> {needsNop}? ^(I_STATEMENT_FORMAT10x[$start,  "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"])
119740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE integral_literal) ^(I_ARRAY_ELEMENTS fixed_literal*))
119840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
119940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE integral_literal)
120040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_ARRAY_ELEMENTS fixed_literal*));
120147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
120247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_packed_switch_directive returns [int size]
120347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    @init {boolean needsNop = false; int targetCount = 0;}
120447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    :   PACKED_SWITCH_DIRECTIVE
120540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
120640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      targetCount = 0;
120740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (($method::currentAddress \% 2) != 0) {
120840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        needsNop = true;
120940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $size = 2;
121040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else {
121140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $size = 0;
121240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
121340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
121440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
121540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    fixed_32bit_literal
121640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
121740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    (switch_target += label_ref_or_offset {$size+=4; targetCount++;})*
121840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
121940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_PACKED_SWITCH_DIRECTIVE {$size = $size + 8;}
122040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
122140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    /*add a nop statement before this if needed to force the correct alignment*/
122240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> {needsNop}? ^(I_STATEMENT_FORMAT10x[$start,  "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"])
122340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
122440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
122540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_PACKED_SWITCH_TARGETS[$start, "I_PACKED_SWITCH_TARGETS"]
122640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver           I_PACKED_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] $switch_target*)
122740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       )
122840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
122940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
123040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
123140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_PACKED_SWITCH_TARGETS[$start, "I_PACKED_SWITCH_TARGETS"]
123240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver           I_PACKED_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] $switch_target*)
123340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       );
1234d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com
123547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_sparse_switch_directive returns [int size]
123647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    @init {boolean needsNop = false; int targetCount = 0;}
123740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :   SPARSE_SWITCH_DIRECTIVE
123840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
123940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      targetCount = 0;
124040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (($method::currentAddress \% 2) != 0) {
124140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        needsNop = true;
124240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $size = 2;
124340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else {
124440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        $size = 0;
124540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
124640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
124740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
124840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    (fixed_32bit_literal ARROW switch_target += label_ref_or_offset {$size += 8; targetCount++;})*
124940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
125040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_SPARSE_SWITCH_DIRECTIVE {$size = $size + 4;}
125140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
125240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    /*add a nop statement before this if needed to force the correct alignment*/
125340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> {needsNop}?
125440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_STATEMENT_FORMAT10x[$start,  "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"])
125540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
125640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         I_SPARSE_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)]
125740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_SPARSE_SWITCH_KEYS[$start, "I_SPARSE_SWITCH_KEYS"] fixed_32bit_literal*)
125840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_SPARSE_SWITCH_TARGETS $switch_target*)
125940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       )
126040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
126140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
126240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       I_SPARSE_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)]
126340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_SPARSE_SWITCH_KEYS[$start, "I_SPARSE_SWITCH_KEYS"] fixed_32bit_literal*)
126440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_SPARSE_SWITCH_TARGETS $switch_target*));