Beispiel #1
0
 /*
  *      public int[] layercal(Node n)
  *      {
  *          //用数组k[]来记录每层的节点个数并算出每个节点在该层的位置
  *          int[] k = new int[n.layerheight + 1];
  *          k[0] = 1;
  *          //初始化k[]
  *          for (int m = 1; m < n.layerheight + 1; m++)
  *          {
  *              k[m] = 0;
  *          }
  *          Queue<Node> queue = new Queue<Node>(200);
  *          queue.Enqueue(n);
  *          //广度遍历树
  *          while (queue.Count != 0)
  *          {
  *              Node tmp1 = queue.Dequeue();
  *              if (tmp1.hasChild())
  *              {
  *                  for (int i = 0; i < tmp1.getChilds().Count; i++)
  *                  {
  *                      //该层节点数加1
  *                      k[tmp1.getChilds()[i].layer]++;
  *                      //每个节点在该层的位置
  *                      tmp1.getChilds()[i].layercount = k[tmp1.getChilds()[i].layer];
  *                      queue.Enqueue(tmp1.getChilds()[i]);
  *                  }
  *              }
  *          }
  *          return k;
  *      }
  *
  *      //等分画树
  *      public void drawTreeDivide(Node n, Graphics g)
  *      {
  *          int[] k = layercal(tree);
  *
  *          //------------画树
  *          if (n.hasChild())
  *          {
  *              int size = n.getChilds().Count;
  *              for (int i = 0; i < size; i++)
  *              {
  *                  //获得每层的间隔
  *                  int x = this.Width / (k[n.getChilds()[i].layer] + 1);
  *                  int y = this.Height / (tree.layerheight + 1) * (n.getChilds()[i].layer);
  *                  n.getChilds()[i].positionX = x * n.getChilds()[i].layercount;
  *                  n.getChilds()[i].positionY = y;
  *                  g.DrawString(Convert.ToString(n.getChilds()[i].layer),
  *                  new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(0, y));
  *                  g.DrawString(n.getChilds()[i].type,
  *                  new Font("Arial", 12), System.Drawing.Brushes.Purple, new Point(x * n.getChilds()[i].layercount, y - 10));
  *                  drawTreeDivide(n.getChilds()[i], g);
  *                  g.DrawLine(Pens.Blue, new Point(n.positionX, n.positionY), new Point(x * n.getChilds()[i].layercount, y));
  *
  *              }
  *
  *          }
  *      }
  */
 //先计算叶子节点个数
 public void drawLeafFirstCal(ref int totalleafcount, Node n, Graphics g)
 {
     if (n.hasChild())
     {
         int size = n.getChilds().Count;
         for (int i = 0; i < size; i++)
         {
             drawLeafFirstCal(ref totalleafcount, n.getChilds()[i], g);
         }
     }
     else
     {
         totalleafcount++;
         n.leafcount = totalleafcount;
     }
 }
Beispiel #2
0
 public void drawLeafFirstLocation(int totalleafcount, Node n, Graphics g)
 {
     if (n.hasChild())
     {
         int ntotalX = 0;
         int size    = n.getChilds().Count;
         for (int i = 0; i < size; i++)
         {
             drawLeafFirstLocation(totalleafcount, n.getChilds()[i], g);
             ntotalX = ntotalX + n.getChilds()[i].positionX;
         }
         n.positionX = ntotalX / n.getChilds().Count;
         n.positionY = this.Height / (tree.layerheight + 1) * n.layer;
     }
     else
     {
         n.positionX = this.Width / (totalleafcount + 1) * n.leafcount;
         n.positionY = this.Height / (tree.layerheight + 1) * n.layer;
     }
 }
Beispiel #3
0
        //先画叶子节点的方法画树
        public void drawLeafFirst(Node n, Graphics g)
        {
            if (n.hasChild())
            {
                int size = n.getChilds().Count;
                for (int i = 0; i < size; i++)
                {
                    int m = judge(n.getChilds()[i], treestack);
                    if (m == 1)
                    {
                        drawLeafFirst(n.getChilds()[i], g);
                        //行号
                        g.DrawString(Convert.ToString(n.getChilds()[i].layer),
                                     new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(0, n.getChilds()[i].positionY));
                        //字符串
                        g.DrawString(n.getChilds()[i].name + "," + n.getChilds()[i].type + "," + n.getChilds()[i].value,
                                     new Font("Arial", 12), System.Drawing.Brushes.Purple, new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY - 10));
                        //线
                        g.DrawLine(Pens.Blue, new Point(n.positionX, n.positionY), new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY));
                    }
                    else
                    {
                        drawLeafFirst(n.getChilds()[i], g);
                        //行号
                        g.DrawString(Convert.ToString(n.getChilds()[i].layer),
                                     new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(0, n.getChilds()[i].positionY));
                        //字符串

                        /*       g.DrawString(n.getChilds()[i].symbolname + "," + n.getChilds()[i].symboltype + "," + n.getChilds()[i].symbolvalue,// + "," + n.getChilds()[i].lineNo + "," + n.getChilds()[i].columnNo + "," + n.getChilds()[i].symboltype,
                         *       new Font("Arial", 12), System.Drawing.Brushes.Green, new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY - 10));*/
                        //线
                        g.DrawLine(Pens.Orange, new Point(n.positionX, n.positionY), new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY));
                    }
                }
            }
        }
Beispiel #4
0
        //先画叶子节点的方法画树
        public void drawLeafFirst(Node n, Graphics g)
        {
            if (n.hasChild())
            {
                int size = n.getChilds().Count;
                for (int i = 0; i < size; i++)
                {
                    int m = judge(n.getChilds()[i], treestack);
                    if (m == 1)
                    {
                        drawLeafFirst(n.getChilds()[i], g);
                        //行号
                        g.DrawString(Convert.ToString(n.getChilds()[i].layer),
                        new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(0, n.getChilds()[i].positionY));
                        //字符串
                        g.DrawString(n.getChilds()[i].name + "," + n.getChilds()[i].type + "," + n.getChilds()[i].value,
                        new Font("Arial", 12), System.Drawing.Brushes.Purple, new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY - 10));
                        //线
                        g.DrawLine(Pens.Blue, new Point(n.positionX, n.positionY), new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY));
                    }
                    else
                    {
                        drawLeafFirst(n.getChilds()[i], g);
                        //行号
                        g.DrawString(Convert.ToString(n.getChilds()[i].layer),
                        new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(0, n.getChilds()[i].positionY));
                        //字符串
                 /*       g.DrawString(n.getChilds()[i].symbolname + "," + n.getChilds()[i].symboltype + "," + n.getChilds()[i].symbolvalue,// + "," + n.getChilds()[i].lineNo + "," + n.getChilds()[i].columnNo + "," + n.getChilds()[i].symboltype,
                          new Font("Arial", 12), System.Drawing.Brushes.Green, new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY - 10));*/
                        //线
                        g.DrawLine(Pens.Orange, new Point(n.positionX, n.positionY), new Point(n.getChilds()[i].positionX, n.getChilds()[i].positionY));
                    }

                }
            }
        }
Beispiel #5
0
 public void drawLeafFirstLocation(int totalleafcount, Node n, Graphics g)
 {
     if (n.hasChild())
     {
         int ntotalX = 0;
         int size = n.getChilds().Count;
         for (int i = 0; i < size; i++)
         {
             drawLeafFirstLocation(totalleafcount, n.getChilds()[i], g);
             ntotalX = ntotalX + n.getChilds()[i].positionX;
         }
         n.positionX = ntotalX / n.getChilds().Count;
         n.positionY = this.Height / (tree.layerheight + 1) * n.layer;
     }
     else
     {
         n.positionX = this.Width / (totalleafcount + 1) * n.leafcount;
         n.positionY = this.Height / (tree.layerheight + 1) * n.layer;
     }
 }
Beispiel #6
0
        /*
                public int[] layercal(Node n)
                {
                    //用数组k[]来记录每层的节点个数并算出每个节点在该层的位置
                    int[] k = new int[n.layerheight + 1];
                    k[0] = 1;
                    //初始化k[]
                    for (int m = 1; m < n.layerheight + 1; m++)
                    {
                        k[m] = 0;
                    }
                    Queue<Node> queue = new Queue<Node>(200);
                    queue.Enqueue(n);
                    //广度遍历树
                    while (queue.Count != 0)
                    {
                        Node tmp1 = queue.Dequeue();
                        if (tmp1.hasChild())
                        {
                            for (int i = 0; i < tmp1.getChilds().Count; i++)
                            {
                                //该层节点数加1
                                k[tmp1.getChilds()[i].layer]++;
                                //每个节点在该层的位置
                                tmp1.getChilds()[i].layercount = k[tmp1.getChilds()[i].layer];
                                queue.Enqueue(tmp1.getChilds()[i]);
                            }
                        }
                    }
                    return k;
                }

                //等分画树
                public void drawTreeDivide(Node n, Graphics g)
                {
                    int[] k = layercal(tree);

                    //------------画树
                    if (n.hasChild())
                    {
                        int size = n.getChilds().Count;
                        for (int i = 0; i < size; i++)
                        {
                            //获得每层的间隔
                            int x = this.Width / (k[n.getChilds()[i].layer] + 1);
                            int y = this.Height / (tree.layerheight + 1) * (n.getChilds()[i].layer);
                            n.getChilds()[i].positionX = x * n.getChilds()[i].layercount;
                            n.getChilds()[i].positionY = y;
                            g.DrawString(Convert.ToString(n.getChilds()[i].layer),
                            new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(0, y));
                            g.DrawString(n.getChilds()[i].type,
                            new Font("Arial", 12), System.Drawing.Brushes.Purple, new Point(x * n.getChilds()[i].layercount, y - 10));
                            drawTreeDivide(n.getChilds()[i], g);
                            g.DrawLine(Pens.Blue, new Point(n.positionX, n.positionY), new Point(x * n.getChilds()[i].layercount, y));

                        }

                    }
                }
        */
        //先计算叶子节点个数
        public void drawLeafFirstCal(ref int totalleafcount, Node n, Graphics g)
        {
            if (n.hasChild())
            {
                int size = n.getChilds().Count;
                for (int i = 0; i < size; i++)
                {
                    drawLeafFirstCal(ref totalleafcount, n.getChilds()[i], g);
                }
            }
            else
            {
                totalleafcount++;
                n.leafcount = totalleafcount;
            }
        }
        public int threeaddresscount = 1;//三地址行标


        public void symboltable(Node n)
        {
            switch (n.type)
            {
                case "program":
                    symboltable(n.getChilds()[0]);
                    break;
                case "compoundstmt":
                    symboltable(n.getChilds()[1]);
                    break;
                case "stmts":
                    if (n.hasChild())
                    {
                        if (n.getChilds().Count == 2)
                        {
                            symboltable(n.getChilds()[0]);
                            symboltable(n.getChilds()[1]);
                        }
                        else if (n.getChilds().Count == 1)
                        {
                            symboltable(n.getChilds()[0]);
                        }
                    }
                    break;
                case "stmt":
                    symboltable(n.getChilds()[0]);
                    break;
                case "decl":
                    symboltable(n.getChilds()[0]);
                    n.symboltype = n.getChilds()[0].getChilds()[0].symboltype;
                    n.getChilds()[1].symboltype = n.symboltype;
                    symboltable(n.getChilds()[1]);
                    break;
                case "list":
                    if (n.getChilds().Count == 2)
                    {
                        n.getChilds()[0].symboltype = n.symboltype;
                        n.getChilds()[1].symboltype = n.symboltype;
                    }
                    else
                    {
                        n.getChilds()[0].symboltype = n.symboltype;
                    }
                    if (n.getChilds()[0].type == "ID")
                    {
                        bool redesign = false;//判断重复声明,重复为true
                        for (int m = 0; m < symbolTableCount; m++)
                        {
                            if (n.getChilds()[0].symbolname == symbolTableName[m])
                            {
                                redesign = true;
                                symbolTableType[m] = "重复声明";
                                symbolTableValue[m] = "";
                                symbolTableLineNo[m] = "";
                                symbolTableColumnNo[m] = "";
                            }
                        }
                        if (!redesign)
                        {
                            symbolTableName[symbolTableCount] = n.getChilds()[0].symbolname;
                            symbolTableType[symbolTableCount] = n.getChilds()[0].symboltype;
                            symbolTableValue[symbolTableCount] = "未赋值";
                            symbolTableLineNo[symbolTableCount] = n.getChilds()[0].lineNo;
                            symbolTableColumnNo[symbolTableCount] = n.getChilds()[0].columnNo;
                            symbolTableCount++;
                        }
                    }
                    symboltable(n.getChilds()[1]);
                    break;
                case "list1":
                    if (n.getChilds().Count == 2)
                    {
                        n.getChilds()[0].symboltype = n.symboltype;
                        n.getChilds()[1].symboltype = n.symboltype;
                        symboltable(n.getChilds()[1]);
                    }
                    else
                    {
                        n.getChilds()[0].symboltype = n.symboltype;
                        symboltable(n.getChilds()[0]);
                    }
                    if (n.getChilds()[0].type == "ID")
                    {
                        bool redesign = false;   //判断重复声明,重复为true
                        for (int m = 0; m < symbolTableCount; m++)
                        {
                            if (n.getChilds()[0].symbolname == symbolTableName[m])
                            {
                                redesign = true;
                                symbolTableType[m] = "重复声明";
                                symbolTableValue[m] = "";
                                symbolTableLineNo[m] = "";
                                symbolTableColumnNo[m] = "";
                            }
                        }
                        if (!redesign)
                        {
                            symbolTableName[symbolTableCount] = n.getChilds()[0].symbolname;
                            symbolTableType[symbolTableCount] = n.getChilds()[0].symboltype;
                            symbolTableValue[symbolTableCount] = "未赋值";
                            symbolTableLineNo[symbolTableCount] = n.getChilds()[0].lineNo;
                            symbolTableColumnNo[symbolTableCount] = n.getChilds()[0].columnNo;
                            symbolTableCount++;
                        }
                    }
                    break;
                case "assgstmt":
                    symboltable(n.getChilds()[2]);
                    n.getChilds()[0].symbolvalue = n.getChilds()[2].symbolvalue;
                    bool occur = false;
                    //判断是否为赋值但没声明
                    for (int m = 0; m < symbolTableCount; m++)
                    {
                        if (n.getChilds()[0].symbolname == symbolTableName[m])
                            occur = true;
                    }
                    if (!occur)
                    {
                        symbolTableName[symbolTableCount] = n.getChilds()[0].symbolname;
                        symbolTableType[symbolTableCount] = "未声明";
                        symbolTableValue[symbolTableCount] = "";
                        symbolTableLineNo[symbolTableCount] = "";
                        symbolTableColumnNo[symbolTableCount] = "";
                        symbolTableCount++;
                    }
                    else
                    {
                        //判断赋值类型是否一致
                        bool judge = false;//判断是否值为小数,小数为true
                        for (int l = 0; l < n.getChilds()[0].symbolvalue.Length; l++)
                            if (n.getChilds()[0].symbolvalue[l] == '.')
                                judge = true;
                        if (n.getChilds()[2].symboltype == "real")
                            judge = true;
                        if (judge)
                        {
                            for (int m = 0; m < symbolTableCount; m++)
                            {
                                if (n.getChilds()[0].symbolname == symbolTableName[m] && symbolTableType[m] == "int")
                                {
                                    symbolTableType[m] = "类型不匹配";
                                    symbolTableValue[m] = "";
                                    symbolTableLineNo[m] = "";
                                    symbolTableColumnNo[m] = "";
                                }
                                if (n.getChilds()[0].symbolname == symbolTableName[m] && symbolTableType[m] == "real")
                                {
                                    symbolTableValue[m] = n.getChilds()[0].symbolvalue;
                                }
                            }
                        }
                        else
                        {
                            for (int m = 0; m < symbolTableCount; m++)
                            {
                                if (n.getChilds()[0].symbolname == symbolTableName[m])
                                {
                                    symbolTableValue[m] = n.getChilds()[0].symbolvalue;
                                }
                            }
                        }
                    }
                    break;
                case "arithexpr":
                    //对直接赋值和运算赋值分别讨论
                    symboltable(n.getChilds()[0]);
                    symboltable(n.getChilds()[1]);
                    if (n.hasChild())
                    {
                        if (n.getChilds()[1].getChilds().Count == 1)
                        {
                            n.symboltype = n.getChilds()[0].symboltype;
                            n.symbolvalue = n.getChilds()[0].symbolvalue;
                        }
                        else if (n.getChilds()[1].getChilds().Count == 3)
                        {
                            bool occurleft=false;
                            bool occurright=false;
                            for (int m = 0; m < symbolTableCount; m++)
                            {
                                if (n.getChilds()[0].symbolname == symbolTableName[m])
                              {
                                  n.getChilds()[0].symboltype = symbolTableType[m];
                                  occurleft=true;
                              }
                                if (n.getChilds()[1].symbolname == symbolTableName[m])
                              {
                                  n.getChilds()[1].symboltype = symbolTableType[m];
                                  occurright=true;
                              }
                            }
                            if( occurleft&&occurright)
                            {
                                if (n.getChilds()[0].symboltype == "int" && n.getChilds()[1].symboltype == "int")
                                    n.symboltype = "int";
                                if (n.getChilds()[0].symboltype == "int" && n.getChilds()[1].symboltype == "real")
                                    n.symboltype = "real";
                                if (n.getChilds()[0].symboltype == "real" && n.getChilds()[1].symboltype == "int")
                                    n.symboltype = "real";
                                if (n.getChilds()[0].symboltype == "real" && n.getChilds()[1].symboltype == "real")
                                    n.symboltype = "real";
                            }
                        }
                    }
                    break;
                case "multexpr":
                    symboltable(n.getChilds()[0]);
                    n.symbolname = n.getChilds()[0].symbolname;
                    n.symboltype = n.getChilds()[0].symboltype;
                    n.symbolvalue = n.getChilds()[0].symbolvalue;
                    break;
                case "simpleexpr":
                    symboltable(n.getChilds()[0]);
                    n.symbolname = n.getChilds()[0].symbolname;
                    n.symboltype = n.getChilds()[0].symboltype;
                    n.symbolvalue = n.getChilds()[0].symbolvalue;
                    break;
                case "arithexprprime":
                    if (n.getChilds().Count == 3)
                    {
                        symboltable(n.getChilds()[1]);
                        symboltable(n.getChilds()[2]);
                        n.symbolname = n.getChilds()[1].symbolname;
                    }
                    break;

                default:
                    break;
            }
        }
        public int threeaddresscount = 1;                      //三地址行标


        public void symboltable(Node n)
        {
            switch (n.type)
            {
            case "program":
                symboltable(n.getChilds()[0]);
                break;

            case "compoundstmt":
                symboltable(n.getChilds()[1]);
                break;

            case "stmts":
                if (n.hasChild())
                {
                    if (n.getChilds().Count == 2)
                    {
                        symboltable(n.getChilds()[0]);
                        symboltable(n.getChilds()[1]);
                    }
                    else if (n.getChilds().Count == 1)
                    {
                        symboltable(n.getChilds()[0]);
                    }
                }
                break;

            case "stmt":
                symboltable(n.getChilds()[0]);
                break;

            case "decl":
                symboltable(n.getChilds()[0]);
                n.symboltype = n.getChilds()[0].getChilds()[0].symboltype;
                n.getChilds()[1].symboltype = n.symboltype;
                symboltable(n.getChilds()[1]);
                break;

            case "list":
                if (n.getChilds().Count == 2)
                {
                    n.getChilds()[0].symboltype = n.symboltype;
                    n.getChilds()[1].symboltype = n.symboltype;
                }
                else
                {
                    n.getChilds()[0].symboltype = n.symboltype;
                }
                if (n.getChilds()[0].type == "ID")
                {
                    bool redesign = false;    //判断重复声明,重复为true
                    for (int m = 0; m < symbolTableCount; m++)
                    {
                        if (n.getChilds()[0].symbolname == symbolTableName[m])
                        {
                            redesign               = true;
                            symbolTableType[m]     = "重复声明";
                            symbolTableValue[m]    = "";
                            symbolTableLineNo[m]   = "";
                            symbolTableColumnNo[m] = "";
                        }
                    }
                    if (!redesign)
                    {
                        symbolTableName[symbolTableCount]     = n.getChilds()[0].symbolname;
                        symbolTableType[symbolTableCount]     = n.getChilds()[0].symboltype;
                        symbolTableValue[symbolTableCount]    = "未赋值";
                        symbolTableLineNo[symbolTableCount]   = n.getChilds()[0].lineNo;
                        symbolTableColumnNo[symbolTableCount] = n.getChilds()[0].columnNo;
                        symbolTableCount++;
                    }
                }
                symboltable(n.getChilds()[1]);
                break;

            case "list1":
                if (n.getChilds().Count == 2)
                {
                    n.getChilds()[0].symboltype = n.symboltype;
                    n.getChilds()[1].symboltype = n.symboltype;
                    symboltable(n.getChilds()[1]);
                }
                else
                {
                    n.getChilds()[0].symboltype = n.symboltype;
                    symboltable(n.getChilds()[0]);
                }
                if (n.getChilds()[0].type == "ID")
                {
                    bool redesign = false;       //判断重复声明,重复为true
                    for (int m = 0; m < symbolTableCount; m++)
                    {
                        if (n.getChilds()[0].symbolname == symbolTableName[m])
                        {
                            redesign               = true;
                            symbolTableType[m]     = "重复声明";
                            symbolTableValue[m]    = "";
                            symbolTableLineNo[m]   = "";
                            symbolTableColumnNo[m] = "";
                        }
                    }
                    if (!redesign)
                    {
                        symbolTableName[symbolTableCount]     = n.getChilds()[0].symbolname;
                        symbolTableType[symbolTableCount]     = n.getChilds()[0].symboltype;
                        symbolTableValue[symbolTableCount]    = "未赋值";
                        symbolTableLineNo[symbolTableCount]   = n.getChilds()[0].lineNo;
                        symbolTableColumnNo[symbolTableCount] = n.getChilds()[0].columnNo;
                        symbolTableCount++;
                    }
                }
                break;

            case "assgstmt":
                symboltable(n.getChilds()[2]);
                n.getChilds()[0].symbolvalue = n.getChilds()[2].symbolvalue;
                bool occur = false;
                //判断是否为赋值但没声明
                for (int m = 0; m < symbolTableCount; m++)
                {
                    if (n.getChilds()[0].symbolname == symbolTableName[m])
                    {
                        occur = true;
                    }
                }
                if (!occur)
                {
                    symbolTableName[symbolTableCount]     = n.getChilds()[0].symbolname;
                    symbolTableType[symbolTableCount]     = "未声明";
                    symbolTableValue[symbolTableCount]    = "";
                    symbolTableLineNo[symbolTableCount]   = "";
                    symbolTableColumnNo[symbolTableCount] = "";
                    symbolTableCount++;
                }
                else
                {
                    //判断赋值类型是否一致
                    bool judge = false;    //判断是否值为小数,小数为true
                    for (int l = 0; l < n.getChilds()[0].symbolvalue.Length; l++)
                    {
                        if (n.getChilds()[0].symbolvalue[l] == '.')
                        {
                            judge = true;
                        }
                    }
                    if (n.getChilds()[2].symboltype == "real")
                    {
                        judge = true;
                    }
                    if (judge)
                    {
                        for (int m = 0; m < symbolTableCount; m++)
                        {
                            if (n.getChilds()[0].symbolname == symbolTableName[m] && symbolTableType[m] == "int")
                            {
                                symbolTableType[m]     = "类型不匹配";
                                symbolTableValue[m]    = "";
                                symbolTableLineNo[m]   = "";
                                symbolTableColumnNo[m] = "";
                            }
                            if (n.getChilds()[0].symbolname == symbolTableName[m] && symbolTableType[m] == "real")
                            {
                                symbolTableValue[m] = n.getChilds()[0].symbolvalue;
                            }
                        }
                    }
                    else
                    {
                        for (int m = 0; m < symbolTableCount; m++)
                        {
                            if (n.getChilds()[0].symbolname == symbolTableName[m])
                            {
                                symbolTableValue[m] = n.getChilds()[0].symbolvalue;
                            }
                        }
                    }
                }
                break;

            case "arithexpr":
                //对直接赋值和运算赋值分别讨论
                symboltable(n.getChilds()[0]);
                symboltable(n.getChilds()[1]);
                if (n.hasChild())
                {
                    if (n.getChilds()[1].getChilds().Count == 1)
                    {
                        n.symboltype  = n.getChilds()[0].symboltype;
                        n.symbolvalue = n.getChilds()[0].symbolvalue;
                    }
                    else if (n.getChilds()[1].getChilds().Count == 3)
                    {
                        bool occurleft  = false;
                        bool occurright = false;
                        for (int m = 0; m < symbolTableCount; m++)
                        {
                            if (n.getChilds()[0].symbolname == symbolTableName[m])
                            {
                                n.getChilds()[0].symboltype = symbolTableType[m];
                                occurleft = true;
                            }
                            if (n.getChilds()[1].symbolname == symbolTableName[m])
                            {
                                n.getChilds()[1].symboltype = symbolTableType[m];
                                occurright = true;
                            }
                        }
                        if (occurleft && occurright)
                        {
                            if (n.getChilds()[0].symboltype == "int" && n.getChilds()[1].symboltype == "int")
                            {
                                n.symboltype = "int";
                            }
                            if (n.getChilds()[0].symboltype == "int" && n.getChilds()[1].symboltype == "real")
                            {
                                n.symboltype = "real";
                            }
                            if (n.getChilds()[0].symboltype == "real" && n.getChilds()[1].symboltype == "int")
                            {
                                n.symboltype = "real";
                            }
                            if (n.getChilds()[0].symboltype == "real" && n.getChilds()[1].symboltype == "real")
                            {
                                n.symboltype = "real";
                            }
                        }
                    }
                }
                break;

            case "multexpr":
                symboltable(n.getChilds()[0]);
                n.symbolname  = n.getChilds()[0].symbolname;
                n.symboltype  = n.getChilds()[0].symboltype;
                n.symbolvalue = n.getChilds()[0].symbolvalue;
                break;

            case "simpleexpr":
                symboltable(n.getChilds()[0]);
                n.symbolname  = n.getChilds()[0].symbolname;
                n.symboltype  = n.getChilds()[0].symboltype;
                n.symbolvalue = n.getChilds()[0].symbolvalue;
                break;

            case "arithexprprime":
                if (n.getChilds().Count == 3)
                {
                    symboltable(n.getChilds()[1]);
                    symboltable(n.getChilds()[2]);
                    n.symbolname = n.getChilds()[1].symbolname;
                }
                break;

            default:
                break;
            }
        }