/// <summary> /// 返回一个根为“ +”或“ - ”二进制运算符的 AST 树 /// </summary> /// <returns></returns> private static AstNode GetAdditiveAstTree() { AstNode left, right; NodeType nodeType; //获取更高优先级的左子树 left = GetMultiplicativeAstTree(); //token,正常情况应为运算符+或-运算符或终止符 //如果扫描结束 if (token == null) return left; while (true) { //+或-运算符 nodeType = ConvertToNodeType(token.TokenType); //获取优先级更高的右子树,返回时可以明确是遇到了+或-运算符或终止符 right = GetMultiplicativeAstTree(); left = AstTree.MkAstNode(nodeType, left, right, 0); //token,正常情况应为运算符+或-运算符或终止符 //如果扫描结束 if (token == null) break; } return left; }
/// <summary> /// 返回AstTree /// </summary> /// <param name="ptp">优先级</param> /// <returns></returns> public static AstNode GetAstTree(int ptp = 0) { AstNode left, right; NodeType nodeType; token = ExecScan(); Console.WriteLine($"节点类型:{token?.TokenType.ToString()},节点值:{token?.IntValue}"); //第一个节点为左节点 left = GetAstLeafNode(token); token = ExecScan(); Console.WriteLine($"节点类型:{token?.TokenType.ToString()},节点值:{token?.IntValue}"); //如果扫描结束 if (token == null) { return(left); } //运算符节点类型 nodeType = ConvertToNodeType(token.TokenType); while (PrecedenceDic[nodeType] > ptp) { //优先级高的构建为右子树,遇到低优先级的运算符返回 right = GetAstTree(PrecedenceDic[nodeType]); //合并子树 left = AstTree.MkAstNode(nodeType, left, right, 0); //如果扫描结束 if (token == null) { break; } //更新当前令牌的详细信息,即低优先级令牌 nodeType = ConvertToNodeType(token.TokenType); Console.WriteLine($"低优先级令牌:{PrecedenceDic[nodeType]}"); } return(left); }
/// <summary> /// 返回一个根为“ * ”或“ / ”二进制运算符的 AST 树 /// </summary> /// <returns></returns> private static AstNode GetMultiplicativeAstTree() { AstNode left, right; NodeType nodeType; token = ExecScan(); Console.WriteLine($"节点类型:{token?.TokenType.ToString()},节点值:{token?.IntValue}"); //第一个节点为左节点 left = GetAstLeafNode(token); //获取下一个token,正常情况应为运算符 token = ExecScan(); Console.WriteLine($"节点类型:{token?.TokenType.ToString()},节点值:{token?.IntValue}"); //如果扫描结束 if (token == null) return left; // 当token类型是*或/ while (token.TokenType == TokenType.STAR || token.TokenType == TokenType.SLASH) { nodeType = ConvertToNodeType(token.TokenType); //获取下一个token token = ExecScan(); Console.WriteLine($"节点类型:{token?.TokenType.ToString()},节点值:{token?.IntValue}"); right = GetAstLeafNode(token); //合并左右节点 left = AstTree.MkAstNode(nodeType, left, right, 0); //获取下一节点 token = ExecScan(); Console.WriteLine($"节点类型:{token?.TokenType.ToString()},节点值:{token?.IntValue}"); //如果扫描结束 if (token == null) break; } return left; }