using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Linq; using miew.Debugging; using miew.Enumerable; using miew.ReadOnly; namespace agree { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// In accordance with DELPH-IN tradition, we distinguish "types" from "entries." (Copestake 2002 p.106) /// Entries include everything except Types: lexical entries, grammar rules, start symbols, and node labels. /// In common, both share this abstract base class, Instance, which captures the idea of something that can /// have constraints. Types participate in a DAG hierarchy whereas Entries instead refer to a single Type. Thus, /// while Types and Entries have an is-a (inheritance) relationship with Instance, every Entry additionally has /// a has-a (contains) relationship with exactly one Type. /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class Instance : ISysObj { public Instance(TypeMgr tm, String name, List<BaseFeatConstraint> bfc) { this.tm = tm; this.Name = name; SetConstraints(bfc); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [Flags] public enum Flags { /// <summary>set for a type with no child types</summary> Leaf = 0x00000001, /// <summary>set if this type is a system-generated greater lowest bound (glb) type</summary> GlbType = 0x00000002, /// <summary>set if this type has any appropriate (inherited or local) features</summary> HasAnyFeatures = 0x00000004, /// <summary>set if there are no appropriate features in this type's subgraph (inclusive)</summary> Atomic = 0x00000010, /// <summary>useful for skipping well-formedness unification when a ⊓ b ⊏ glb</summary> HasConstraints = 0x00000020, /// <summary>set when the type's inherited features have been computed</summary> LoadedNonLocalFeatures = 0x00010000, }; public Flags m_flags; /// <summary> /// if a type has no appropriate features, it can be structure-shared /// </summary> public bool HasAnyFeatures { get { return (m_flags & Flags.HasAnyFeatures) > 0; } } public bool IsBare { get { return (m_flags & Flags.HasAnyFeatures) == 0; } } public readonly TypeMgr tm; public List<BaseFeatConstraint> m_bfc; public readonly String Name; public abstract Type InstanceType { get; } [DebuggerDisplay("{m_flags.HasFlag(Flags.LoadedDefinition)?_definition.ToString():\"(definition not loaded yet)\",nq}")] protected Tfs _definition; [DebuggerBrowsable(DebuggerBrowsableState.Never)] protected Tfs _expanded; public Tfs Expanded { get { bool f_dont_care; return _expanded ?? EnsureExpanded(out f_dont_care); } } public abstract Tfs EnsureExpanded(out bool f_did); public bool IsExpanded { get { return _expanded != null; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void SetConstraints(List<BaseFeatConstraint> bfc) { if (bfc != null) { if (m_bfc == null) m_bfc = bfc; else m_bfc.AddRange(bfc); m_flags |= Type.Flags.HasConstraints; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerBrowsable(DebuggerBrowsableState.Never)] // side effects public Tfs Definition { get { Tfs _tmp = _definition; if (_tmp != null) return _tmp; if ((m_flags & Flags.HasAnyFeatures) == 0 || m_bfc == null) _tmp = new BareTfs(InstanceType); else { BootstrapTfs dtfs = BootstrapDefinition(); int ec = dtfs.EdgeCount; if (ec == 0) _tmp = new BareTfs(InstanceType); else if (ec < 12) _tmp = new TinyTfs(dtfs); else _tmp = new ArrayTfs(dtfs); } #if CONCURRENT_DEF_LOAD if (Ext.AtomicStoreIfNull(ref _definition, ref _tmp)) m_bfc = null; #else _definition = _tmp; m_bfc = null; #endif return _tmp; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public BootstrapTfs BootstrapDefinition() { Debug.Assert(_definition == null); Type t = InstanceType; BootstrapTfs dtfs = new BootstrapTfs(tm, t, false); ConstraintRef cref = new ConstraintRef(dtfs); using (TdlNavigator bn = new TdlNavigator(dtfs, t)) { foreach (BaseFeatConstraint bfc in m_bfc) bn.AcceptBaseConstraint(cref, bfc); } return dtfs; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerBrowsable(DebuggerBrowsableState.Never)] public IReadOnlyDictionary<String, ISysObj> SysObjChildren { get { return SysObjHelper<ISysObj>.Empty; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public ISysObj SysObjParent { get { return tm.g; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public String SysObjName { get { return Name; } } [DebuggerBrowsable(DebuggerBrowsableState.Never)] public string SysObjDescription { get { return Name; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public override string ToString() { return Name; } }; }