Added support for NaNd, NaNf, InfinityD, InfinityF, -InfinityD and -InfinityF constants

git-svn-id: https://smali.googlecode.com/svn/trunk@222 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com 2009-06-25 07:07:05 +00:00
parent 69c3abb483
commit 87f4a1a35e
2 changed files with 49 additions and 5 deletions

View File

@ -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

View File

@ -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); };