public static BuilderClassDef parse(String path, InputStream is, DexBuilder dexBuilder) throws UnsupportedEncodingException, RecognitionException { File smaliFile = new File(path); InputStreamReader reader = new InputStreamReader(is, "UTF-8"); LexerErrorInterface lexer = new smaliFlexLexer(reader); ((smaliFlexLexer) lexer).setSourceFile(smaliFile); CommonTokenStream tokens = new CommonTokenStream((TokenSource) lexer); smaliParser parser = new smaliParser(tokens); parser.setApiLevel(DEFAULT_API_LEVEL); smaliParser.smali_file_return result = parser.smali_file(); if ((parser.getNumberOfSyntaxErrors() > 0) || (lexer.getNumberOfSyntaxErrors() > 0)) { throw new RuntimeException("Unable to parse: " + smaliFile); } CommonTree t = result.getTree(); CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t); treeStream.setTokenStream(tokens); smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); dexGen.setVerboseErrors(false); dexGen.setDexBuilder(dexBuilder); BuilderClassDef classDef = (BuilderClassDef) dexGen.smali_file(); if (dexGen.getNumberOfSyntaxErrors() != 0) { throw new RuntimeException("Unable to walk: " + smaliFile); } return classDef; }
zzPeek = false; else { boolean eof = zzRefill(); zzEndReadL = zzEndRead; zzMarkedPosL = zzMarkedPos; boolean eof = zzRefill(); switch (zzLexicalState) { case YYINITIAL: { return newToken(EOF); yybegin(YYINITIAL); yybegin(YYINITIAL); yybegin(YYINITIAL); return invalidStringOrChar("Unterminated string literal"); return invalidStringOrChar("Unterminated character literal"); switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 1: { return invalidToken("Invalid text"); { return newToken(POSITIVE_INTEGER_LITERAL); { return newToken(SIMPLE_NAME);
zzPeek = false; else { boolean eof = zzRefill(); zzEndReadL = zzEndRead; zzMarkedPosL = zzMarkedPos; boolean eof = zzRefill(); { return invalidToken("Invalid text"); { return newToken(POSITIVE_INTEGER_LITERAL); { return newToken(SIMPLE_NAME); { return invalidToken("Invalid directive"); { return newToken(PRIMITIVE_TYPE); { return newToken(WHITE_SPACE, true); { beginStringOrChar(STRING); sb.append('"'); { beginStringOrChar(CHAR); sb.append('\''); { return newToken(LINE_COMMENT, true); { return newToken(VOID_TYPE); { return newToken(EQUAL);
Assert.fail("Could not load " + smaliFile); smaliFlexLexer lexer = new smaliFlexLexer(new InputStreamReader(smaliStream)); lexer.setSourceFile(new File(test + ".smali")); lexer.setSuppressErrors(true);
private Token endStringOrChar(int type) { yybegin(YYINITIAL); if (stringOrCharError != null) { return invalidStringOrChar(stringOrCharError); } CommonToken token = new CommonToken(type, sb.toString()); token.setStartIndex(stringStartChar); token.setStopIndex(yychar + yylength() - 1); token.setLine(stringStartLine); token.setCharPositionInLine(stringStartCol); return token; }
public Token nextToken() { try { Token token = yylex(); if (token instanceof InvalidToken) { InvalidToken invalidToken = (InvalidToken)token; if (!suppressErrors) { System.err.println(getErrorHeader(invalidToken) + " Error for input '" + invalidToken.getText() + "': " + invalidToken.getMessage()); } lexerErrors++; } return token; } catch (java.io.IOException e) { System.err.println("shouldn't happen: " + e.getMessage()); return newToken(EOF); } }
private Token invalidToken(String message) { return invalidToken(message, yytext()); }
lexer = new smaliFlexLexer(reader); tokens = new CommonTokenStream((TokenSource)lexer);
public String getErrorHeader(InvalidToken token) { return getSourceName()+"["+ token.getLine()+","+token.getCharPositionInLine()+"]"; }
zzPeek = false; else { boolean eof = zzRefill(); zzEndReadL = zzEndRead; zzMarkedPosL = zzMarkedPos; boolean eof = zzRefill(); switch (zzLexicalState) { case YYINITIAL: { return newToken(EOF); yybegin(YYINITIAL); yybegin(YYINITIAL); yybegin(YYINITIAL); return invalidStringOrChar("Unterminated string literal"); return invalidStringOrChar("Unterminated character literal"); switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 1: { return invalidToken("Invalid text"); { return newToken(POSITIVE_INTEGER_LITERAL); { return newToken(SIMPLE_NAME);
private Token endStringOrChar(int type) { yybegin(YYINITIAL); if (stringOrCharError != null) { return invalidStringOrChar(stringOrCharError); } CommonToken token = new CommonToken(type, sb.toString()); token.setStartIndex(stringStartChar); token.setStopIndex(yychar + yylength() - 1); token.setLine(stringStartLine); token.setCharPositionInLine(stringStartCol); return token; }
public Token nextToken() { try { Token token = yylex(); if (token instanceof InvalidToken) { InvalidToken invalidToken = (InvalidToken)token; if (!suppressErrors) { System.err.println(getErrorHeader(invalidToken) + " Error for input '" + invalidToken.getText() + "': " + invalidToken.getMessage()); } lexerErrors++; } return token; } catch (java.io.IOException e) { System.err.println("shouldn't happen: " + e.getMessage()); return newToken(EOF); } }
private Token invalidToken(String message) { return invalidToken(message, yytext()); }
lexer = new smaliFlexLexer(reader); tokens = new CommonTokenStream((TokenSource)lexer);
public String getErrorHeader(InvalidToken token) { return getSourceName()+"["+ token.getLine()+","+token.getCharPositionInLine()+"]"; }
InputStreamReader reader = new InputStreamReader(is, "UTF-8"); lexer = new smaliFlexLexer(reader); ((smaliFlexLexer)lexer).setSourceFile(smaliFile); tokens = new CommonTokenStream((TokenSource) lexer);