Beispiel #1
0
        /********************************************************
         *********以下是创建语法树所用的各类节点的申请***********
         ********************************************************/

        /********************************************************/
        /* 函数名 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;

        }
Beispiel #2
0
 /// <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);
 }
Beispiel #3
0
 /// <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);
 }
Beispiel #4
0
 /// <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);
 }
Beispiel #5
0
 /// <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);
      }
  }
Beispiel #6
0
 /// <summary>
 /// 加孩子,从1开始编号
 /// </summary>
 /// <param name="treenode"></param>
 public void AddChild(TreeNode treeNode)
 {
     ++ChildNum;
     Child[ChildNum] = treeNode;
 }