public override object Visit(BinaryOperationAstNode node) { var leftVal = (dynamic)node.Left.Accept(this); var rightVal = (dynamic)node.Right.Accept(this); switch (node.Operation.Type) { // Relop case TokenType.EQ: return(leftVal == rightVal); case TokenType.NEQ: return(leftVal != rightVal); case TokenType.GT: return(leftVal > rightVal); case TokenType.LT: return(leftVal < rightVal); case TokenType.GTE: return(leftVal >= rightVal); case TokenType.LTE: return(leftVal <= rightVal); // Addop case TokenType.OR: return((bool)leftVal || (bool)rightVal); case TokenType.PLUS: return(leftVal + rightVal); case TokenType.MINUS: return(leftVal - rightVal); // Mulop case TokenType.AND: return((bool)leftVal && (bool)rightVal); case TokenType.MUL: return(leftVal * rightVal); case TokenType.DIV: return(leftVal / rightVal); } throw Error(node); }
/// <summary> /// simple_expression : term /// | term addop term /// </summary> private AstNode ParseSimpleExpression() { var node = ParseTerm(); EatWhiteSpace(); while (AddOp.Contains(CurrentToken.Type)) { var token = CurrentToken; Eat(CurrentToken.Type); EatWhiteSpace(); node = new BinaryOperationAstNode(token, node, ParseTerm()); } return(node); }
/// <summary> /// term : factor (mulop factor)* /// </summary> private AstNode ParseTerm() { // First parse the initial factor var node = ParseFactor(); EatWhiteSpace(); while (MulOp.Contains(CurrentToken.Type)) { var token = CurrentToken; Eat(token.Type); // Eat further whitespace EatWhiteSpace(); node = new BinaryOperationAstNode(token, node, ParseFactor()); } return(node); }
public virtual object Visit(BinaryOperationAstNode node) { return(null); }