package org.develnext.jphp.core.tokenizer.token.expr.value;
import php.runtime.common.GrammarUtils;
import org.develnext.jphp.core.tokenizer.TokenType;
import org.develnext.jphp.core.tokenizer.TokenMeta;
import org.develnext.jphp.core.tokenizer.token.expr.ValueExprToken;
import java.math.BigInteger;
public class IntegerExprToken extends ValueExprToken {
private long value;
private BigInteger bigValue;
public IntegerExprToken(TokenMeta meta) {
super(meta, TokenType.T_LNUMBER);
String word = meta.getWord();
boolean isNegative = false;
int radix, offset;
if (word.charAt(0) == '-') {
word = word.substring(1);
isNegative = true;
}
if (GrammarUtils.isOctalInteger(word)) {
radix = 8;
offset = 1;
} else if (GrammarUtils.isBinaryInteger(word)) {
radix = 2;
offset = 2;
} else if (GrammarUtils.isHexInteger(word)) {
radix = 16;
offset = 2;
} else {
try {
value = Long.parseLong(word);
if (isNegative) {
value = -value;
}
} catch (NumberFormatException e){
bigValue = new BigInteger(word);
if (isNegative) {
bigValue = bigValue.negate();
}
}
return;
}
value = new BigInteger(word.substring(offset), radix).longValue();
if (isNegative) {
value = -value;
}
}
public long getValue() {
return value;
}
public BigInteger getBigValue() {
return bigValue == null ? BigInteger.valueOf(value) : bigValue;
}
public boolean isBigValue(){
return bigValue != null;
}
public boolean isByte(){
return value >= 0 && value <= 255;
}
public boolean isShort(){
return value >= 0 && value <= Short.MAX_VALUE;
}
public boolean isInteger(){
return value >= 0 && value <= Integer.MAX_VALUE;
}
@Override
public boolean isConstant() {
return true;
}
@Override
public String toString() {
return String.valueOf(value);
}
@Override
public Object toNumeric() {
return value;
}
}