From 1c9fcdee6d9bd2b086edff83d9a19d8e7dd0aa9d Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sat, 20 Jun 2009 20:00:29 +0000 Subject: [PATCH] - Fixed an issue where smali didn't support class, method or field declarations with no access flags - Added support for "null" encoded value literals git-svn-id: https://smali.googlecode.com/svn/trunk@174 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- smali/src/main/antlr3/org/jf/smali/smaliLexer.g | 16 +++++++++++----- smali/src/main/antlr3/org/jf/smali/smaliParser.g | 3 ++- .../main/antlr3/org/jf/smali/smaliTreeWalker.g | 5 +++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g index 5d7cf8e2..66df0478 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g @@ -198,7 +198,7 @@ import java.util.ArrayDeque; CLASS_PHRASE : CLASS_DIRECTIVE_EMIT WS - (CLASS_ACCESS_SPEC_EMIT WS)+ + (CLASS_ACCESS_SPEC_EMIT WS)* CLASS_DESCRIPTOR_EMIT; SUPER_PHRASE @@ -219,7 +219,7 @@ SOURCE_PHRASE FIELD_PHRASE : FIELD_DIRECTIVE_EMIT WS - (FIELD_ACCESS_SPEC_EMIT WS)+ + (FIELD_ACCESS_SPEC_EMIT WS)* MEMBER_NAME_EMIT COLON_EMIT NONVOID_TYPE_DESCRIPTOR_EMITCHILD @@ -232,7 +232,7 @@ END_FIELD_PHRASE METHOD_PHRASE : METHOD_DIRECTIVE_EMIT WS - (METHOD_ACCESS_SPEC_EMIT WS)+ + (METHOD_ACCESS_SPEC_EMIT WS)* MEMBER_NAME_EMIT METHOD_PROTOTYPE_EMITCHILDREN; @@ -880,11 +880,12 @@ fragment LITERAL_EMITCHILD | DOUBLE_LITERAL_EMIT | CHAR_LITERAL_EMIT | BOOL_LITERAL_EMIT + | NULL_LITERAL_EMIT | ARRAY_LITERAL_EMITCHILDREN | SUBANNOTATION_EMITCHILDREN | TYPE_FIELD_METHOD_LITERAL_EMITCHILDREN | ENUM_LITERAL_EMITCHILDREN; - + fragment SUBANNOTATION_EMITCHILDREN : SUBANNOTATION_START_EMIT WS @@ -924,7 +925,7 @@ fragment ANNOTATION_VISIBILITY fragment ANNOTATION_ELEMENT_EMITCHILDREN : MEMBER_NAME_EMIT WS? - EQUAL_EMIT + EQUAL_EMIT WS? LITERAL_EMITCHILD; @@ -1080,6 +1081,11 @@ fragment CHAR_LITERAL[StringBuilder sb] '\'' {sb.append("'");} ; +fragment NULL_LITERAL_EMIT + : NULL_LITERAL {emit($NULL_LITERAL, NULL_LITERAL);}; +fragment NULL_LITERAL + : 'null'; + fragment BOOL_LITERAL_EMIT : BOOL_LITERAL {emit($BOOL_LITERAL, BOOL_LITERAL);}; fragment BOOL_LITERAL diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g index d3244170..47698504 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g @@ -214,7 +214,7 @@ source_spec : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL); access_list - : ACCESS_SPEC+ -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC+); + : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*); field : FIELD_DIRECTIVE access_list MEMBER_NAME nonvoid_type_descriptor literal? @@ -591,6 +591,7 @@ literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL + | NULL_LITERAL | array_literal | subannotation | type_field_method_literal diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g index 0024ffe4..c4ab8865 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g @@ -188,7 +188,7 @@ access_list returns [int value] { $value |= AccessFlags.getAccessFlag($ACCESS_SPEC.getText()).getValue(); } - )+); + )*); fields returns[List fieldAnnotationSets] : ^(I_FIELDS @@ -263,13 +263,14 @@ literal returns[EncodedValue encodedValue] | char_literal { $encodedValue = new EncodedValue(dexFile, new CharEncodedValueSubField($char_literal.value)); } | string_literal { $encodedValue = new EncodedValue(dexFile, new EncodedIndexedItemReference(dexFile, new StringIdItem(dexFile, $string_literal.value))); } | bool_literal { $encodedValue = new EncodedValue(dexFile, new BoolEncodedValueSubField($bool_literal.value)); } + | NULL_LITERAL { $encodedValue = new EncodedValue(dexFile, new NullEncodedValueSubField()); } | type_descriptor { $encodedValue = new EncodedValue(dexFile, new EncodedIndexedItemReference(dexFile, $type_descriptor.type)); } | array_literal { $encodedValue = new EncodedValue(dexFile, new ArrayEncodedValueSubField(dexFile, $array_literal.values)); } | subannotation { $encodedValue = new EncodedValue(dexFile, $subannotation.value); } | field_literal { $encodedValue = new EncodedValue(dexFile, $field_literal.value); } | method_literal { $encodedValue = new EncodedValue(dexFile, $method_literal.value); } | enum_literal { $encodedValue = new EncodedValue(dexFile, $enum_literal.value); }; - + //everything but string fixed_size_literal returns[byte[\] value]