package org.develnext.jphp.core.syntax.generators;
import org.develnext.jphp.core.common.Separator;
import org.develnext.jphp.core.syntax.SyntaxAnalyzer;
import org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator;
import org.develnext.jphp.core.tokenizer.TokenType;
import org.develnext.jphp.core.tokenizer.token.Token;
import org.develnext.jphp.core.tokenizer.token.expr.ClassExprToken;
import org.develnext.jphp.core.tokenizer.token.expr.CommaToken;
import org.develnext.jphp.core.tokenizer.token.expr.OperatorExprToken;
import org.develnext.jphp.core.tokenizer.token.expr.ValueExprToken;
import org.develnext.jphp.core.tokenizer.token.expr.operator.AssignExprToken;
import org.develnext.jphp.core.tokenizer.token.expr.value.FulledNameToken;
import org.develnext.jphp.core.tokenizer.token.expr.value.ImportExprToken;
import org.develnext.jphp.core.tokenizer.token.expr.value.NameToken;
import org.develnext.jphp.core.tokenizer.token.stmt.*;
import java.util.ListIterator;
public class ConstGenerator extends Generator<ConstStmtToken> {
@SuppressWarnings("unchecked")
public final static Class<? extends Token>[] valueTokens = new Class[]{
ValueExprToken.class, OperatorExprToken.class
};
public ConstGenerator(SyntaxAnalyzer analyzer) {
super(analyzer);
}
/*@SuppressWarnings("unchecked")
protected void processBody(ConstStmtToken result, ListIterator<Token> iterator){
Token current = nextToken(iterator);
if (!(current instanceof AssignExprToken))
unexpectedToken(current, "=");
ExprStmtToken value = analyzer.generator(SimpleExprGenerator.class).getToken(nextToken(iterator), iterator);
if (value == null)
unexpectedToken(nextToken(iterator));
result.setValue(value);
}*/
@Override
@SuppressWarnings("unchecked")
public ConstStmtToken getToken(Token current, ListIterator<Token> iterator) {
if (current instanceof ConstStmtToken){
ConstStmtToken result = (ConstStmtToken)current;
Token prev = null;
if (analyzer.getClazz() == null)
result.setNamespace(analyzer.getNamespace());
while (true) {
Token next = analyzer.getClazz() == null ? nextToken(iterator) : nextTokenSensitive(iterator, ClassStmtToken.class);
if (next instanceof NameToken){
if (next instanceof FulledNameToken && !((FulledNameToken) next).isProcessed(NamespaceUseStmtToken.UseType.CONSTANT))
unexpectedToken(next, TokenType.T_STRING);
Token token = nextToken(iterator);
if (!(token instanceof AssignExprToken))
unexpectedToken(token, "=");
ExprStmtToken value = analyzer.generator(SimpleExprGenerator.class)
.getToken(nextToken(iterator), iterator, Separator.COMMA_OR_SEMICOLON, null);
if (!isBreak(iterator.previous())){
iterator.next();
}
if (value == null)
unexpectedToken(iterator.previous());
result.add((NameToken)next, value);
} else if (next instanceof CommaToken){
if (prev instanceof CommaToken)
unexpectedToken(next);
prev = next;
} else if (isBreak(next)){
break;
} else
unexpectedToken(next, TokenType.T_STRING);
}
return result;
}
return null;
}
}