static Expression ParseAdditiveExpression(Lexer lexer) { var rp = lexer.CreateRestorePoint(); var left = ParseMultiplicativeExpression(lexer); if (left == null) { return null; } var type = lexer.CurrentToken.Type; switch (type) { case TokenType.Plus: case TokenType.Dash: break; default: return left; } if (!lexer.Next()) { rp(); return null; } var right = ParseAdditiveExpression(lexer); if (right == null) { rp(); return null; } BinaryExpression result; switch (type) { case TokenType.Plus: result = new BinaryExpression(left, right, BinaryOperator.Addition); break; case TokenType.Dash: result = new BinaryExpression(left, right, BinaryOperator.Subtraction); break; default: result = null; break; } return result; }
public void Visit(BinaryExpression e) { var result = (Number)0m; var right = _results.Pop(); var left = _results.Pop(); switch (e.Operator) { case BinaryOperator.Addition: result = left + right; break; case BinaryOperator.Subtraction: result = left - right; break; case BinaryOperator.Multiplication: result = left * right; break; case BinaryOperator.Division: result = left / right; break; } _results.Push(result); }