Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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;
        }