/// EXPONENT: FACTORIAL_FACTOR [ '^' EXPONENT ]* Exponents private bool TryParseExponent(out ASTNode node) { if (TryParseFactorialFactor(out node)) { if (IsNext(Token.TokenType.Exponent)) { var op = Accept(); if (TryParseExponent(out var rhs)) { node = new ExponentBinaryOperatorASTNode(op, node, rhs); } } } return(node != null); }
/// EXPONENT: FACTORIAL_FACTOR [ '^' EXPONENT ]* Exponents private ASTNode ParseExponent( ) { var node = ParseFactorialFactor(); if (IsNext(Token.TokenType.Exponent)) { //magic goes here var op = Accept(); //accept the exponent operator //example 2^3^2 // left_node(2) // right_node( exponent_node( left_node(3), right_node(2) ) ); // ^ // 2 ^ // 3 2 node = new ExponentBinaryOperatorASTNode(op, node, ParseExponent( )); //recursive call for Exponent } return(node); }
protected double Evaluate(ExponentBinaryOperatorASTNode node) => Math.Pow(Evaluate(node.Left as dynamic), Evaluate(node.Right as dynamic));