mirror of
https://github.com/revanced/smali.git
synced 2025-05-04 08:34:25 +02:00
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:
parent
69c3abb483
commit
87f4a1a35e
@ -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
|
||||
|
@ -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); };
|
||||
|
Loading…
x
Reference in New Issue
Block a user