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