smaliParser.g revision 47873da1c5f50c5013bb35c85f48eca31d650647
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 {
3268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	tokenVocab=smaliLexer;
3368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	output=AST;
3468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	ASTLabelType=CommonTree;
3568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
3668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
3768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comtokens {
3868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	//I_* tokens are imaginary tokens used as parent AST nodes
3968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_CLASS_DEF;
4068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_SUPER;
4168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_IMPLEMENTS;
4268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_SOURCE;
4368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ACCESS_LIST;
4468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_METHODS;
4568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_FIELDS;
4668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_FIELD;
4768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_FIELD_TYPE;
4868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_FIELD_INITIAL_VALUE;
4968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_METHOD;
5068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_METHOD_PROTOTYPE;
5168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_METHOD_RETURN_TYPE;
5268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_REGISTERS;
53fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com	I_LOCALS;
5468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_LABELS;
5568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_LABEL;
5668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ANNOTATIONS;
5768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ANNOTATION;
5868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ANNOTATION_ELEMENT;
5968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_SUBANNOTATION;
604250768620c0518dbb2a23439debf5418d5d992cJesusFreke@JesusFreke.com	I_ENCODED_FIELD;
614250768620c0518dbb2a23439debf5418d5d992cJesusFreke@JesusFreke.com	I_ENCODED_METHOD;
62d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com	I_ENCODED_ENUM;
6368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ENCODED_ARRAY;
6468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ARRAY_ELEMENT_SIZE;
652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	I_ARRAY_ELEMENTS;
6668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PACKED_SWITCH_START_KEY;
6768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PACKED_SWITCH_TARGET_COUNT;
6868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PACKED_SWITCH_TARGETS;
693a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	I_PACKED_SWITCH_DECLARATION;
703a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	I_PACKED_SWITCH_DECLARATIONS;
7168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_SPARSE_SWITCH_KEYS;
7268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_SPARSE_SWITCH_TARGET_COUNT;
7368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_SPARSE_SWITCH_TARGETS;
743a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	I_SPARSE_SWITCH_DECLARATION;
753a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	I_SPARSE_SWITCH_DECLARATIONS;
7668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ADDRESS;
7768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_CATCH;
7845b5a1d0e377b575ba2fe6f5e44c3de7991a28bfJesusFreke@JesusFreke.com	I_CATCHALL;
7968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_CATCHES;
8068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PARAMETER;
8168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PARAMETERS;
8268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PARAMETER_NOT_SPECIFIED;
8368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_ORDERED_DEBUG_DIRECTIVES;
8468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_LINE;
8568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_LOCAL;
8668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_END_LOCAL;
8768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_RESTART_LOCAL;
8868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_PROLOGUE;
8968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_EPILOGUE;
9068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENTS;
9168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT10t;
9268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT10x;
9368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT11n;
9468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT11x;
9568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT12x;
9694e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver	I_STATEMENT_FORMAT20bc;
9768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT20t;
9868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT21c_TYPE;
9968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT21c_FIELD;
10068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT21c_STRING;
10168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT21h;
10268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT21s;
10368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT21t;
10468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT22b;
10568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT22c_FIELD;
10668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT22c_TYPE;
10768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT22s;
10868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT22t;
10968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT22x;
11068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT23x;
11168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT30t;
11268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT31c;
11368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT31i;
1142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT31t;
11568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT32x;
11668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT35c_METHOD;
117769b5ae5bfb9c07f8036bc26d2f2866083461a77JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT35c_TYPE;
11868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT3rc_METHOD;
11936c09cced8fa2d180120bb745882041536e1e5f7JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT3rc_TYPE;
120d12c76927616b9f5193864c2d834e84a57c08787Ben Gruver	I_STATEMENT_FORMAT41c_TYPE;
121d863324ffb94f70dbb59f1dab4dabd2ce1b39cfdBen Gruver	I_STATEMENT_FORMAT41c_FIELD;
12268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_FORMAT51l;
1231efc2c038842f85728b0ae4311a0e550b826390bBen Gruver	I_STATEMENT_FORMAT52c_TYPE;
124de5b35dbb65535f747bbf718cbe9753a07e4a4d8Ben Gruver	I_STATEMENT_FORMAT52c_FIELD;
125c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver	I_STATEMENT_FORMAT5rc_METHOD;
126c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver	I_STATEMENT_FORMAT5rc_TYPE;
12768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_ARRAY_DATA;
12868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_PACKED_SWITCH;
12968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_STATEMENT_SPARSE_SWITCH;
13068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_REGISTER_RANGE;
13168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	I_REGISTER_LIST;
1322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
1332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	LABEL;
1342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	INTEGER_LITERAL;
1354c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com	INVALID_TOKEN;
13668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
13768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
13868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header {
139b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali;
14068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
1410871036088eb43bbfe82bfe2a9411a79a87c9791JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.*;
1429c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruverimport org.jf.dexlib.Code.Opcode;
14368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
14468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
14568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
14668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members {
14786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com	private boolean verboseErrors = false;
14894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver	private boolean allowOdex = false;
1499c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver	private int apiLevel;
15086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com
15186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com	public void setVerboseErrors(boolean verboseErrors) {
15286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		this.verboseErrors = verboseErrors;
15386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com	}
15486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com
15594e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver	public void setAllowOdex(boolean allowOdex) {
15694e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver	    this.allowOdex = allowOdex;
15794e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver	}
15894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver
1599c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver	public void setApiLevel(int apiLevel) {
1609c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver	    this.apiLevel = apiLevel;
1619c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver	}
1629c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver
16368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	public String getErrorMessage(RecognitionException e,
16486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		String[] tokenNames) {
16586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com
1663da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com		if (verboseErrors) {
1673da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com			List stack = getRuleInvocationStack(e, this.getClass().getName());
1683da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com			String msg = null;
1690d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com
1703da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com			if (e instanceof NoViableAltException) {
1713da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com				NoViableAltException nvae = (NoViableAltException)e;
1723da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com				msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+
1733da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com				" (decision="+nvae.decisionNumber+
1743da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com				" state "+nvae.stateNumber+")"+
1753da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com				" decision=<<"+nvae.grammarDecisionDescription+">>";
1763da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com			} else {
1773da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com				msg = super.getErrorMessage(e, tokenNames);
1783da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com			}
1790d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com
1800d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com			return stack + " " + msg;
1813da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com		} else {
1823da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com			return super.getErrorMessage(e, tokenNames);
18368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		}
18468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	}
1852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
18668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	public String getTokenErrorDisplay(Token t) {
18786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		if (!verboseErrors) {
18886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			String s = t.getText();
18986df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			if ( s==null ) {
19086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com				if ( t.getType()==Token.EOF ) {
19186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com					s = "<EOF>";
19286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com				}
19386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com				else {
19486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com					s = "<"+tokenNames[t.getType()]+">";
19586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com				}
19686df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			}
19786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			s = s.replaceAll("\n","\\\\n");
19886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			s = s.replaceAll("\r","\\\\r");
19986df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			s = s.replaceAll("\t","\\\\t");
20086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			return "'"+s+"'";
20186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		}
20286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com
20386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		CommonToken ct = (CommonToken)t;
20486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com
20586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		String channelStr = "";
20686df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		if (t.getChannel()>0) {
20786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			channelStr=",channel="+t.getChannel();
20886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		}
20986df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		String txt = t.getText();
21086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		if ( txt!=null ) {
21186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			txt = txt.replaceAll("\n","\\\\n");
21286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			txt = txt.replaceAll("\r","\\\\r");
21386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			txt = txt.replaceAll("\t","\\\\t");
21486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		}
21586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		else {
21686df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com			txt = "<no text>";
21786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		}
21886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com		return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]";
21968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	}
2202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2210900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com	public String getErrorHeader(RecognitionException e) {
2220900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com		return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
2230900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com	}
2242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2253a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	private CommonTree buildTree(int type, String text, List<CommonTree> children) {
2263a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		CommonTree root = new CommonTree(new CommonToken(type, text));
2273a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		for (CommonTree child: children) {
2283a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			root.addChild(child);
2292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		}
2302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		return root;
2312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	}
2322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2334c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com	private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) {
2344c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com		CommonToken token = new CommonToken(baseToken);
2354c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com		token.setStartIndex(baseToken.getStartIndex() + typeStartIndex);
2364c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com
2372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		switch (str.charAt(typeStartIndex)) {
2382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'Z':
2392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'B':
2402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'S':
2412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'C':
2422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'I':
2432feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'J':
2442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'F':
2452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'D':
2464c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com			{
2474c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				token.setType(PRIMITIVE_TYPE);
2484c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				token.setText(str.substring(typeStartIndex, typeStartIndex+1));
2494c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				token.setStopIndex(baseToken.getStartIndex() + typeStartIndex);
2504c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				break;
2514c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com			}
2522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case 'L':
2532feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			{
2542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				int i = typeStartIndex;
2552feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				while (str.charAt(++i) != ';');
2564c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com
2574c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				token.setType(CLASS_DESCRIPTOR);
2584c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				token.setText(str.substring(typeStartIndex, i + 1));
2594c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				token.setStopIndex(baseToken.getStartIndex() + i);
2604c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com				break;
2612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			}
2622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			case '[':
2632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			{
2642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				int i = typeStartIndex;
2651fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				while (str.charAt(++i) == '[');
2664c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com
2671fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				if (str.charAt(i++) == 'L') {
2681fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				    while (str.charAt(i++) != ';');
2691fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com				}
2701fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com
2711fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				token.setType(ARRAY_DESCRIPTOR);
2721fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				token.setText(str.substring(typeStartIndex, i));
2731fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				token.setStopIndex(baseToken.getStartIndex() + i - 1);
2741fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com    				break;
2752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			}
2762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			default:
2772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex));
2782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		}
2794c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com
2804c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com		return token;
2812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	}
2822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	private CommonTree parseParamList(CommonToken paramListToken) {
2842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		String paramList = paramListToken.getText();
2852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		CommonTree root = new CommonTree();
2862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		int startIndex = paramListToken.getStartIndex();
2882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		int i=0;
2902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		while (i<paramList.length()) {
2914c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com			CommonToken token = getParamListSubToken(paramListToken, paramList, i);
2924c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com			root.addChild(new CommonTree(token));
2934c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com			i += token.getText().length();
2942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		}
2952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
2962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		if (root.getChildCount() == 0) {
2972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			return null;
2982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		}
2993a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		return root;
3003a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	}
3010d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com
302368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com	private void throwOdexedInstructionException(IntStream input, String odexedInstruction)
303368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com			throws OdexedInstructionException {
304368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com		/*this has to be done in a separate method, otherwise java will complain about the
305368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com		auto-generated code in the rule after the throw not being reachable*/
3060d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com		throw new OdexedInstructionException(input, odexedInstruction);
307368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com	}
30868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com}
30968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
31068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
31168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file
31268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	scope
31368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	{
31468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		boolean hasClassSpec;
31568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		boolean hasSuperSpec;
31668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		boolean hasSourceSpec;
3172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		List<CommonTree> classAnnotations;
3182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	}
3192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	@init
3202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	{	$smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false;
3212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		$smali_file::classAnnotations = new ArrayList<CommonTree>();
32268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	}
32368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:
32468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	(	{!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;}
32568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	{!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;}
32668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	implements_spec
32768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	{!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;}
32868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	method
32968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	field
3302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	annotation {$smali_file::classAnnotations.add($annotation.tree);}
3310900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com	)+
3320900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com	EOF
33368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	{
33468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		if (!$smali_file::hasClassSpec) {
33534a4a30e34bb156304b79af1cd649cf377d0ac81JesusFreke@JesusFreke.com			throw new SemanticException(input, "The file must contain a .class directive");
33668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		}
3372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
33868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		if (!$smali_file::hasSuperSpec) {
33969c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com			if (!$class_spec.className.equals("Ljava/lang/Object;")) {
34069c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com				throw new SemanticException(input, "The file must contain a .super directive");
34169c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com			}
34268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		}
34368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	}
34468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	->	^(I_CLASS_DEF
34568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			class_spec
34669c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com			super_spec?
34768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			implements_spec*
34868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			source_spec?
3492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)});
3502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
35169c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className]
35269c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com	:	CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list;
35368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
35468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec
35568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR);
35668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
35768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec
35868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR);
3592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
36068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec
36168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL);
36268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
36368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list
3641c9fcdee6d9bd2b086edff83d9a19d8e7dd0aa9dJesusFreke@JesusFreke.com	:	ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*);
36568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
36668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
3674c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations
3684c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse
3694c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we
3704c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/
3712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield
3722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	@init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
3732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	FIELD_DIRECTIVE access_list simple_name COLON nonvoid_type_descriptor (EQUAL literal)?
3744fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		(	({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
3752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			(	END_FIELD_DIRECTIVE
3762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				-> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*))
3772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			|	/*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);}
3782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				-> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS))
3792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			)
3802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		);
3812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
3822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod
38368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	scope {int currentAddress;}
38468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	{$method::currentAddress = 0;}
3852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		METHOD_DIRECTIVE access_list method_name method_prototype statements_and_directives
38668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		END_METHOD_DIRECTIVE
3872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_METHOD[$start, "I_METHOD"] method_name method_prototype access_list statements_and_directives);
38868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
38968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives
3903a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	scope
3913a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	{
3923a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		boolean hasRegistersDirective;
3933a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		List<CommonTree> packedSwitchDeclarations;
3943a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		List<CommonTree> sparseSwitchDeclarations;
3954fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		List<CommonTree> methodAnnotations;
3963a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com	}
39768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	{
39868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			$method::currentAddress = 0;
39968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			$statements_and_directives::hasRegistersDirective = false;
4003a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			$statements_and_directives::packedSwitchDeclarations = new ArrayList<CommonTree>();
4013a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			$statements_and_directives::sparseSwitchDeclarations = new ArrayList<CommonTree>();
4024fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com			$statements_and_directives::methodAnnotations = new ArrayList<CommonTree>();
40368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		}
40468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		(	instruction {$method::currentAddress += $instruction.size/2;}
405fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com		|	registers_directive
40668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		|	label
40768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		|	catch_directive
40845b5a1d0e377b575ba2fe6f5e44c3de7991a28bfJesusFreke@JesusFreke.com		|	catchall_directive
40968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		|	parameter_directive
41068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		|	ordered_debug_directive
4114fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		|	annotation  {$statements_and_directives::methodAnnotations.add($annotation.tree);}
4122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		)*
413fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com		->	registers_directive?
41468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			^(I_LABELS label*)
4153a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			{buildTree(I_PACKED_SWITCH_DECLARATIONS, "I_PACKED_SWITCH_DECLARATIONS", $statements_and_directives::packedSwitchDeclarations)}
4163a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			{buildTree(I_SPARSE_SWITCH_DECLARATIONS, "I_SPARSE_SWITCH_DECLARATIONS", $statements_and_directives::sparseSwitchDeclarations)}
41768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			^(I_STATEMENTS instruction*)
41845b5a1d0e377b575ba2fe6f5e44c3de7991a28bfJesusFreke@JesusFreke.com			^(I_CATCHES catch_directive* catchall_directive*)
41968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			^(I_PARAMETERS parameter_directive*)
42068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			^(I_ORDERED_DEBUG_DIRECTIVES ordered_debug_directive*)
4214fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com			{buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)};
42268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
42368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive
424fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com	:	(
4259f69ec12ead61acd5aca2bf5b7ab0203c4cb0b40JesusFreke@JesusFreke.com			directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount)
4269f69ec12ead61acd5aca2bf5b7ab0203c4cb0b40JesusFreke@JesusFreke.com		|	directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2)
427fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com		)
428fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com		{
429fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com			if ($statements_and_directives::hasRegistersDirective) {
4309f69ec12ead61acd5aca2bf5b7ab0203c4cb0b40JesusFreke@JesusFreke.com				throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method");
431fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com			}
432fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com			$statements_and_directives::hasRegistersDirective=true;
433fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com		};
4342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be
4362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/
4372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name
4382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	SIMPLE_NAME
4392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC]
440bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver	|	VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE]
4412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL]
4422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL]
44383ef98462a09a3f447f83462c712427be7946c02JesusFreke@JesusFreke.com	|	INTEGER_LITERAL -> SIMPLE_NAME[$INTEGER_LITERAL]
4442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID]
4452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID]
4462feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL]
44758536878c4f80ebf6d1a04758043825d58c7705eJesusFreke@JesusFreke.com	|	NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL]
4482feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	REGISTER -> SIMPLE_NAME[$REGISTER]
4492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	PARAM_LIST_OR_ID -> SIMPLE_NAME[$PARAM_LIST_OR_ID]
4502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE]
4512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE]
4522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY]
4532feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t]
4542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x]
4554a5692f8275048c564abc617b91ae72bb008fccaBen Gruver	|	INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX]
4562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x]
4572feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID]
4582feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD]
45927dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX]
4602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING]
4612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE]
4622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t]
4632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD]
46427dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX]
4652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE]
4662feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD]
4672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID]
4682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t]
4692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x]
4702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID]
4712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t]
4722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
473c8de336727bfe8e56998332fe97ad5c0e32e50faBen Gruver	|	INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
4742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
475b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver	|	INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
4762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
4772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l];
4782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_name
4802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	simple_name
4812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	METHOD_NAME -> SIMPLE_NAME[$METHOD_NAME];
4822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype
4842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	OPEN_PAREN param_list CLOSE_PAREN type_descriptor
4852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?);
4862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list
4882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	PARAM_LIST -> { parseParamList((CommonToken)$PARAM_LIST) }
4892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	PARAM_LIST_OR_ID -> { parseParamList((CommonToken)$PARAM_LIST_OR_ID) }
4902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	nonvoid_type_descriptor*;
4912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor
4932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	VOID_TYPE
4942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	PRIMITIVE_TYPE
4952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	CLASS_DESCRIPTOR
4962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	ARRAY_DESCRIPTOR;
4972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
4982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor
4992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	PRIMITIVE_TYPE
5002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	CLASS_DESCRIPTOR
5012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	ARRAY_DESCRIPTOR;
5022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor
5042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	CLASS_DESCRIPTOR
5052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	ARRAY_DESCRIPTOR;
5062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal
5082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL]
5094c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com	|	NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL]
5104c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com	|	INTEGER_LITERAL;
5112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal
5132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID]
5142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	FLOAT_LITERAL;
5152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal
5172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID]
5182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	DOUBLE_LITERAL;
5192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral
5212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	LONG_LITERAL
5222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	integer_literal
5232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	SHORT_LITERAL
5242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BYTE_LITERAL
5252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	float_literal
5262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	double_literal
5272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	CHAR_LITERAL
5282feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	STRING_LITERAL
5292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BOOL_LITERAL
5302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	NULL_LITERAL
5312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	array_literal
5322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	subannotation
5332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	type_field_method_literal
5342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	enum_literal;
5352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal
5372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	LONG_LITERAL
5382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	integer_literal
5392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	SHORT_LITERAL
5402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	CHAR_LITERAL
5412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BYTE_LITERAL;
5422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5432feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal
5442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	LONG_LITERAL
5452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	integer_literal
5462feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	SHORT_LITERAL
5472feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BYTE_LITERAL
5482feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	float_literal
5492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	CHAR_LITERAL
5502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BOOL_LITERAL;
5512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_literal returns[int size]
5532feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	integer_literal {$size = 4;}
5542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	LONG_LITERAL {$size = 8;}
5552feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	SHORT_LITERAL {$size = 2;}
5562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BYTE_LITERAL {$size = 1;}
5572feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	float_literal {$size = 4;}
5582feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	double_literal {$size = 8;}
5592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	CHAR_LITERAL {$size = 2;}
5602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	BOOL_LITERAL {$size = 1;};
5612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal
5632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE
5642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*);
5652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5662feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element
5672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	simple_name EQUAL literal
5682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal);
5692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation
5712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR
5722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		annotation_element* END_ANNOTATION_DIRECTIVE
5732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*));
5742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation
5762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE
5772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*);
5782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal
5804ccbb4e8bde13ea274b845ce675d603259b218a7JesusFreke@JesusFreke.com	:	ENUM_DIRECTIVE reference_type_descriptor ARROW simple_name COLON reference_type_descriptor
5812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	->	^(I_ENCODED_ENUM reference_type_descriptor simple_name reference_type_descriptor);
5822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal
5842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	reference_type_descriptor
5850d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com		(	ARROW
58610b934971613bce125871847566c43400035d39dJesusFreke@JesusFreke.com			(	simple_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor simple_name nonvoid_type_descriptor)
58710b934971613bce125871847566c43400035d39dJesusFreke@JesusFreke.com			|	method_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor method_name method_prototype)
5882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			)
5892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		|	-> reference_type_descriptor
5902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		)
5912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	PRIMITIVE_TYPE
5922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	VOID_TYPE;
5932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_method
5952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	reference_type_descriptor ARROW method_name method_prototype
5962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	->	reference_type_descriptor method_name method_prototype;
5972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
5982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_field
5992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	reference_type_descriptor ARROW simple_name COLON nonvoid_type_descriptor
6002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	->	reference_type_descriptor simple_name nonvoid_type_descriptor;
6012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel
6034d9801a89dad861acd9fafa2e58a64e2868f8003JesusFreke@JesusFreke.com	:	COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
6042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel_ref_or_offset
606ec643e65207ac61c164be5989173f0076211611dJesusFreke@JesusFreke.com	:	COLON simple_name -> simple_name
6072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	OFFSET
6082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	NEGATIVE_INTEGER_LITERAL -> OFFSET[$NEGATIVE_INTEGER_LITERAL];
6092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list
6112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*)
6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]);
6132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range
6158d323b3c48b6578f84a4de4fe3850f95f1e34096Ben Gruver	:	(startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?);
61668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
61794e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference
61894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver	:	CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method;
61994e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver
62068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive
6212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset
6222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_CATCH[$start, "I_CATCH"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] nonvoid_type_descriptor $from $to $using);
62368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive
6252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset
6262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		-> ^(I_CATCHALL[$start, "I_CATCHALL"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] $from $to $using);
62768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
6284c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations
6294c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse
6304c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we
6314c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/
63268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive
6334fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com	@init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
6342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	PARAMETER_DIRECTIVE
6354fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		STRING_LITERAL?
6364fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
6374fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com
6384fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		(	END_PARAMETER_DIRECTIVE
6394c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com			-> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS annotation*))
6404fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com		|	/*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);}
6414c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com			-> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS))
64268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		);
64368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
64468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comordered_debug_directive
64568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	line_directive
64668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	local_directive
64768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	end_local_directive
64868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	restart_local_directive
64968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	prologue_directive
65068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	epilogue_directive
65168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	|	source_directive;
65268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
65368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive
65468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	LINE_DIRECTIVE integral_literal
65568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		-> ^(I_LINE integral_literal I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
6562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
65768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive
65828a614553bdd5c834f74e7b08c15dfe856db28ecJesusFreke@JesusFreke.com	:	LOCAL_DIRECTIVE	REGISTER COMMA simple_name COLON nonvoid_type_descriptor (COMMA STRING_LITERAL)?
65928a614553bdd5c834f74e7b08c15dfe856db28ecJesusFreke@JesusFreke.com		-> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER simple_name nonvoid_type_descriptor STRING_LITERAL? I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
66068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
66168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive
66268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	END_LOCAL_DIRECTIVE REGISTER
66368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		-> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
6642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
66568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive
66668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	RESTART_LOCAL_DIRECTIVE REGISTER
66768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		-> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
66868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
66968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive
67068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	PROLOGUE_DIRECTIVE
67168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		-> ^(I_PROLOGUE[$start, "I_PROLOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
67268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
67368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive
67468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	EPILOGUE_DIRECTIVE
67568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		-> ^(I_EPILOGUE[$start, "I_EPILOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
6762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
67768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive
67868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com	:	SOURCE_DIRECTIVE STRING_LITERAL
67968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		-> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL I_ADDRESS[$start, Integer.toString($method::currentAddress)]);
6802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x
6822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	INSTRUCTION_FORMAT12x
6832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID];
6842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s
6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	INSTRUCTION_FORMAT22s
6872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID];
6882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
6892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i
6902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	:	INSTRUCTION_FORMAT31i
6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com	|	INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID];
6922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
69347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
69447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
69568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.cominstruction returns [int size]
69647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:    insn_format10t { $size = $insn_format10t.size; }
69747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format10x { $size = $insn_format10x.size; }
69847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format10x_odex { $size = $insn_format10x_odex.size; }
69947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format11n { $size = $insn_format11n.size; }
70047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format11x { $size = $insn_format11x.size; }
70147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format12x { $size = $insn_format12x.size; }
70247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format20bc { $size = $insn_format20bc.size; }
70347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format20t { $size = $insn_format20t.size; }
70447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21c_field { $size = $insn_format21c_field.size; }
70547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21c_field_odex { $size = $insn_format21c_field_odex.size; }
70647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21c_string { $size = $insn_format21c_string.size; }
70747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21c_type { $size = $insn_format21c_type.size; }
70847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21h { $size = $insn_format21h.size; }
70947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21s { $size = $insn_format21s.size; }
71047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format21t { $size = $insn_format21t.size; }
71147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22b { $size = $insn_format22b.size; }
71247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22c_field { $size = $insn_format22c_field.size; }
71347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22c_field_odex { $size = $insn_format22c_field_odex.size; }
71447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22c_type { $size = $insn_format22c_type.size; }
71547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22cs_field { $size = $insn_format22cs_field.size; }
71647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22s { $size = $insn_format22s.size; }
71747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22t { $size = $insn_format22t.size; }
71847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format22x { $size = $insn_format22x.size; }
71947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format23x { $size = $insn_format23x.size; }
72047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format30t { $size = $insn_format30t.size; }
72147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format31c { $size = $insn_format31c.size; }
72247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format31i { $size = $insn_format31i.size; }
72347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format31t { $size = $insn_format31t.size; }
72447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format32x { $size = $insn_format32x.size; }
72547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format35c_method { $size = $insn_format35c_method.size; }
72647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format35c_type { $size = $insn_format35c_type.size; }
72747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format35c_method_odex { $size = $insn_format35c_method_odex.size; }
72847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format35mi_method { $size = $insn_format35mi_method.size; }
72947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format35ms_method { $size = $insn_format35ms_method.size; }
73047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format3rc_method { $size = $insn_format3rc_method.size; }
73147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format3rc_method_odex { $size = $insn_format3rc_method_odex.size; }
73247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format3rc_type { $size = $insn_format3rc_type.size; }
73347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format3rmi_method { $size = $insn_format3rmi_method.size; }
73447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format3rms_method { $size = $insn_format3rms_method.size; }
73547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format41c_type { $size = $insn_format41c_type.size; }
73647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format41c_field { $size = $insn_format41c_field.size; }
73747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format41c_field_odex { $size = $insn_format41c_field_odex.size; }
73847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format51l { $size = $insn_format51l.size; }
73947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format52c_type { $size = $insn_format52c_type.size; }
74047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format52c_field { $size = $insn_format52c_field.size; }
74147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format52c_field_odex { $size = $insn_format52c_field_odex.size; }
74247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format5rc_method { $size = $insn_format5rc_method.size; }
74347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format5rc_method_odex { $size = $insn_format5rc_method_odex.size; }
74447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_format5rc_type { $size = $insn_format5rc_type.size; }
74547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_array_data_directive { $size = $insn_array_data_directive.size; }
74647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_packed_switch_directive { $size = $insn_packed_switch_directive.size; }
74747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	|	 insn_sparse_switch_directive { $size = $insn_sparse_switch_directive.size; };
74847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
74947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10t returns [int size]
75047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    :	//e.g. goto endloop:
75168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		//e.g. goto +3
7522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT10t label_ref_or_offset {$size = Format.Format10t.size;}
75347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref_or_offset);
75447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
75547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x returns [int size]
75647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. return-void
75767a4c3cbb2495465ce1ff7f4cfcb084cd8c7297cJesusFreke@JesusFreke.com		INSTRUCTION_FORMAT10x {$size = Format.Format10x.size;}
75847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x);
75947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
76047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x_odex returns [int size]
76147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. return-void-barrier
7624a5692f8275048c564abc617b91ae72bb008fccaBen Gruver		INSTRUCTION_FORMAT10x_ODEX {$size = Format.Format10x.size;}
7634a5692f8275048c564abc617b91ae72bb008fccaBen Gruver		{
7644a5692f8275048c564abc617b91ae72bb008fccaBen Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text);
76547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
76647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
76747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11n returns [int size]
76847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const/4 v0, 5
7692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal {$size = Format.Format11n.size;}
77047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal);
77147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
77247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11x returns [int size]
77347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. move-result-object v1
77467a4c3cbb2495465ce1ff7f4cfcb084cd8c7297cJesusFreke@JesusFreke.com		INSTRUCTION_FORMAT11x REGISTER {$size = Format.Format11x.size;}
77547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER);
77647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
77747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format12x returns [int size]
77847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. move v1 v2
7792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		instruction_format12x REGISTER COMMA REGISTER {$size = Format.Format12x.size;}
78047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER);
78147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
78247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20bc returns [int size]
78347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. throw-verification-error generic-error, Lsome/class;
78494e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver		INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference {$size += Format.Format20bc.size;}
785bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver		{
7869c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver			if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) {
78794e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver				throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text);
78894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver			}
789bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver		}
79047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference);
791d12c76927616b9f5193864c2d834e84a57c08787Ben Gruver		//TODO: check if dalvik has a jumbo version of throw-verification-error
79247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
79347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20t returns [int size]
79447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. goto/16 endloop:
7952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;}
79647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset);
79747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
79847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field returns [int size]
79947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream;
8002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
80147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field);
80247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
80347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field_odex returns [int size]
80447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream;
805f5f64b26f7dd568ecded2b6090e710d68c8daab7Ben Gruver		INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
80627dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com		{
8079c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver			if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) {
808f5f64b26f7dd568ecded2b6090e710d68c8daab7Ben Gruver				throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text);
809f5f64b26f7dd568ecded2b6090e710d68c8daab7Ben Gruver			}
81027dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com		}
81147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field);
81247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
81347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_string returns [int size]
81447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const-string v1, "Hello World!"
8152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL {$size = Format.Format21c.size;}
81647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL);
81747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
81847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_type returns [int size]
81947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2;
8202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;}
82147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor);
82247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
82347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21h returns [int size]
82447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const/high16 v1, 1234
8252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT21h REGISTER COMMA integral_literal {$size = Format.Format21h.size;}
82647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21h[$start, "I_STATEMENT_FORMAT21h"] INSTRUCTION_FORMAT21h REGISTER integral_literal);
82747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
82847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21s returns [int size]
82947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const/16 v1, 1234
8302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal {$size = Format.Format21s.size;}
83147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal);
83247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
83347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21t returns [int size]
83447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. if-eqz v0, endloop:
8352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT21t REGISTER COMMA (label_ref_or_offset) {$size = Format.Format21t.size;}
83647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref_or_offset);
83747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
83847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22b returns [int size]
83947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. add-int v0, v1, 123
8402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22b.size;}
84147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal);
84247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
84347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field returns [int size]
84447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
8452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;}
84647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field);
84747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
84847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field_odex returns [int size]
84947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
850df00f6b8a883caf5a83db19850471f3fdfa2db3cBen Gruver		INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;}
85127dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com		{
8529c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver			if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) {
853df00f6b8a883caf5a83db19850471f3fdfa2db3cBen Gruver				throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text);
854df00f6b8a883caf5a83db19850471f3fdfa2db3cBen Gruver			}
85527dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com		}
85647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER fully_qualified_field);
85747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
85847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_type returns [int size]
85947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. instance-of v0, v1, Ljava/lang/String;
8602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format22c.size;}
86147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
86247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
86347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22cs_field returns [int size]
86447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. iget-quick v0, v1, field@0xc
8652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
866f322260c221a8806d881bfc98c63d801884cec4dJesusFreke@JesusFreke.com		{
867368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text);
86847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
86947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
87047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22s returns [int size]
87147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. add-int/lit16 v0, v1, 12345
8722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22s.size;}
87347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal);
87447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
87547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22t returns [int size]
87647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. if-eq v0, v1, endloop:
8772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref_or_offset {$size = Format.Format22t.size;}
87847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref_or_offset);
87947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
88047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22x returns [int size]
88147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. move/from16 v1, v1234
8822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER {$size = Format.Format22x.size;}
88347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER);
88447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
88547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format23x returns [int size]
88647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. add-int v1, v2, v3
8872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER {$size = Format.Format23x.size;}
88847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER);
88947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
89047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format30t returns [int size]
89147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. goto/32 endloop:
8922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT30t label_ref_or_offset {$size = Format.Format30t.size;}
89347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref_or_offset);
89447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
89547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31c returns [int size]
89647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const-string/jumbo v1 "Hello World!"
8972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL {$size = Format.Format31c.size;}
89847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL);
89947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
90047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31i returns [int size]
90147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const v0, 123456
9022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		instruction_format31i REGISTER COMMA fixed_32bit_literal {$size = Format.Format31i.size;}
90347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal);
90447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
90547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31t returns [int size]
90647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. fill-array-data v0, ArrayData:
9072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT31t REGISTER COMMA label_ref_or_offset {$size = Format.Format31t.size;}
9083a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		{
9093a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			if ($INSTRUCTION_FORMAT31t.text.equals("packed-switch")) {
9103a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				CommonTree root = new CommonTree(new CommonToken(I_PACKED_SWITCH_DECLARATION, "I_PACKED_SWITCH_DECLARATION"));
9113a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress)));
9123a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				root.addChild(address);
9132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				root.addChild($label_ref_or_offset.tree.dupNode());
9143a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				$statements_and_directives::packedSwitchDeclarations.add(root);
9153a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com			} else if ($INSTRUCTION_FORMAT31t.text.equals("sparse-switch")) {
9163a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				CommonTree root = new CommonTree(new CommonToken(I_SPARSE_SWITCH_DECLARATION, "I_SPARSE_SWITCH_DECLARATION"));
9173a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress)));
9183a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				root.addChild(address);
9192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				root.addChild($label_ref_or_offset.tree.dupNode());
9203a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com				$statements_and_directives::sparseSwitchDeclarations.add(root);
9212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			}
9223a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com		}
92347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref_or_offset);
92447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
92547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format32x returns [int size]
92647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. move/16 v4567, v1234
9272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER {$size = Format.Format32x.size;}
92847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER);
92947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
93047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method returns [int size]
93147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
9322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format35c.size;}
93347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method);
93447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
93547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_type returns [int size]
93647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. filled-new-array {v0,v1}, I
9372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format35c.size;}
93847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor);
93947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
94047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method_odex returns [int size]
94147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
942c8de336727bfe8e56998332fe97ad5c0e32e50faBen Gruver		INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method
94351cf2f54d5f1de0030492a6f33d6f2491ee9fb32JesusFreke@JesusFreke.com		{
944c8de336727bfe8e56998332fe97ad5c0e32e50faBen Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text);
94547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
94647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
94747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35mi_method returns [int size]
94847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. execute-inline {v0, v1}, inline@0x4
949b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver		INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
950b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver		{
951b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text);
95247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
95347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
95447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35ms_method returns [int size]
95547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-virtual-quick {v0, v1}, vtable@0x4
956b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver		INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
957823aa76923a1a1edb18c3ad899a8d32f4ef252f6JesusFreke@JesusFreke.com		{
958368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text);
95947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
96047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
96147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method returns [int size]
96247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
9632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format3rc.size;}
96447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method);
96547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
96647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method_odex returns [int size]
96747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V
968ea7afb02658cc72b5e7156f5dadc51b9c6c212b0Ben Gruver		INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method
969ea7afb02658cc72b5e7156f5dadc51b9c6c212b0Ben Gruver		{
970ea7afb02658cc72b5e7156f5dadc51b9c6c212b0Ben Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text);
97147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
97247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
97347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_type returns [int size]
97447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. filled-new-array/range {v0..v6}, I
9752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format3rc.size;}
97647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor);
97747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
97847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rmi_method returns [int size]
97947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. execute-inline/range {v0 .. v10}, inline@0x14
980b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver		INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
981b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver		{
982b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text);
98347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
98447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
98547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rms_method returns [int size]
98647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14
987b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver		INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
988c9c2ec3d48d813bc5e74703747466fd6635dcfa6JesusFreke@JesusFreke.com		{
989368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text);
99047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
99147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
99247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format41c_type returns [int size]
99347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const-class/jumbo v2, Lorg/jf/HelloWorld2/HelloWorld2;
994d12c76927616b9f5193864c2d834e84a57c08787Ben Gruver		INSTRUCTION_FORMAT41c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format41c.size;}
99547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT41c_TYPE[$start, "I_STATEMENT_FORMAT41c"] INSTRUCTION_FORMAT41c_TYPE REGISTER reference_type_descriptor);
99647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
99747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format41c_field returns [int size]
99847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. sget-object/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
999d863324ffb94f70dbb59f1dab4dabd2ce1b39cfdBen Gruver		INSTRUCTION_FORMAT41c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
100047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT41c_FIELD[$start, "I_STATEMENT_FORMAT41c_FIELD"] INSTRUCTION_FORMAT41c_FIELD REGISTER fully_qualified_field);
100147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
100247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format41c_field_odex returns [int size]
100347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. sget-object-volatile/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
10040d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver		INSTRUCTION_FORMAT41c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
10050d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver		{
10060d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT41c_FIELD_ODEX.text);
100747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
100847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
100947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format51l returns [int size]
101047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. const-wide v0, 5000000000L
10112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;}
101247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal);
101347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
101447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format52c_type returns [int size]
101547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. instance-of/jumbo v0, v1, Ljava/lang/String;
10161efc2c038842f85728b0ae4311a0e550b826390bBen Gruver		INSTRUCTION_FORMAT52c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format52c.size;}
101747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT52c_TYPE[$start, "I_STATEMENT_FORMAT52c_TYPE"] INSTRUCTION_FORMAT52c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
101847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
101947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format52c_field returns [int size]
102047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. iput-object/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
1021de5b35dbb65535f747bbf718cbe9753a07e4a4d8Ben Gruver		INSTRUCTION_FORMAT52c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
102247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT52c_FIELD[$start, "I_STATEMENT_FORMAT52c_FIELD"] INSTRUCTION_FORMAT52c_FIELD REGISTER REGISTER fully_qualified_field);
102347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
102447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format52c_field_odex returns [int size]
102547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. iput-object-volatile/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
10260d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver		INSTRUCTION_FORMAT52c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
10270d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver		{
10280d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT52c_FIELD_ODEX.text);
102947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
103047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
103147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format5rc_method returns [int size]
103247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-virtual/jumbo {v25..v26}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
1033c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver		INSTRUCTION_FORMAT5rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;}
103447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT5rc_METHOD[$start, "I_STATEMENT_FORMAT5rc_METHOD"] INSTRUCTION_FORMAT5rc_METHOD register_range fully_qualified_method);
103547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
103647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format5rc_method_odex returns [int size]
103747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. invoke-object-init/jumbo {v25}, Ljava/lang/Object-><init>()V
1038a43de2411e7d8df902819554b21a273b58828d0aBen Gruver		INSTRUCTION_FORMAT5rc_METHOD_ODEX OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;}
1039a43de2411e7d8df902819554b21a273b58828d0aBen Gruver		{
1040a43de2411e7d8df902819554b21a273b58828d0aBen Gruver			throwOdexedInstructionException(input, $INSTRUCTION_FORMAT5rc_METHOD_ODEX.text);
104147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		};
104247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
104347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format5rc_type returns [int size]
104447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:	//e.g. filled-new-array/jumbo {v0..v6}, I
1045c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver		INSTRUCTION_FORMAT5rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format5rc.size;}
104647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver		-> ^(I_STATEMENT_FORMAT5rc_TYPE[$start, "I_STATEMENT_FORMAT5rc_TYPE"] INSTRUCTION_FORMAT5rc_TYPE register_range nonvoid_type_descriptor);
104747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
104847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_array_data_directive returns [int size]
104947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    @init {boolean needsNop = false;}
105047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:   ARRAY_DATA_DIRECTIVE
10512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		{
105268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			if (($method::currentAddress \% 2) != 0) {
105368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com				needsNop = true;
105468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com				$size = 2;
105568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			} else {
105668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com				$size = 0;
105768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com			}
105868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		}
10592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
106068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		integral_literal (fixed_literal {$size+=$fixed_literal.size;})* END_ARRAY_DATA_DIRECTIVE
106168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com		{$size = (($size + 1)/2)*2 + 8;}
106268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
10632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		/*add a nop statement before this if needed to force the correct alignment*/
10642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		->	{needsNop}?	^(I_STATEMENT_FORMAT10x[$start,  "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"])
10652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com					^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE integral_literal) ^(I_ARRAY_ELEMENTS fixed_literal*))
106668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
10674d9801a89dad861acd9fafa2e58a64e2868f8003JesusFreke@JesusFreke.com		->	^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE integral_literal)
106847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver				^(I_ARRAY_ELEMENTS fixed_literal*));
106947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver
107047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_packed_switch_directive returns [int size]
107147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    @init {boolean needsNop = false; int targetCount = 0;}
107247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    :   PACKED_SWITCH_DIRECTIVE
10732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		{
10742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			targetCount = 0;
10752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			if (($method::currentAddress \% 2) != 0) {
10762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				needsNop = true;
10772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				$size = 2;
10782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			} else {
10792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				$size = 0;
10802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			}
10812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		}
108268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
10832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		fixed_32bit_literal
108468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
10852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		(switch_target += label_ref_or_offset {$size+=4; targetCount++;})*
108668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
10872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		END_PACKED_SWITCH_DIRECTIVE {$size = $size + 8;}
108868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com
10892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		/*add a nop statement before this if needed to force the correct alignment*/
10902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		->	{needsNop}?	^(I_STATEMENT_FORMAT10x[$start,  "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"])
10912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com					^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
10922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com						^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
10932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com						^(I_PACKED_SWITCH_TARGETS[$start, "I_PACKED_SWITCH_TARGETS"] I_PACKED_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] $switch_target*)
10942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com					)
10952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
10962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		->	^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
10972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
10982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				^(I_PACKED_SWITCH_TARGETS[$start, "I_PACKED_SWITCH_TARGETS"] I_PACKED_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] $switch_target*)
109947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver			);
1100d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com
110147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_sparse_switch_directive returns [int size]
110247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver    @init {boolean needsNop = false; int targetCount = 0;}
110347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver	:   SPARSE_SWITCH_DIRECTIVE
11042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		{
11052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			targetCount = 0;
11062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			if (($method::currentAddress \% 2) != 0) {
11072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				needsNop = true;
11082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				$size = 2;
11092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			} else {
11102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				$size = 0;
11112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com			}
11122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		}
11132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
11142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		(fixed_32bit_literal ARROW switch_target += label_ref_or_offset {$size += 8; targetCount++;})*
11152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
11162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		END_SPARSE_SWITCH_DIRECTIVE {$size = $size + 4;}
11172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com
11182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		/*add a nop statement before this if needed to force the correct alignment*/
11192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		->	{needsNop}?	^(I_STATEMENT_FORMAT10x[$start,  "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"])
11202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com					^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
11212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com						I_SPARSE_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)]
11222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com						^(I_SPARSE_SWITCH_KEYS[$start, "I_SPARSE_SWITCH_KEYS"] fixed_32bit_literal*)
11232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com						^(I_SPARSE_SWITCH_TARGETS $switch_target*))
11242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com		->	^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
11252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				I_SPARSE_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)]
11262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				^(I_SPARSE_SWITCH_KEYS[$start, "I_SPARSE_SWITCH_KEYS"] fixed_32bit_literal*)
11272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com				^(I_SPARSE_SWITCH_TARGETS $switch_target*));