public void Add(YuSymbolTableRow row) { if (this.IsContain(row)) { throw new YuSymbolIsExistException(); } this.Rows.Add(row); }
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)); }
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); }
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)); } }