package de.skuzzle.polly.core.parser.ast.lang.operators; import de.skuzzle.polly.core.parser.Position; import de.skuzzle.polly.core.parser.ast.declarations.Namespace; import de.skuzzle.polly.core.parser.ast.declarations.types.Type; import de.skuzzle.polly.core.parser.ast.declarations.types.TypeVar; import de.skuzzle.polly.core.parser.ast.expressions.literals.ListLiteral; import de.skuzzle.polly.core.parser.ast.expressions.literals.Literal; import de.skuzzle.polly.core.parser.ast.expressions.literals.NumberLiteral; import de.skuzzle.polly.core.parser.ast.lang.BinaryOperator; import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException; import de.skuzzle.polly.core.parser.ast.visitor.ExecutionVisitor; import de.skuzzle.polly.core.parser.problems.Problems; import de.skuzzle.polly.tools.collections.Stack; public class ListIndex extends BinaryOperator<ListLiteral, NumberLiteral> { public ListIndex(OpType id) { super(id); final TypeVar a = Type.newTypeVar("A"); this.initTypes(a, a.listOf(), Type.NUM); } @Override protected void exec(Stack<Literal> stack, Namespace ns, ListLiteral left, NumberLiteral right, Position resultPos, ExecutionVisitor execVisitor) throws ASTTraversalException { switch (this.getOp()) { case INDEX: final int index = right.isInteger(execVisitor.getReporter()); if (index < 0 || index >= left.getContent().size()) { // TODO: report problem execVisitor.getReporter().runtimeProblem(Problems.INDEX_OUT_OF_BOUNDS, resultPos, index); } stack.push((Literal) left.getContent().get(index)); break; default: this.invalidOperatorType(this.getOp()); } } }