@Override public LLNode<Token> compile(LLNode<Token> currentToken) throws Exception { // ( x + 3 ) currentToken = currentToken.getNext(); // voorbij haakje Token leftToken = currentToken.getValue(); String leftName = leftToken.getValue(); currentToken = currentToken.getNext(); Token operatorToken = currentToken.getValue(); currentToken = currentToken.getNext(); Token rightToken = currentToken.getValue(); String rightName = rightToken.getValue(); if (leftToken.getType() != Token.Soort.IDENTIFIER) { leftName = getNextUniqueId(); compiled.insertLast(new DirectFunctionCall("ConstantToReturn", leftToken.getValue())); compiled.insertLast(new DirectFunctionCall("ReturnToVariable", leftName)); } if (rightToken.getType() != Token.Soort.IDENTIFIER) { rightName = getNextUniqueId(); compiled.insertLast(new DirectFunctionCall("ConstantToReturn", rightToken.getValue())); compiled.insertLast(new DirectFunctionCall("ReturnToVariable", rightName)); } switch (operatorToken.getType()) { case PLUS: compiled.insertLast(new FunctionCall("Add", new String[] {leftName, rightName})); break; case MINUS: compiled.insertLast(new FunctionCall("Subtract", new String[] {leftName, rightName})); break; case MULTIPLY: compiled.insertLast(new FunctionCall("Multiply", new String[] {leftName, rightName})); break; case DIVIDE: compiled.insertLast(new FunctionCall("Divide", new String[] {leftName, rightName})); break; default: break; } currentToken = currentToken.getNext(); if (currentToken.getValue().getType() != Token.Soort.ELLIPSIS_CLOSE) { throw new Exception(); } return currentToken.getNext(); }
@Override public boolean isMatch(LLNode<Token> token) { return token.getValue().getType() == Token.Soort.ELLIPSIS_OPEN; }