Refactor how PARAM_LIST is parsed

This commit is contained in:
Ben Gruver 2015-03-01 14:28:53 -08:00
parent c5cf51ac69
commit 0f49330183
7 changed files with 10 additions and 31 deletions

View File

@ -129,8 +129,6 @@ tokens {
OPEN_BRACE; OPEN_BRACE;
OPEN_PAREN; OPEN_PAREN;
PACKED_SWITCH_DIRECTIVE; PACKED_SWITCH_DIRECTIVE;
PARAM_LIST_END;
PARAM_LIST_START;
PARAM_LIST_OR_ID_PRIMITIVE_TYPE; PARAM_LIST_OR_ID_PRIMITIVE_TYPE;
PARAMETER_DIRECTIVE; PARAMETER_DIRECTIVE;
POSITIVE_INTEGER_LITERAL; POSITIVE_INTEGER_LITERAL;
@ -582,8 +580,7 @@ method_prototype
-> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?); -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?);
param_list param_list
: PARAM_LIST_START nonvoid_type_descriptor* PARAM_LIST_END -> nonvoid_type_descriptor* : (PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE])+
| (PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE])+
| nonvoid_type_descriptor*; | nonvoid_type_descriptor*;
array_descriptor array_descriptor

View File

@ -316,8 +316,8 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} |
{PrimitiveType} { return newToken(PRIMITIVE_TYPE); } {PrimitiveType} { return newToken(PRIMITIVE_TYPE); }
{ClassDescriptor} { return newToken(CLASS_DESCRIPTOR); } {ClassDescriptor} { return newToken(CLASS_DESCRIPTOR); }
{ArrayPrefix} { return newToken(ARRAY_TYPE_PREFIX); } {ArrayPrefix} { return newToken(ARRAY_TYPE_PREFIX); }
[^] { yypushback(1); yybegin(YYINITIAL); return newToken(PARAM_LIST_END); } [^] { yypushback(1); yybegin(YYINITIAL);}
<<EOF>> { yybegin(YYINITIAL); return newToken(PARAM_LIST_END); } <<EOF>> { yybegin(YYINITIAL);}
} }
<STRING> { <STRING> {
@ -638,9 +638,9 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} |
} }
{Type} {Type}+ { {Type} {Type}+ {
// go back and re-lex it as a PARAM_LIST
yypushback(yylength()); yypushback(yylength());
yybegin(PARAM_LIST); yybegin(PARAM_LIST);
return newToken(PARAM_LIST_START);
} }
{SimpleName} { return newToken(SIMPLE_NAME); } {SimpleName} { return newToken(SIMPLE_NAME); }

View File

@ -554,13 +554,11 @@ METHOD_DIRECTIVE(".method")
ACCESS_SPEC("public") ACCESS_SPEC("public")
SIMPLE_NAME("setCallForwardingOption") SIMPLE_NAME("setCallForwardingOption")
OPEN_PAREN("(") OPEN_PAREN("(")
PARAM_LIST_START("")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
CLASS_DESCRIPTOR("Ljava/lang/String;") CLASS_DESCRIPTOR("Ljava/lang/String;")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
CLASS_DESCRIPTOR("Landroid/os/Message;") CLASS_DESCRIPTOR("Landroid/os/Message;")
PARAM_LIST_END("")
CLOSE_PAREN(")") CLOSE_PAREN(")")
VOID_TYPE("V") VOID_TYPE("V")
REGISTERS_DIRECTIVE(".registers") REGISTERS_DIRECTIVE(".registers")
@ -705,12 +703,10 @@ CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone$MyHandler;")
ARROW("->") ARROW("->")
SIMPLE_NAME("obtainMessage") SIMPLE_NAME("obtainMessage")
OPEN_PAREN("(") OPEN_PAREN("(")
PARAM_LIST_START("")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
CLASS_DESCRIPTOR("Ljava/lang/Object;") CLASS_DESCRIPTOR("Ljava/lang/Object;")
PARAM_LIST_END("")
CLOSE_PAREN(")") CLOSE_PAREN(")")
CLASS_DESCRIPTOR("Landroid/os/Message;") CLASS_DESCRIPTOR("Landroid/os/Message;")
INSTRUCTION_FORMAT11x("move-result-object") INSTRUCTION_FORMAT11x("move-result-object")
@ -762,14 +758,12 @@ CLASS_DESCRIPTOR("Lcom/android/internal/telephony/CommandsInterface;")
ARROW("->") ARROW("->")
SIMPLE_NAME("setCallForward") SIMPLE_NAME("setCallForward")
OPEN_PAREN("(") OPEN_PAREN("(")
PARAM_LIST_START("")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
CLASS_DESCRIPTOR("Ljava/lang/String;") CLASS_DESCRIPTOR("Ljava/lang/String;")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
CLASS_DESCRIPTOR("Landroid/os/Message;") CLASS_DESCRIPTOR("Landroid/os/Message;")
PARAM_LIST_END("")
CLOSE_PAREN(")") CLOSE_PAREN(")")
VOID_TYPE("V") VOID_TYPE("V")
LINE_DIRECTIVE(".line") LINE_DIRECTIVE(".line")

View File

@ -53,42 +53,32 @@ PARAM_LIST_OR_ID_PRIMITIVE_TYPE("J")
PARAM_LIST_OR_ID_PRIMITIVE_TYPE("F") PARAM_LIST_OR_ID_PRIMITIVE_TYPE("F")
PARAM_LIST_OR_ID_PRIMITIVE_TYPE("D") PARAM_LIST_OR_ID_PRIMITIVE_TYPE("D")
PARAM_LIST_START("")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
CLASS_DESCRIPTOR("La;") CLASS_DESCRIPTOR("La;")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
CLASS_DESCRIPTOR("La;") CLASS_DESCRIPTOR("La;")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PARAM_LIST_END("")
PARAM_LIST_START("")
CLASS_DESCRIPTOR("Ljava/lang/String;") CLASS_DESCRIPTOR("Ljava/lang/String;")
CLASS_DESCRIPTOR("Ljava/lang/String;") CLASS_DESCRIPTOR("Ljava/lang/String;")
PARAM_LIST_END("")
PARAM_LIST_START("")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
PARAM_LIST_END("")
PARAM_LIST_START("")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("Z") PRIMITIVE_TYPE("Z")
PARAM_LIST_END("")
PARAM_LIST_START("")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
PRIMITIVE_TYPE("I") PRIMITIVE_TYPE("I")
ARRAY_TYPE_PREFIX("[") ARRAY_TYPE_PREFIX("[")
CLASS_DESCRIPTOR("Ljava/lang/String;") CLASS_DESCRIPTOR("Ljava/lang/String;")
PARAM_LIST_END("")
MEMBER_NAME("<init>") MEMBER_NAME("<init>")
MEMBER_NAME("<clinit>") MEMBER_NAME("<clinit>")

View File

@ -477,8 +477,7 @@ colon
} }
param_list_inner param_list_inner
: ((PARAM_LIST_START param* PARAM_LIST_END) : param+;
| (param+));
catch [RecognitionException re] { catch [RecognitionException re] {
Marker errorMarker = mark(); Marker errorMarker = mark();
recover(input, re); recover(input, re);
@ -509,8 +508,7 @@ param_list_reference
@init { @init {
Marker marker = mark(); Marker marker = mark();
} }
: ((PARAM_LIST_START nonvoid_type_descriptor* PARAM_LIST_END) : nonvoid_type_descriptor*
| (nonvoid_type_descriptor)*)
{ marker.done(SmaliElementTypes.METHOD_REFERENCE_PARAM_LIST); }; { marker.done(SmaliElementTypes.METHOD_REFERENCE_PARAM_LIST); };
catch [RecognitionException re] { catch [RecognitionException re] {
recover(input, re); recover(input, re);

View File

@ -141,8 +141,6 @@ public class SmaliTokens {
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType OPEN_BRACE; @SuppressWarnings({"UnusedDeclaration"}) public static IElementType OPEN_BRACE;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType OPEN_PAREN; @SuppressWarnings({"UnusedDeclaration"}) public static IElementType OPEN_PAREN;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType PACKED_SWITCH_DIRECTIVE; @SuppressWarnings({"UnusedDeclaration"}) public static IElementType PACKED_SWITCH_DIRECTIVE;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType PARAM_LIST_END;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType PARAM_LIST_START;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType PARAM_LIST_OR_ID_PRIMITIVE_TYPE; @SuppressWarnings({"UnusedDeclaration"}) public static IElementType PARAM_LIST_OR_ID_PRIMITIVE_TYPE;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType PARAMETER_DIRECTIVE; @SuppressWarnings({"UnusedDeclaration"}) public static IElementType PARAMETER_DIRECTIVE;
@SuppressWarnings({"UnusedDeclaration"}) public static IElementType POSITIVE_INTEGER_LITERAL; @SuppressWarnings({"UnusedDeclaration"}) public static IElementType POSITIVE_INTEGER_LITERAL;
@ -261,9 +259,7 @@ public class SmaliTokens {
tokenColors.put("OPEN_BRACE", SmaliHighlightingColors.BRACES); tokenColors.put("OPEN_BRACE", SmaliHighlightingColors.BRACES);
tokenColors.put("OPEN_PAREN", SmaliHighlightingColors.PARENS); tokenColors.put("OPEN_PAREN", SmaliHighlightingColors.PARENS);
tokenColors.put("PACKED_SWITCH_DIRECTIVE", SmaliHighlightingColors.DIRECTIVE); tokenColors.put("PACKED_SWITCH_DIRECTIVE", SmaliHighlightingColors.DIRECTIVE);
tokenColors.put("PARAM_LIST_END", SmaliHighlightingColors.TYPE);
tokenColors.put("PARAM_LIST_OR_ID_PRIMITIVE_TYPE", SmaliHighlightingColors.TYPE); tokenColors.put("PARAM_LIST_OR_ID_PRIMITIVE_TYPE", SmaliHighlightingColors.TYPE);
tokenColors.put("PARAM_LIST_START", SmaliHighlightingColors.TYPE);
tokenColors.put("PARAMETER_DIRECTIVE", SmaliHighlightingColors.DIRECTIVE); tokenColors.put("PARAMETER_DIRECTIVE", SmaliHighlightingColors.DIRECTIVE);
tokenColors.put("POSITIVE_INTEGER_LITERAL", SmaliHighlightingColors.NUMBER); tokenColors.put("POSITIVE_INTEGER_LITERAL", SmaliHighlightingColors.NUMBER);
tokenColors.put("PRIMITIVE_TYPE", SmaliHighlightingColors.TYPE); tokenColors.put("PRIMITIVE_TYPE", SmaliHighlightingColors.TYPE);

View File

@ -43,6 +43,8 @@ smali.FILE
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
PsiElement(MEMBER_NAME) PsiElement(MEMBER_NAME)
<empty list> <empty list>
PsiElement(METHOD_REFERENCE_PARAM_LIST)
<empty list>
PsiElement(END_METHOD_DIRECTIVE)('.end method') PsiElement(END_METHOD_DIRECTIVE)('.end method')
PsiWhiteSpace('\n\n') PsiWhiteSpace('\n\n')
SmaliMethod(METHOD) SmaliMethod(METHOD)
@ -85,6 +87,8 @@ smali.FILE
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
PsiElement(MEMBER_NAME) PsiElement(MEMBER_NAME)
<empty list> <empty list>
PsiElement(METHOD_REFERENCE_PARAM_LIST)
<empty list>
PsiElement(END_METHOD_DIRECTIVE)('.end method') PsiElement(END_METHOD_DIRECTIVE)('.end method')
PsiWhiteSpace('\n\n') PsiWhiteSpace('\n\n')
SmaliMethod(METHOD) SmaliMethod(METHOD)