private MultExpression parseMultExpression() { INode firstOperand = parseParamExpression(); if (firstOperand != null) { MultExpression node = new MultExpression(); node.Operands.Add(firstOperand); while (lexer.Token is AsteriskToken || lexer.Token is SlashToken) { switch (lexer.Token) { case AsteriskToken _: node.Operators.Add(AsteriskToken.Text); break; case SlashToken _: node.Operators.Add(SlashToken.Text); break; } lexer.NextToken(); node.Operands.Add(parseParamExpression()); } return(node); } else { return(null); } }
private AddExpression parseExpression() { MultExpression firstOperand = parseMultExpression(); if (firstOperand != null) { AddExpression node = new AddExpression(); node.Operands.Add(firstOperand); while (lexer.Token is PlusToken || lexer.Token is MinusToken) { switch (lexer.Token) { case PlusToken _: node.Operators.Add(PlusToken.Text); break; case MinusToken _: node.Operators.Add(MinusToken.Text); break; } lexer.NextToken(); node.Operands.Add(parseMultExpression()); } return(node); } else { return(null); } }
public void Visit(MultExpression multExpr) { int operandCntr = 1; multExpr.Operands[0].Accept(this); foreach (string oper in multExpr.Operators) { multExpr.Operands[operandCntr++].Accept(this); dynamic rightOper = Environment.PopFromTheStack(); dynamic leftOper = Environment.PopFromTheStack(); if (rightOper.GetType() != leftOper.GetType()) { throw new ExecutorException("Cannot perform an arithmetic operation on operands of different types"); } else if (leftOper is TurtleItem || leftOper is TurtleItem) { throw new ExecutorException("Cannot perform an arithmetic operation on operands of type Turtle"); } else if (rightOper is double && rightOper == 0) { throw new ExecutorException("Dividing by 0"); } else if (!(rightOper is double) && !(leftOper is double)) { throw new ExecutorException("Cannot apply multiplication operator on types different than num"); } dynamic result = oper switch { "*" => leftOper * rightOper, "/" => leftOper / rightOper, _ => throw new ExecutorException($"Unknown multiplicative operator {oper}") }; Environment.PushToTheStack(result); } }
public void Visit(MultExpression multExpr) { int operandCntr = 1; multExpr.Operands[0].Accept(this); foreach (string oper in multExpr.Operators) { switch (oper) { case "*": Console.Write("*"); break; case "/": Console.Write("/"); break; } multExpr.Operands[operandCntr++].Accept(this); } }