Search in sources :

Example 1 with TokenType

use of com.googlecode.aviator.lexer.token.Token.TokenType in project aviatorscript by killme2008.

the class OptimizeCodeGenerator method executeOperator.

private int executeOperator(final Map<Integer, DelegateTokenType> index2DelegateType, final Token<?> operatorToken, final OperatorType operatorType, final int operatorIndex, int operandCount) {
    Token<?> token = null;
    operandCount += index2DelegateType.size();
    // check if literal expression can be executed
    boolean canExecute = true;
    // operand count
    int count = 0;
    // operand start index
    int operandStartIndex = -1;
    for (int j = operatorIndex - 1; j >= 0; j--) {
        token = this.tokenList.get(j);
        if (token == null) {
            // we must compact token list and retry executing
            return -1;
        }
        final TokenType tokenType = token.getType();
        // Check if operand is a literal operand
        if (!isLiteralOperand(token, tokenType, count + 1, index2DelegateType)) {
            canExecute = false;
            break;
        }
        count++;
        if (count == operandCount) {
            operandStartIndex = j;
            break;
        }
    }
    // if we can execute it on compile
    if (canExecute) {
        // arguments
        AviatorObject[] args = new AviatorObject[operandCount];
        int index = 0;
        for (int j = operandStartIndex; j < operatorIndex; j++) {
            token = this.tokenList.get(j);
            if (token.getType() == TokenType.Delegate) {
                this.tokenList.set(j, null);
                continue;
            }
            args[index++] = getAviatorObjectFromToken(token);
            // set argument token to null
            this.tokenList.set(j, null);
        }
        AviatorObject result = OperationRuntime.eval(getCompileEnv(), args, operatorType);
        // set result as token to tokenList for next executing
        this.tokenList.set(operatorIndex, getTokenFromOperand(operatorToken, result));
        return 1;
    }
    return 0;
}
Also used : AviatorObject(com.googlecode.aviator.runtime.type.AviatorObject) TokenType(com.googlecode.aviator.lexer.token.Token.TokenType) DelegateTokenType(com.googlecode.aviator.lexer.token.DelegateToken.DelegateTokenType)

Aggregations

DelegateTokenType (com.googlecode.aviator.lexer.token.DelegateToken.DelegateTokenType)1 TokenType (com.googlecode.aviator.lexer.token.Token.TokenType)1 AviatorObject (com.googlecode.aviator.runtime.type.AviatorObject)1