/******************************************************** *********以下是创建语法树所用的各类节点的申请*********** ********************************************************/ /********************************************************/ /* 函数名 newRootNode */ /* 功 能 创建语法树根节点函数 */ /* 说 明 该函数为语法树创建一个新的根结点 */ /* 并将语法树节点成员初始化 */ /********************************************************/ public static TreeNode NewRootNode() { TreeNode t = new TreeNode(); /* 指定新语法树节点t成员:结点类型nodekind为语句类型ProK */ t.NodeKind = NodeKind.proK; /* 指定新语法树节点t成员:源代码行号lineno为全局变量lineno */ t.LineNum = -1; t.LevelNum = 0; t.PositionInLevel = 1; /* 函数返回语法树根节点指针t */ return t; }
/// <summary> /// param -> type-specifier ID array /// </summary> private void process18() { elementStack.Push(new LL1StackElement(true, NonTerminalType.Array,18)); elementStack.Push(new LL1StackElement(true, NonTerminalType.ID2,18)); elementStack.Push(new LL1StackElement(true, NonTerminalType.TypeSpecifier,18)); //新建参数节点 TreeNode t = new TreeNode(NodeKind.paramK, currentToken.LineNumber, (TokenType)currentToken.TokenTypes, currentLevelNum, currentScope); OperateTreeStack(t); }
/// <summary> /// declaration -> fun-declaration /// </summary> private void Process6() { elementStack.Push(new LL1StackElement(true, NonTerminalType.FunDeclaration,6)); //建立函数声明节点 TreeNode t = new TreeNode(NodeKind.funK, currentToken.LineNumber, (TokenType)currentToken.TokenTypes, currentLevelNum, currentScope); // OperateTreeStack(t); }
/// <summary> /// declaration -> var-declaration /// </summary> private void Process5() { // elementStack.Push(new LL1StackElement(true, NonTerminalType.VarDeclaration,5)); //建立变量声明新节点 TreeNode t = new TreeNode(NodeKind.varK, currentToken.LineNumber, (TokenType)currentToken.TokenTypes, currentLevelNum, currentScope); // OperateTreeStack(t); }
/// <summary> /// 处理树栈。 /// </summary> /// <param name="t"></param> private void OperateTreeStack(TreeNode t) { //取出栈顶元素 TreeNode curTop = treeStack.Peek(); if (curTop.LevelNum == currentLevelNum)//同一层 { //同一层,兄弟节点 //指向兄弟节点 curTop.Sibling = t; treeStack.Pop(); //增加儿子节点 curTop = treeStack.Peek(); curTop.AddChild(t); //curtop. = t; //指向父亲节点 t.Father = curTop; treeStack.Push(t); } else if (curTop.LevelNum +1 == currentLevelNum) //当前元素是栈顶元素的下一层 { curTop.AddChild(t); //curtop. = t; //指向父亲节点 t.Father = curTop; treeStack.Push(t); } else if (curTop.LevelNum - 1 == currentLevelNum)//当前元素是栈顶元素的上一层 { //儿子出栈 treeStack.Pop(); //当前节点的兄弟节点 curTop = treeStack.Peek(); //指向兄弟节点 curTop.Sibling = t; treeStack.Pop(); //增加儿子节点 curTop = treeStack.Peek(); curTop.AddChild(t); //curtop. = t; //指向父亲节点 t.Father = curTop; treeStack.Push(t); } }
/// <summary> /// 加孩子,从1开始编号 /// </summary> /// <param name="treenode"></param> public void AddChild(TreeNode treeNode) { ++ChildNum; Child[ChildNum] = treeNode; }