예제 #1
0
        public Entry(SymbolTable parent, EntryKinds kind, string name)
        {
            this.parent = parent;

            // Establish a two-way link in the tree
            if (parent != null)
            {
                parent.AddEntry(this);
            }

            this.kind = kind;
            this.name = name;
        }
예제 #2
0
        // Add new catalog entry to proper scope
        // Risky: caller may not know where it went; maybe merge Global & Persistent?
        internal void AddEntry(string name, DataType datatype, EntryKinds kind, EntryFlags flags = EntryFlags.None, TypedValue value = null)
        {
            var scope = (flags.HasFlag(EntryFlags.Persistent)) ? _catalog.PersistentVars : this;
            var entry = new CatalogEntry {
                Name     = name,
                DataType = datatype,
                Kind     = kind,
                Flags    = flags,
                Scope    = scope,
                Value    = value,
            };

            scope.Add(entry);
            // update catalog
            if (flags.HasFlag(EntryFlags.Persistent) && _catalog.SaveFlag)
            {
                Logger.Assert(entry.Kind == EntryKinds.Type || entry.Value == null, entry);
                if (entry.Kind == EntryKinds.Type)
                {
                    _catalog.StoreEntry(entry);
                }
            }
        }
예제 #3
0
 // Add a new entry to the catalog.
 // Do kind, flags and other stuff here
 public void AddNewEntry(string name, DataType datatype, EntryKinds kind, EntryFlags flags)
 {
     if (_catalog.IsPersist(name))
     {
         flags |= EntryFlags.Persistent;
     }
     if (kind == EntryKinds.Value && datatype is DataTypeRelation && _catalog.IsDatabase(name))
     {
         flags |= EntryFlags.Database;
     }
     AddEntry(name, datatype, kind, flags, null); // preliminary entry, value can only be set by code
     //AddEntry(name, datatype, kind, flags, datatype.DefaultValue());   // make sure it has something, to avoid later errrors
     if (kind == EntryKinds.Value)
     {
         if (datatype is DataTypeRelation)
         {
             (datatype as DataTypeRelation).ProposeCleanName(name);
         }
         else if (datatype is DataTypeTuple)
         {
             (datatype as DataTypeTuple).ProposeCleanName(name);
         }
     }
 }
예제 #4
0
 public VarParamEntry(SymbolTable parent, Variable variable, EntryKinds kind) : base(parent, kind, variable.GetName())
 {
     this.variable = variable;
 }