package org.develnext.jphp.core.tokenizer.token.expr;
import org.develnext.jphp.core.tokenizer.TokenType;
import org.develnext.jphp.core.tokenizer.TokenMeta;
public class BraceExprToken extends ExprToken {
public enum Kind {
SIMPLE,
ARRAY,
BLOCK,
ANY;
public static String toOpen(Kind kind){
switch (kind){
case ARRAY: return "[";
case BLOCK: return "{";
case SIMPLE: return "(";
}
return null;
}
public static String toClose(Kind kind){
switch (kind){
case ARRAY: return "]";
case BLOCK: return "}";
case SIMPLE: return ")";
}
return null;
}
}
protected Kind kind;
protected boolean closed;
public BraceExprToken(TokenMeta meta) {
super(meta, TokenType.T_J_BRACE);
switch (meta.getWord().charAt(0)){
case '{': kind = Kind.BLOCK; break;
case '[': kind = Kind.ARRAY; break;
case '(': kind = Kind.SIMPLE; break;
case '}': kind = Kind.BLOCK; closed = true; break;
case ']': kind = Kind.ARRAY; closed = true; break;
case ')': kind = Kind.SIMPLE; closed = true; break;
default:
throw new IllegalArgumentException("Invalid " + meta.getWord() + " word for BraceExprToken");
}
}
public Kind getKind() {
return kind;
}
public boolean isClosed() {
return closed;
}
public boolean isOpened(){
return !closed;
}
public boolean isClosed(Kind kind){
return isClosed() && this.kind == kind;
}
public boolean isOpened(Kind kind){
return isOpened() && this.kind == kind;
}
public boolean isBlockOpened(){
return kind == Kind.BLOCK && isOpened();
}
public boolean isBlockClosed(){
return kind == Kind.BLOCK && isClosed();
}
public boolean isArrayOpened(){
return kind == Kind.ARRAY && isOpened();
}
public boolean isArrayClosed(){
return kind == Kind.ARRAY && isClosed();
}
public boolean isArray(){
return kind == Kind.ARRAY;
}
public boolean isBlock(){
return kind == Kind.BLOCK;
}
public boolean isSimpleOpened(){
return kind == Kind.SIMPLE && isOpened();
}
public boolean isSimpleClosed(){
return kind == Kind.SIMPLE && isClosed();
}
public boolean isSimple(){
return kind == Kind.SIMPLE;
}
@Override
public int getPriority() {
if (closed)
return 1001;
return 1000;
}
}