//init public Runner(List <Dictionary <HeadOfRule, List <string> > > _rules, List <ColumnOfReestr> registry) //правила берем из slr, они там уже есть. { rules = _rules; _registry = registry; _astTree = new AstTree(); _table = new IdTable.IdTable(); }
/// <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); }
/// <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()}"); } }
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)); }
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)); }
/// <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); }
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)); }
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)); }
/// <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; }