package org.develnext.jphp.core.tokenizer.token.expr.value;
import org.develnext.jphp.core.tokenizer.TokenType;
import org.develnext.jphp.core.tokenizer.TokenMeta;
import org.develnext.jphp.core.tokenizer.token.expr.ValueExprToken;
import org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken;
import java.util.ArrayList;
import java.util.List;
public class StringExprToken extends ValueExprToken {
public enum Quote { SINGLE, DOUBLE, SHELL, DOC;
public boolean isMagic() {
return this == DOUBLE || this == SHELL;
}
}
public static class Segment {
public final int from;
public final int to;
public final boolean isVariable;
public Segment(int from, int to, boolean isVariable) {
this.from = from;
this.to = to;
this.isVariable = isVariable;
}
}
protected final Quote quote;
private String value;
protected List<Segment> segments = new ArrayList<Segment>();
protected ExprStmtToken expression;
protected boolean binary;
public StringExprToken(TokenMeta meta, Quote quote) {
super(meta, TokenType.T_CONSTANT_ENCAPSED_STRING);
this.quote = quote;
this.value = meta.getWord();
}
public List<Segment> getSegments() {
return segments;
}
public void setSegments(List<Segment> segments) {
this.segments = segments;
}
public Quote getQuote() {
return quote;
}
public String getValue() {
return value;
}
@Override
public Object toNumeric(){
int len = value.length();
boolean real = false;
int i = 0;
for(; i < len; i++){
char ch = value.charAt(i);
if (!('9' >= ch && ch >= '0')){
if (ch == '.'){
if (real)
break;
real = true;
continue;
}
if (i == 0)
return 0;
else
break;
}
}
if (real) {
if (len == i)
return Double.parseDouble(value);
else
return Double.parseDouble(value.substring(0, i));
} else {
if (len == i)
return Long.parseLong(value);
else
return Long.parseLong(value.substring(0, i));
}
}
public ExprStmtToken getExpression() {
return expression;
}
public void setExpression(ExprStmtToken expression) {
this.expression = expression;
}
@Override
public String toString() {
return value;
}
@Override
public boolean isConstant() {
return true;
}
public boolean isBinary() {
return binary;
}
public void setBinary(boolean binary) {
this.binary = binary;
}
}