コード例 #1
0
 //init
 public Runner(List <Dictionary <HeadOfRule, List <string> > > _rules, List <ColumnOfReestr> registry) //правила берем из slr, они там уже есть.
 {
     rules     = _rules;
     _registry = registry;
     _astTree  = new AstTree();
     _table    = new IdTable.IdTable();
 }
コード例 #2
0
ファイル: Expr1.cs プロジェクト: swindyDeer/snowc
        /// <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;
        }
        public INode New(dynamic node)
        {
            Left     = AstTree.Factory(node.Left);
            Right    = AstTree.Factory(node.Right);
            Operator = node.Operator;

            return(this);
        }
コード例 #4
0
ファイル: Expr2.cs プロジェクト: swindyDeer/snowc
        /// <summary>
        /// 获取ast叶节点
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        private static AstNode GetAstLeafNode(Token token)
        {
            switch (token.TokenType)
            {
            //对于INTLIT令牌,为其创建叶节点
            //并扫描下一个令牌。否则,对于任何其他令牌类型输出语法错误
            case TokenType.INTLIT:
                var node = AstTree.MkAstLeafNode(NodeType.INTLIT, token.IntValue);
                return(node);

            default:
                throw new Exception($"token类型不是整数:{token.TokenType.ToString()}");
            }
        }
コード例 #5
0
        public void TestThatLexerGenerateRightTreeFromOneSymbolAndCheckSuccessedWithEmptyString()
        {
            // Arrange

            var symbol     = 'a';
            var stream     = new MemoryStream().FromString($"\'{symbol}\'{this.Symbol}");
            var testStream = new MemoryStream().FromString($"");
            var lexer      = this.Lexer;

            // Act

            var tree = new AstTree(lexer.Parse(stream));

            // Assert

            Assert.IsFalse(tree.Check(testStream));
        }
コード例 #6
0
        public void TestThatLexerGenerateRightTreeFromOneSymbolAndCheckFiledBecauseOfManySymbols()
        {
            // Arrange

            var symbol     = 'a';
            var stream     = new MemoryStream().FromString($"\'{symbol}\'");
            var testStream = new MemoryStream().FromString($"{symbol}{symbol}");
            var lexer      = this.Lexer;

            // Act

            var tree = new AstTree(lexer.Parse(stream));

            // Assert

            Assert.IsFalse(tree.Check(testStream));
        }
コード例 #7
0
ファイル: Expr2.cs プロジェクト: swindyDeer/snowc
        /// <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);
        }
コード例 #8
0
        public void TestThatLexerGenerateSuccessTreeForManyRulesAndSchekeFailed()
        {
            // Arrange
            var str = new List <char> {
                's', 'a', 's', 'h', 'e', 'c', 'h', 'k', 'a'
            };
            var mapped     = string.Join(string.Empty, str.Select(x => $"\'{x}\'"));
            var stream     = new MemoryStream().FromString(mapped);
            var testStream = new MemoryStream().FromString("sshechka");
            var lexer      = this.Lexer;

            // Act

            var tree = new AstTree(lexer.Parse(stream));

            // Assert

            Assert.IsFalse(tree.Check(testStream));
        }
コード例 #9
0
        public void TestThatLexerGenerateRightTreeFromSeveralSymbolsAndCheckSuccessedWithManySymbol()
        {
            // Arrange

            var str = new List <char> {
                'a', 'b', 'c', 'd'
            };
            var mapped     = string.Join(string.Empty, str.Select(x => $"\'{x}\'{this.Symbol}"));
            var stream     = new MemoryStream().FromString(mapped);
            var testStream = new MemoryStream().FromString(string.Join(string.Empty, str.Select(x => $"{x}{x}{x}{x}{x}{x}{x}{x}{x}{x}")));
            var lexer      = this.Lexer;

            // Act

            var tree = new AstTree(lexer.Parse(stream));

            // Assert

            Assert.IsTrue(tree.Check(testStream));
        }
コード例 #10
0
ファイル: Expr1.cs プロジェクト: swindyDeer/snowc
        /// <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;
        }