Beispiel #1
0
 public void Add(YuSymbolTableRow row)
 {
     if (this.IsContain(row))
     {
         throw new YuSymbolIsExistException();
     }
     this.Rows.Add(row);
 }
Beispiel #2
0
        private void RecTree(YuTreeNode node)
        {
            if (node.Children[0].Token.Type == ETokenType.ExpAdd)
            {
                this.RecTree(node.Children[0]);
            }
            else
            {
                if (node.Children[0].Token.Type == ETokenType.Symbol)
                {
                    YuSymbolTableRow row = new YuSymbolTableRow(ESymbolType.Var, node.Children[0].Token);
                    if (this.SymbolTable.IsContain(row) == false)
                    {
                        throw new YuSymbolUndefinedException();
                    }

                    VMOp op = new VMOp(EOpCode.PushAddr, -1);
                    this.OpLst.Add(op);
                    this.NeedResolvLst.Add(new Tuple <VMOp, YuToken>(op, node.Children[0].Token));
                }
                else
                {
                    this.OpLst.Add(new VMOp(EOpCode.Push, int.Parse(node.Children[0].Token.Text)));
                }
            }

            if (node.Children[1].Token.Type == ETokenType.ExpAdd)
            {
                this.RecTree(node.Children[1]);
            }
            else
            {
                if (node.Children[1].Token.Type == ETokenType.Symbol)
                {
                    YuSymbolTableRow row = new YuSymbolTableRow(ESymbolType.Var, node.Children[1].Token);
                    if (this.SymbolTable.IsContain(row) == false)
                    {
                        throw new YuSymbolUndefinedException();
                    }

                    VMOp op = new VMOp(EOpCode.PushAddr, -1);
                    this.OpLst.Add(op);
                    this.NeedResolvLst.Add(new Tuple <VMOp, YuToken>(op, node.Children[1].Token));
                }
                else
                {
                    this.OpLst.Add(new VMOp(EOpCode.Push, int.Parse(node.Children[1].Token.Text)));
                }
            }

            this.OpLst.Add(new VMOp(EOpCode.Add, 0));
        }
Beispiel #3
0
        public bool IsContain(YuSymbolTableRow row)
        {
            bool ret = false;

            foreach (var r in this.Rows)
            {
                if (r.SymbolType == row.SymbolType && r.SymbolToken.Text.Equals(row.SymbolToken.Text))
                {
                    ret = true;
                    break;
                }
            }
            return(ret);
        }
Beispiel #4
0
        public void TranslateTree(YuTreeNode node)
        {
            if (node.Token.Type == ETokenType.ExpAdd)
            {
                this.RecTree(node);
            }
            else if (node.Token.Type == ETokenType.Var)
            {
                YuSymbolTableRow sr = new YuSymbolTableRow(ESymbolType.Var, node.Children[0].Token);
                this.SymbolTable.Add(sr);
            }
            else if (node.Token.Type == ETokenType.Equal)
            {
                /*
                 * if (node.Children[1].Children[0].Token.Type == ETokenType.Number)
                 * {
                 *  this.OpLst.Add(new VMOp(EOpCode.Push, int.Parse(node.Children[1].Children[0].Token.Text)));
                 *  this.OpLst.Add(new VMOp(EOpCode.Push, int.Parse(node.Children[1].Children[1].Token.Text)));
                 *  this.OpLst.Add(new VMOp(EOpCode.Add, 0));
                 * }
                 */
                this.RecTree(node.Children[1]);

                YuSymbolTableRow row = new YuSymbolTableRow(ESymbolType.Var, node.Children[0].Token);
                if (this.SymbolTable.IsContain(row) == false)
                {
                    throw new YuSymbolUndefinedException();
                }

                VMOp op = new VMOp(EOpCode.Pop, -1);

                this.OpLst.Add(op);
                this.NeedResolvLst.Add(new Tuple <VMOp, YuToken>(op, node.Children[0].Token));
            }
            else if (node.Token.Type == ETokenType.Def)
            {
                YuSymbolTableRow sr = new YuSymbolTableRow(ESymbolType.Proc, node.Children[0].Token, node);
                this.SymbolTable.Add(sr);
            }
            else if (node.Token.Type == ETokenType.Call)
            {
                VMOp op = new VMOp(EOpCode.Call, -1);
                this.OpLst.Add(op);
                this.NeedResolvLst.Add(new Tuple <VMOp, YuToken>(op, node.Children[0].Token));
            }
            else if (node.Token.Type == ETokenType.Eof)
            {
                this.OpLst.Add(new VMOp(EOpCode.End, 0));
            }
        }