diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g index 66df0478..282d65b2 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g @@ -1057,13 +1057,18 @@ fragment BINARY_EXPONENT fragment FLOAT_LITERAL_EMIT : FLOAT_LITERAL {emit($FLOAT_LITERAL, FLOAT_LITERAL);}; fragment FLOAT_LITERAL - : '-'? (FLOATING_POINT_NUMBER | ('0' .. '9')+) ('f' | 'F'); + : '-'? ( FLOATING_POINT_NUMBER ('f' | 'F') + | ('0' .. '9')+ ('f' | 'F') + | ('i' | 'I') ('n' | 'N') ('f' | 'F') ('i' | 'I') ('n' | 'N') ('i' | 'I') ('t' | 'T') ('y' | 'Y') ('f' | 'F')) + | ('n' | 'N') ('a' | 'A') ('n' | 'N') ('f' | 'F'); fragment DOUBLE_LITERAL_EMIT : DOUBLE_LITERAL {emit($DOUBLE_LITERAL, DOUBLE_LITERAL);}; fragment DOUBLE_LITERAL - : '-'? FLOATING_POINT_NUMBER ('d' | 'D')? - | '-'? ('0' .. '9')+ ('d' | 'D'); + : '-'? ( FLOATING_POINT_NUMBER ('d' | 'D')? + | ('0' .. '9')+ ('d' | 'D') + | ('i' | 'I') ('n' | 'N') ('f' | 'F') ('i' | 'I') ('n' | 'N') ('i' | 'I') ('t' | 'T') ('y' | 'Y') ('d' | 'D')?) + | ('n' | 'N') ('a' | 'A') ('n' | 'N') ('d' | 'D')?; fragment CHAR_LITERAL_EMIT diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g index ce415192..b7c45525 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g @@ -37,6 +37,9 @@ options { package org.jf.smali; import java.util.HashMap; +import java.util.regex.*; +import java.lang.Float; +import java.lang.Double; import org.jf.dexlib.*; import org.jf.dexlib.EncodedValue.*; @@ -93,6 +96,42 @@ import org.jf.dexlib.Code.Format.*; return val; } + private static Pattern specialFloatRegex = Pattern.compile("((-)?infinityf)|(nanf)", Pattern.CASE_INSENSITIVE); + private float parseFloat(String floatString) { + Matcher m = specialFloatRegex.matcher(floatString); + if (m.matches()) { + //got an infinity + if (m.start(1) != -1) { + if (m.start(2) != -1) { + return Float.NEGATIVE_INFINITY; + } else { + return Float.POSITIVE_INFINITY; + } + } else { + return Float.NaN; + } + } + return Float.parseFloat(floatString); + } + + private static Pattern specialDoubleRegex = Pattern.compile("((-)?infinityd?)|(nand?)", Pattern.CASE_INSENSITIVE); + private double parseDouble(String doubleString) { + Matcher m = specialDoubleRegex.matcher(doubleString); + if (m.matches()) { + //got an infinity + if (m.start(1) != -1) { + if (m.start(2) != -1) { + return Double.NEGATIVE_INFINITY; + } else { + return Double.POSITIVE_INFINITY; + } + } else { + return Double.NaN; + } + } + return Double.parseDouble(doubleString); + } + public String getErrorMessage(RecognitionException e, String[] tokenNames) { if ( e instanceof SemanticException ) { return e.getMessage(); @@ -1220,10 +1259,10 @@ byte_literal returns[byte value] : BYTE_LITERAL { $value = literalTools.parseByte($BYTE_LITERAL.text); }; float_literal returns[float value] - : FLOAT_LITERAL { $value = Float.parseFloat($FLOAT_LITERAL.text); }; + : FLOAT_LITERAL { $value = parseFloat($FLOAT_LITERAL.text); }; double_literal returns[double value] - : DOUBLE_LITERAL { $value = Double.parseDouble($DOUBLE_LITERAL.text); }; + : DOUBLE_LITERAL { $value = parseDouble($DOUBLE_LITERAL.text); }; char_literal returns[char value] : CHAR_LITERAL { $value = $CHAR_LITERAL.text.charAt(1); };