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;
422fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver  ARRAY_TYPE_PREFIX;
4348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  ARROW;
4448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  BOOL_LITERAL;
4548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  BYTE_LITERAL;
4648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CATCH_DIRECTIVE;
4748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CATCHALL_DIRECTIVE;
4848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CHAR_LITERAL;
4948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CLASS_DESCRIPTOR;
5048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CLASS_DIRECTIVE;
5148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CLOSE_BRACE;
5248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  CLOSE_PAREN;
5348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  COLON;
5448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  COMMA;
5548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  DOTDOT;
5648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  DOUBLE_LITERAL;
5748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  DOUBLE_LITERAL_OR_ID;
5848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_ANNOTATION_DIRECTIVE;
5948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_ARRAY_DATA_DIRECTIVE;
6048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_FIELD_DIRECTIVE;
6148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_LOCAL_DIRECTIVE;
6248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_METHOD_DIRECTIVE;
6348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_PACKED_SWITCH_DIRECTIVE;
6448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_PARAMETER_DIRECTIVE;
6548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_SPARSE_SWITCH_DIRECTIVE;
6648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  END_SUBANNOTATION_DIRECTIVE;
6748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  ENUM_DIRECTIVE;
6848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  EPILOGUE_DIRECTIVE;
6948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  EQUAL;
7048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  FIELD_DIRECTIVE;
7148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  FIELD_OFFSET;
7248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  FLOAT_LITERAL;
7348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  FLOAT_LITERAL_OR_ID;
7448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  IMPLEMENTS_DIRECTIVE;
7548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INLINE_INDEX;
7648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT10t;
7748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT10x;
7848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT10x_ODEX;
7948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT11n;
8048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT11x;
8148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT12x;
8248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT12x_OR_ID;
8348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT20bc;
8448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT20t;
8548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21c_FIELD;
8648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21c_FIELD_ODEX;
8748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21c_STRING;
8848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21c_TYPE;
896c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  INSTRUCTION_FORMAT21ih;
906c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  INSTRUCTION_FORMAT21lh;
9148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21s;
9248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT21t;
9348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22b;
9448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22c_FIELD;
9548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22c_FIELD_ODEX;
9648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22c_TYPE;
9748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22cs_FIELD;
9848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22s;
9948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22s_OR_ID;
10048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22t;
10148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT22x;
10248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT23x;
10348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT30t;
10448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31c;
10548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31i;
10648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31i_OR_ID;
10748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT31t;
10848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT32x;
10948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35c_METHOD;
11048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35c_METHOD_ODEX;
11148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35c_TYPE;
11248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35mi_METHOD;
11348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT35ms_METHOD;
11448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rc_METHOD;
11548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rc_METHOD_ODEX;
11648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rc_TYPE;
11748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rmi_METHOD;
11848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT3rms_METHOD;
119afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  INSTRUCTION_FORMAT45cc_METHOD;
120afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  INSTRUCTION_FORMAT4rcc_METHOD;
12148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INSTRUCTION_FORMAT51l;
12248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LINE_COMMENT;
12348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LINE_DIRECTIVE;
12448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LOCAL_DIRECTIVE;
12548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LOCALS_DIRECTIVE;
12648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  LONG_LITERAL;
12748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  METHOD_DIRECTIVE;
128569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver  MEMBER_NAME;
12948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  NEGATIVE_INTEGER_LITERAL;
13048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  NULL_LITERAL;
13148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OPEN_BRACE;
13248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  OPEN_PAREN;
13348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PACKED_SWITCH_DIRECTIVE;
13406d108d791ea155c7ac7422f05e19c509b59788aBen Gruver  PARAM_LIST_OR_ID_PRIMITIVE_TYPE;
13548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PARAMETER_DIRECTIVE;
13648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  POSITIVE_INTEGER_LITERAL;
13748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PRIMITIVE_TYPE;
13848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  PROLOGUE_DIRECTIVE;
13948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  REGISTER;
14048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  REGISTERS_DIRECTIVE;
14148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  RESTART_LOCAL_DIRECTIVE;
14248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SHORT_LITERAL;
14348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SIMPLE_NAME;
14448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SOURCE_DIRECTIVE;
14548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SPARSE_SWITCH_DIRECTIVE;
14648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  STRING_LITERAL;
14748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SUBANNOTATION_DIRECTIVE;
14848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  SUPER_DIRECTIVE;
14948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VERIFICATION_ERROR_TYPE;
15048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VOID_TYPE;
15148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  VTABLE_INDEX;
15248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  WHITE_SPACE;
15348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver
154b90e2a4c62e5e0da19672998707f42c72cf2e909Ben Gruver  // misc non-lexer tokens
15548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver  INTEGER_LITERAL;
156b90e2a4c62e5e0da19672998707f42c72cf2e909Ben Gruver  INVALID_TOKEN;
15748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver
15840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  //I_* tokens are imaginary tokens used as parent AST nodes
15940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CLASS_DEF;
16040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SUPER;
16140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_IMPLEMENTS;
16240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SOURCE;
16340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ACCESS_LIST;
16440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHODS;
16540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELDS;
16640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD;
16740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD_TYPE;
16840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_FIELD_INITIAL_VALUE;
16940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD;
17040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD_PROTOTYPE;
17140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_METHOD_RETURN_TYPE;
17240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTERS;
17340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LOCALS;
17440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LABEL;
17540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATIONS;
17640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATION;
17740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ANNOTATION_ELEMENT;
17840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_SUBANNOTATION;
17940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_FIELD;
18040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_METHOD;
18140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_ENUM;
18240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ENCODED_ARRAY;
18340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ARRAY_ELEMENT_SIZE;
18440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_ARRAY_ELEMENTS;
18540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PACKED_SWITCH_START_KEY;
1866c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_PACKED_SWITCH_ELEMENTS;
1876c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_SPARSE_SWITCH_ELEMENTS;
18840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCH;
18940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCHALL;
19040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_CATCHES;
19140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETER;
19240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETERS;
19340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PARAMETER_NOT_SPECIFIED;
19440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LINE;
19540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_LOCAL;
19640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_END_LOCAL;
19740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_RESTART_LOCAL;
19840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_PROLOGUE;
19940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_EPILOGUE;
200766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  I_ORDERED_METHOD_ITEMS;
20140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT10t;
20240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT10x;
20340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT11n;
20440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT11x;
20540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT12x;
20640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT20bc;
20740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT20t;
20840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_TYPE;
20940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_FIELD;
21040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21c_STRING;
2116c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_STATEMENT_FORMAT21ih;
2126c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  I_STATEMENT_FORMAT21lh;
21340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21s;
21440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT21t;
21540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22b;
21640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22c_FIELD;
21740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22c_TYPE;
21840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22s;
21940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22t;
22040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT22x;
22140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT23x;
22240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT30t;
22340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31c;
22440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31i;
22540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT31t;
22640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT32x;
22740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT35c_METHOD;
22840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT35c_TYPE;
22940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT3rc_METHOD;
23040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT3rc_TYPE;
231afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  I_STATEMENT_FORMAT45cc_METHOD;
232afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  I_STATEMENT_FORMAT4rcc_METHOD;
23340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_FORMAT51l;
23440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_ARRAY_DATA;
23540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_PACKED_SWITCH;
23640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_STATEMENT_SPARSE_SWITCH;
23740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTER_RANGE;
23840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  I_REGISTER_LIST;
23968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
24068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
24168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header {
242b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali;
24368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
2446c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Format;
2456c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Opcode;
24683f77f51aa888998486c0c9ad693047480b060b0Ben Gruverimport org.jf.dexlib2.Opcodes;
24768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
24868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
24968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
25068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members {
25140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public static final int ERROR_CHANNEL = 100;
25240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
25340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private boolean verboseErrors = false;
25440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private boolean allowOdex = false;
25583f77f51aa888998486c0c9ad693047480b060b0Ben Gruver  private int apiLevel = 15;
2563ff884b1c345dbd030430e3eecf37e4d409f18b0Ben Gruver  private Opcodes opcodes = Opcodes.forApi(apiLevel);
25740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
25840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setVerboseErrors(boolean verboseErrors) {
25940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    this.verboseErrors = verboseErrors;
26040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
26140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
26240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public void setAllowOdex(boolean allowOdex) {
26340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      this.allowOdex = allowOdex;
26440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
26540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
266d7d995cc2dbd94e608c8e02778f4361c27b25f4bBen Gruver  public void setApiLevel(int apiLevel) {
267d7d995cc2dbd94e608c8e02778f4361c27b25f4bBen Gruver      this.opcodes = Opcodes.forApi(apiLevel);
26840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      this.apiLevel = apiLevel;
26940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
27040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
27140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getErrorMessage(RecognitionException e,
27240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String[] tokenNames) {
27340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
27440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (verboseErrors) {
27540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      List stack = getRuleInvocationStack(e, this.getClass().getName());
27640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      String msg = null;
27740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
27840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (e instanceof NoViableAltException) {
27940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        NoViableAltException nvae = (NoViableAltException)e;
28040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+
28140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " (decision="+nvae.decisionNumber+
28240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " state "+nvae.stateNumber+")"+
28340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        " decision=<<"+nvae.grammarDecisionDescription+">>";
28440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      } else {
28540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        msg = super.getErrorMessage(e, tokenNames);
28640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
28740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
28840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return stack + " " + msg;
28940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    } else {
29040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return super.getErrorMessage(e, tokenNames);
29140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
29240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
29340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
29440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getTokenErrorDisplay(Token t) {
29540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!verboseErrors) {
29640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      String s = t.getText();
29740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ( s==null ) {
29840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        if ( t.getType()==Token.EOF ) {
29940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver          s = "<EOF>";
30040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
30140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        else {
30240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver          s = "<"+tokenNames[t.getType()]+">";
30340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        }
30440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
30540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\n","\\\\n");
30640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\r","\\\\r");
30740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      s = s.replaceAll("\t","\\\\t");
30840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return "'"+s+"'";
30940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
31040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
31140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonToken ct = (CommonToken)t;
31240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
31340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String channelStr = "";
31440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (t.getChannel()>0) {
31540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      channelStr=",channel="+t.getChannel();
31640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
31740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String txt = t.getText();
31840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if ( txt!=null ) {
31940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\n","\\\\n");
32040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\r","\\\\r");
32140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = txt.replaceAll("\t","\\\\t");
32240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
32340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    else {
32440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      txt = "<no text>";
32540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
32640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]";
32740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
32840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
32940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  public String getErrorHeader(RecognitionException e) {
33040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
33140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
33240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
33340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonTree buildTree(int type, String text, List<CommonTree> children) {
33440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonTree root = new CommonTree(new CommonToken(type, text));
33540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    for (CommonTree child: children) {
33640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      root.addChild(child);
33740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
33840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return root;
33940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
34040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
34140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) {
34240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonToken token = new CommonToken(baseToken);
34340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    token.setStartIndex(baseToken.getStartIndex() + typeStartIndex);
34440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
34540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    switch (str.charAt(typeStartIndex)) {
34640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'Z':
34740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'B':
34840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'S':
34940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'C':
35040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'I':
35140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'J':
35240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'F':
35340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'D':
35440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
35540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setType(PRIMITIVE_TYPE);
35640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setText(str.substring(typeStartIndex, typeStartIndex+1));
35740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setStopIndex(baseToken.getStartIndex() + typeStartIndex);
35840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        break;
35940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
36040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case 'L':
36140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
36240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        int i = typeStartIndex;
36340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        while (str.charAt(++i) != ';');
36440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
36540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setType(CLASS_DESCRIPTOR);
36640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setText(str.substring(typeStartIndex, i + 1));
36740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        token.setStopIndex(baseToken.getStartIndex() + i);
36840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        break;
36940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
37040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      case '[':
37140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      {
37240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        int i = typeStartIndex;
3732fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver        while (str.charAt(++i) == '[');
37440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
3752fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver        token.setType(ARRAY_TYPE_PREFIX);
3762fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver        token.setText(str.substring(typeStartIndex, i));
3772fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver        token.setStopIndex(baseToken.getStartIndex() + i - 1);
3782fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver        break;
37940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
38040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      default:
38140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex));
38240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
38340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
38440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return token;
38540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
38640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
38740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private CommonTree parseParamList(CommonToken paramListToken) {
38840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    String paramList = paramListToken.getText();
38940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    CommonTree root = new CommonTree();
39040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
39140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    int startIndex = paramListToken.getStartIndex();
39240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
39340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    int i=0;
39440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    while (i<paramList.length()) {
39540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      CommonToken token = getParamListSubToken(paramListToken, paramList, i);
39640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      root.addChild(new CommonTree(token));
39740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      i += token.getText().length();
39840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
39940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
40040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (root.getChildCount() == 0) {
40140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      return null;
40240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
40340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    return root;
40440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
40540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
40640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  private void throwOdexedInstructionException(IntStream input, String odexedInstruction)
40740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throws OdexedInstructionException {
40840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    /*this has to be done in a separate method, otherwise java will complain about the
40940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    auto-generated code in the rule after the throw not being reachable*/
41040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    throw new OdexedInstructionException(input, odexedInstruction);
41140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
41268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
41368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
41468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
41568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file
41640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope
41740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
41840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasClassSpec;
41940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasSuperSpec;
42040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasSourceSpec;
42140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> classAnnotations;
42240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
42340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init
42440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false;
42540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    $smali_file::classAnnotations = new ArrayList<CommonTree>();
42640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
42740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :
42840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;}
42940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;}
43040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | implements_spec
43140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;}
43240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | method
43340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | field
43440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | annotation {$smali_file::classAnnotations.add($annotation.tree);}
43540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  )+
43640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  EOF
43740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
43840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!$smali_file::hasClassSpec) {
43940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throw new SemanticException(input, "The file must contain a .class directive");
44040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
44140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
44240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    if (!$smali_file::hasSuperSpec) {
44340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if (!$class_spec.className.equals("Ljava/lang/Object;")) {
44440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new SemanticException(input, "The file must contain a .super directive");
44540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
44640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
44740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
44840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  -> ^(I_CLASS_DEF
44940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       class_spec
45040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       super_spec?
45140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       implements_spec*
45240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       source_spec?
45340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)});
4542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
45569c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className]
45640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list;
45768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
45868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec
45940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR);
46068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
46168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec
46240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR);
4632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
46468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec
46540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL);
46668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
46768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list
46840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*);
46968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
47068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
4714c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations
4724c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse
4734c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we
4744c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/
4752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield
47640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
477569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver  : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor (EQUAL literal)?
47840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
47940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      ( END_FIELD_DIRECTIVE
480569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver        -> ^(I_FIELD[$start, "I_FIELD"] member_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*))
48140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);}
482569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver        -> ^(I_FIELD[$start, "I_FIELD"] member_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS))
48340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      )
48440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    );
4852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod
487569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver  : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives
48840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    END_METHOD_DIRECTIVE
489569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver    -> ^(I_METHOD[$start, "I_METHOD"] member_name method_prototype access_list statements_and_directives);
49068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
49168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives
49240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  scope
49340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  {
49440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    boolean hasRegistersDirective;
49540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    List<CommonTree> methodAnnotations;
49640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  }
49740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : {
49840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::hasRegistersDirective = false;
49940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>();
50040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
501766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    ( ordered_method_item
50240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | registers_directive
50340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | catch_directive
50440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | catchall_directive
50540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | parameter_directive
50640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | annotation  {$statements_and_directives::methodAnnotations.add($annotation.tree);}
50740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )*
50840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> registers_directive?
509766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver       ^(I_ORDERED_METHOD_ITEMS ordered_method_item*)
51040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_CATCHES catch_directive* catchall_directive*)
51140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_PARAMETERS parameter_directive*)
51240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)};
51368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
514766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver/* Method items whose order/location is important */
515766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverordered_method_item
516766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  : label
517766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | instruction
518766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | debug_directive;
519766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver
52068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive
52140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : (
52240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount)
52340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2)
52440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )
52540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
52640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      if ($statements_and_directives::hasRegistersDirective) {
52740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method");
52840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
52940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      $statements_and_directives::hasRegistersDirective=true;
53040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
5312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
53237ade89bda535794fe4530024cb7a095cc033911Ben Gruverparam_list_or_id
53306d108d791ea155c7ac7422f05e19c509b59788aBen Gruver  : PARAM_LIST_OR_ID_PRIMITIVE_TYPE+;
53437ade89bda535794fe4530024cb7a095cc033911Ben Gruver
5352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be
5362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/
5372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name
53840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SIMPLE_NAME
53940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC]
54040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE]
54140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL]
54240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL]
54340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID]
54440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID]
54540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL]
54640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL]
54740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | REGISTER -> SIMPLE_NAME[$REGISTER]
54837ade89bda535794fe4530024cb7a095cc033911Ben Gruver  | param_list_or_id -> { adaptor.create(SIMPLE_NAME, $param_list_or_id.text) }
54940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE]
55040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE]
55140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY]
55240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t]
55340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x]
55440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX]
55540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x]
55640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID]
55740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD]
55840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX]
55940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING]
56040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE]
56140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t]
56240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD]
56340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX]
56440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE]
56540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD]
56640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID]
56740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t]
56840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x]
56940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID]
57040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t]
57140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
57240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
57340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
57440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
57540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
576afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD]
577afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD]
57840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l];
5792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
580569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruvermember_name
58140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : simple_name
582569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver  | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME];
5832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype
58540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : OPEN_PAREN param_list CLOSE_PAREN type_descriptor
58640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?);
5872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
588a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruverparam_list_or_id_primitive_type
589a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruver  : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE];
590a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruver
5912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list
592a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruver  : param_list_or_id_primitive_type+
59340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | nonvoid_type_descriptor*;
5942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5952fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruverarray_descriptor
5962fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver  : ARRAY_TYPE_PREFIX (PRIMITIVE_TYPE | CLASS_DESCRIPTOR);
5972fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver
5982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor
59940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : VOID_TYPE
60040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE
60140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CLASS_DESCRIPTOR
6022fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver  | array_descriptor;
6032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor
60540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PRIMITIVE_TYPE
60640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CLASS_DESCRIPTOR
6072fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver  | array_descriptor;
6082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor
61040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : CLASS_DESCRIPTOR
6112fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver  | array_descriptor;
6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal
61440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL]
61540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL];
6162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal
61840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID]
61940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | FLOAT_LITERAL;
6202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal
62240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID]
62340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | DOUBLE_LITERAL;
6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral
62640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
62740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
62840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
62940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL
63040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal
63140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | double_literal
63240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
63340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | STRING_LITERAL
63440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL
63540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | NULL_LITERAL
63640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | array_literal
63740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | subannotation
63840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | type_field_method_literal
63940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | enum_literal;
6402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
641450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruverparsed_integer_literal returns[int value]
642450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver  : integer_literal { $value = LiteralTools.parseInt($integer_literal.text); };
643450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver
6442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal
64540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
64640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
64740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
64840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
64940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL;
6502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal
65240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LONG_LITERAL
65340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | integer_literal
65440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | SHORT_LITERAL
65540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BYTE_LITERAL
65640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | float_literal
65740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | CHAR_LITERAL
65840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | BOOL_LITERAL;
6592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
660766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverfixed_literal
661766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  : integer_literal
662766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | LONG_LITERAL
663766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | SHORT_LITERAL
664766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | BYTE_LITERAL
665766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | float_literal
666766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | double_literal
667766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | CHAR_LITERAL
668766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | BOOL_LITERAL;
6692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal
67140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE
67240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*);
6732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element
67540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : simple_name EQUAL literal
67640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal);
6772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation
67940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR
68040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    annotation_element* END_ANNOTATION_DIRECTIVE
68140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*));
6822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation
68440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE
68540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*);
6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6879bedfc8e3e51c2b2435aab425533dc5043c84a9eBen Gruver// TODO: how does dalvik handle a primitive or array type, or a non-enum type?
6882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal
6899bedfc8e3e51c2b2435aab425533dc5043c84a9eBen Gruver  : ENUM_DIRECTIVE field_reference
6909bedfc8e3e51c2b2435aab425533dc5043c84a9eBen Gruver  -> ^(I_ENCODED_ENUM field_reference);
6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal
69340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : reference_type_descriptor
694ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver  | ( (reference_type_descriptor ARROW)?
695ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver      ( member_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor? member_name nonvoid_type_descriptor)
696ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver      | member_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor? member_name method_prototype)
69740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      )
69840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    )
69940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | PRIMITIVE_TYPE
70040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | VOID_TYPE;
7012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
702ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruvermethod_reference
703ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver  : (reference_type_descriptor ARROW)? member_name method_prototype
704ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver  -> reference_type_descriptor? member_name method_prototype;
7052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
706ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruverfield_reference
707ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver  : (reference_type_descriptor ARROW)? member_name COLON nonvoid_type_descriptor
708ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver  -> reference_type_descriptor? member_name nonvoid_type_descriptor;
7092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel
711766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name);
7122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
713a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruverlabel_ref
714a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver  : COLON simple_name -> simple_name;
7152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list
71740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*)
71840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]);
7192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range
72140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?);
72268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
72394e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference
724ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver  : CLASS_DESCRIPTOR | field_reference | method_reference;
72594e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver
72668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive
727a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver  : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref
728766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_CATCH[$start, "I_CATCH"] nonvoid_type_descriptor $from $to $using);
72968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
7302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive
731a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver  : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref
732766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_CATCHALL[$start, "I_CATCHALL"] $from $to $using);
73368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
7344c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations
7354c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse
7364c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we
7374c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/
73868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive
73940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
7403e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver  : PARAMETER_DIRECTIVE REGISTER (COMMA STRING_LITERAL)?
74140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
7424fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com
74340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ( END_PARAMETER_DIRECTIVE
7443e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver      -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS annotation*))
74540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);}
7463e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver      -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS))
74740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    );
74868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
749766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverdebug_directive
75040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : line_directive
75140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | local_directive
75240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | end_local_directive
75340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | restart_local_directive
75440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | prologue_directive
75540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | epilogue_directive
75640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | source_directive;
75768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
75868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive
75940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : LINE_DIRECTIVE integral_literal
760766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_LINE[$start, "I_LINE"] integral_literal);
7612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
76268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive
7633e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver  : LOCAL_DIRECTIVE REGISTER (COMMA (NULL_LITERAL | name=STRING_LITERAL) COLON (VOID_TYPE | nonvoid_type_descriptor)
7643e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver                              (COMMA signature=STRING_LITERAL)? )?
765766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER NULL_LITERAL? $name? nonvoid_type_descriptor? $signature?);
76668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
76768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive
76840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : END_LOCAL_DIRECTIVE REGISTER
769766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER);
7702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
77168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive
77240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : RESTART_LOCAL_DIRECTIVE REGISTER
773766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER);
77468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
77568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive
77640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : PROLOGUE_DIRECTIVE
777766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_PROLOGUE[$start, "I_PROLOGUE"]);
77868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
77968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive
78040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : EPILOGUE_DIRECTIVE
781766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_EPILOGUE[$start, "I_EPILOGUE"]);
7822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
78368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive
784b6435e7a475c64189906fb12e5408041bf3e750aBen Gruver  : SOURCE_DIRECTIVE STRING_LITERAL?
785766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL?);
7862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x
78840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT12x
78940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID];
7902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s
79240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT22s
79340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID];
7942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
7952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i
79640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : INSTRUCTION_FORMAT31i
79740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID];
7982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
79947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
80047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
801766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinstruction
802766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  : insn_format10t
803766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format10x
804766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format10x_odex
805766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format11n
806766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format11x
807766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format12x
808766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format20bc
809766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format20t
810766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21c_field
811766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21c_field_odex
812766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21c_string
813766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21c_type
814766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21ih
815766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21lh
816766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21s
817766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format21t
818766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22b
819766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22c_field
820766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22c_field_odex
821766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22c_type
822766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22cs_field
823766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22s
824766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22t
825766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format22x
826766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format23x
827766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format30t
828766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format31c
829766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format31i
830766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format31t
831766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format32x
832766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format35c_method
833766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format35c_type
834766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format35c_method_odex
835766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format35mi_method
836766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format35ms_method
837766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format3rc_method
838766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format3rc_method_odex
839766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format3rc_type
840766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format3rmi_method
841766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format3rms_method
842afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  | insn_format45cc_method
843afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  | insn_format4rcc_method
844766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_format51l
845766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_array_data_directive
846766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_packed_switch_directive
847766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver  | insn_sparse_switch_directive;
848766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver
849766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10t
85040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto endloop:
85140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    //e.g. goto +3
852766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT10t label_ref
853a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver    -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref);
85447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
855766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10x
85640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. return-void
857766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT10x
85840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x);
85947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
860766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10x_odex
86140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. return-void-barrier
862766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT10x_ODEX
86340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
86440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text);
86540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
86647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
867766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format11n
86840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/4 v0, 5
869766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal
87040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal);
87147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
872766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format11x
87340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move-result-object v1
874766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT11x REGISTER
87540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER);
87647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
877766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format12x
87840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move v1 v2
879766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    instruction_format12x REGISTER COMMA REGISTER
88040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER);
88147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
882766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format20bc
88340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. throw-verification-error generic-error, Lsome/class;
884766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference
88540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
88683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver      if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) {
88740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text);
88840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
88940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
89040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference);
89147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
892766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format20t
89340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto/16 endloop:
894766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT20t label_ref
895a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver    -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref);
89647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
897766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_field
89840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream;
899ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference
900ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference);
90147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
902766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_field_odex
90340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream;
904ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference
90540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
90683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver      if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) {
90740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text);
90840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
90940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
910ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference);
91147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
912766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_string
91340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-string v1, "Hello World!"
914766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL
91540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL);
91647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
917766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_type
91840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2;
919304aadf6e680af54eaf867a8e705e046a1e7a906Ben Gruver    INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor
920304aadf6e680af54eaf867a8e705e046a1e7a906Ben Gruver    -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor);
92147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
922766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21ih
92340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/high16 v1, 1234
924766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal
925feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver    -> ^(I_STATEMENT_FORMAT21ih[$start, "I_STATEMENT_FORMAT21ih"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal);
9266c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver
927766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21lh
9286c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver  : //e.g. const-wide/high16 v1, 1234
929766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal
930feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver    -> ^(I_STATEMENT_FORMAT21lh[$start, "I_STATEMENT_FORMAT21lh"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal);
93147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
932766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21s
93340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const/16 v1, 1234
934766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal
93540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal);
93647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
937766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21t
93840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. if-eqz v0, endloop:
939766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT21t REGISTER COMMA label_ref
940a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver    -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref);
94147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
942766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22b
94340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int v0, v1, 123
944766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal
94540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal);
94647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
947766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_field
94840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
949ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference
950ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference);
95147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
952766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_field_odex
95340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
954ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference
95540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
95683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver      if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) {
95740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text);
95840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      }
95940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    }
960ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference);
96147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
962766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_type
96340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. instance-of v0, v1, Ljava/lang/String;
964766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor
96540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
96647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
967766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22cs_field
96840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. iget-quick v0, v1, field@0xc
96940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
97040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
97140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text);
97240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
97347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
974766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22s
97540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int/lit16 v0, v1, 12345
976766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal
97740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal);
97847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
979766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22t
98040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. if-eq v0, v1, endloop:
981766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref
982a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver    -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref);
98347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
984766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22x
98540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move/from16 v1, v1234
986766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER
98740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER);
98847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
989766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format23x
99040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. add-int v1, v2, v3
991766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER
99240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER);
99347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
994766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format30t
99540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. goto/32 endloop:
996766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT30t label_ref
997a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver    -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref);
99847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
999766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31c
100040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-string/jumbo v1 "Hello World!"
1001766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL
100240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL);
100347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1004766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31i
100540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const v0, 123456
1006766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    instruction_format31i REGISTER COMMA fixed_32bit_literal
100740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal);
100847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1009766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31t
101040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. fill-array-data v0, ArrayData:
1011766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT31t REGISTER COMMA label_ref
1012a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver    -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref);
101347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1014766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format32x
101540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. move/16 v4567, v1234
1016766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER
101740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER);
101847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1019766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_method
102040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
1021ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
1022ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference);
102347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1024766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_type
102540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. filled-new-array {v0,v1}, I
1026766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor
102740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor);
102847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1029766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_method_odex
103040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1031ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
103240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
103340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text);
103440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
103547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1036766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35mi_method
103740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. execute-inline {v0, v1}, inline@0x4
103840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
103940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
104040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text);
104140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
104247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1043766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35ms_method
104440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4
104540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
104640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
104740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text);
104840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
104947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1050766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_method
105140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
1052ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference
1053ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference);
105447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1055766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_method_odex
105640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V
1057ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver    INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
105840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
105940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text);
106040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
106147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1062766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_type
106340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. filled-new-array/range {v0..v6}, I
1064766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor
106540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor);
106647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1067766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rmi_method
106840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. execute-inline/range {v0 .. v10}, inline@0x14
106940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
107040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
107140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text);
107240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
107347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1074766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rms_method
107540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14
107640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
107740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    {
107840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text);
107940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    };
108047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1081afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamathinsn_format45cc_method
1082afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  : //e.g. invoke-polymorphic {v0..v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J
1083afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath    INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype
1084afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath    -> ^(I_STATEMENT_FORMAT45cc_METHOD[$start, "I_STATEMENT_FORMAT45cc_METHOD"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype);
1085afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath
1086afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamathinsn_format4rcc_method
1087afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath  : //e.g. invoke-polymorphic/range {v0,v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J
1088afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath    INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype
1089afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath    -> ^(I_STATEMENT_FORMAT4rcc_METHOD[$start, "I_STATEMENT_FORMAT4rcc_METHOD"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype);
1090afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath
1091766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format51l
109240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  : //e.g. const-wide v0, 5000000000L
1093766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal
109440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal);
109547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1096766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_array_data_directive
1097450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver  : ARRAY_DATA_DIRECTIVE
1098450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver    parsed_integer_literal
1099450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver    {
1100450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver        int elementWidth = $parsed_integer_literal.value;
1101450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver        if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) {
1102450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver            throw new SemanticException(input, $start, "Invalid element width: \%d. Must be 1, 2, 4 or 8", elementWidth);
1103450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver        }
1104450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver    }
1105766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    fixed_literal* END_ARRAY_DATA_DIRECTIVE
110640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver
1107450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver    -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE parsed_integer_literal)
110840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       ^(I_ARRAY_ELEMENTS fixed_literal*));
110947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
1110766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_packed_switch_directive
111147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    :   PACKED_SWITCH_DIRECTIVE
111240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    fixed_32bit_literal
1113766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    label_ref*
1114766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    END_PACKED_SWITCH_DIRECTIVE
111540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
111640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver         ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
11176c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver         ^(I_PACKED_SWITCH_ELEMENTS[$start, "I_PACKED_SWITCH_ELEMENTS"]
1118766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver          label_ref*)
111940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver       );
1120d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com
1121766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_sparse_switch_directive
112240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver  :   SPARSE_SWITCH_DIRECTIVE
1123766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    (fixed_32bit_literal ARROW label_ref)*
1124766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver    END_SPARSE_SWITCH_DIRECTIVE
112540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver    -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
1126afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath       ^(I_SPARSE_SWITCH_ELEMENTS[$start, "I_SPARSE_SWITCH_ELEMENTS"] (fixed_32bit_literal label_ref)*));
1127