public void Visit(EqualCondition equalCond) { int operandCntr = 1; equalCond.Operands[0].Accept(this); foreach (string oper in equalCond.Operators) { equalCond.Operands[operandCntr++].Accept(this); dynamic rightOper = Environment.PopFromTheStack(); dynamic leftOper = Environment.PopFromTheStack(); if (rightOper.GetType() != leftOper.GetType()) { throw new ExecutorException("Cannot perform relational condition on operands different than double"); } else if (leftOper is TurtleItem || leftOper is TurtleItem) { throw new ExecutorException("Cannot perform an arithmetic operation on operands of type Turtle"); } dynamic result = oper switch { "==" => leftOper == rightOper ? true : false, "!=" => leftOper == rightOper ? false : true, _ => null, }; Environment.PushToTheStack(result); } }
private EqualCondition parseCondition() { RelationalCondition firstOperand = parseRelationalCondition(); if (firstOperand != null) { EqualCondition equalCondition = new EqualCondition(); equalCondition.Operands.Add(firstOperand); while (lexer.Token is EqualToken || lexer.Token is NotEqualToken) { switch (lexer.Token) { case EqualToken _: equalCondition.Operators.Add(EqualToken.Text); break; case NotEqualToken _: equalCondition.Operators.Add(NotEqualToken.Text); break; } lexer.NextToken(); equalCondition.Operands.Add(parseRelationalCondition()); } return(equalCondition); } else { return(null); } }
private INode parseIf() { if (lexer.Token is IfToken) { lexer.NextToken(); accept(typeof(LRoundBracketToken)); EqualCondition condition = parseCondition() ?? throw new ParserException("Expected condition in " + lexer.Token.Position); accept(typeof(RRoundBracketToken)); BlockStatement body = parseBlockStatement(); if (lexer.Token is ElseToken) { lexer.NextToken(); BlockStatement elseBody = parseBlockStatement(); return(new IfStatement(condition, body, elseBody)); } return(new IfStatement(condition, body, new BlockStatement())); } else { return(null); } }
public void Visit(EqualCondition equalCond) { int operandCntr = 1; equalCond.Operands[0].Accept(this); foreach (string oper in equalCond.Operators) { switch (oper) { case "==": Console.Write("=="); break; case "!=": Console.Write("!="); break; } equalCond.Operands[operandCntr++].Accept(this); } }