Пример #1
0
        public bool EquivalentTo(SppfNode alt)
        {
            if (this.Id != alt.Id)
            {
                return(false);
            }

            if (this == (object)alt)
            {
                return(true);
            }

            if (Children == null)
            {
                return(alt.Children == null);
            }

            int len = Children.Length;

            if (alt.Children == null || len != alt.Children.Length)
            {
                return(false);
            }

            for (int i = 0; i != len; ++i)
            {
                if (Children[i] != (object)alt.Children[i])
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #2
0
        private void BuildCache()
        {
            int tokenCount = grammar.SymbolCount;

            tokenCache = new SppfNode[tokenCount];

            for (int token = 0; token != tokenCount; ++token)
            {
                if (grammar.IsNullable(token))
                {
                    tokenCache[token] = new SppfNode(token, null, Loc.Unknown, HLoc.Unknown);
                }
            }

            ruleOffsetInCache    = new int[grammar.Productions.Count];
            ruleEndOffsetInCache = new int[grammar.Productions.Count];

            int nullableCount = 0;

            foreach (var rule in grammar.Productions)
            {
                int i = rule.PatternTokens.Length;
                while (i != 0)
                {
                    int token = rule.PatternTokens[--i];
                    if (tokenCache[token] == null)
                    {
                        break;
                    }

                    ++nullableCount;
                }

                ruleEndOffsetInCache[rule.Index] = nullableCount;
                ruleOffsetInCache[rule.Index]    = nullableCount - rule.PatternTokens.Length;
            }

            this.ruleCache = new SppfNode[nullableCount];

            foreach (var rule in grammar.Productions)
            {
                int endOffset = ruleOffsetInCache[rule.Index] + rule.PatternTokens.Length;
                int i         = rule.PatternTokens.Length;
                while (i != 0)
                {
                    int token = rule.PatternTokens[--i];
                    if (tokenCache[token] == null)
                    {
                        break;
                    }

                    ruleCache[--endOffset] = tokenCache[token];
                }
            }
        }
Пример #3
0
        private bool EnqueueNode(SppfNode node)
        {
            bool result = !visited.Contains(node);

            if (result)
            {
                visited.Add(node);
                front.Push(node);
            }

            return(result);
        }
Пример #4
0
        public void WriteGraph(SppfNode rootNode)
        {
            front.Push(rootNode);

            graph.BeginDigraph("SPPF");
            graph.SetGraphProperties(ordering: Ordering.Out);

            while (front.Count != 0)
            {
                var node = front.Pop();
                WriteNode(node);
            }

            graph.EndDigraph();
        }
Пример #5
0
        internal SppfNode AddAlternative(SppfNode other)
        {
#if DEBUG
            Debug.Assert(!other.isChild);
#endif

            if (other == (object)this)
            {
                return(this);
            }

#if DEBUG
            other.isAlternative = true;
#endif
            other.NextAlternative = NextAlternative;
            NextAlternative       = other;
            return(this);
        }
Пример #6
0
        private string GetLabel(SppfNode node)
        {
            if (node.Id > 0)
            {
                return(grammar.Symbols[node.Id].Name + " pos: " + node.Location.Position);
            }

            if (node.NextAlternative != null)
            {
                return(grammar.Symbols[node.GetTokenId(grammar)].Name);
            }

            var production = grammar.Productions[-node.Id];

            if (showRules)
            {
                return(string.Format(
                           "{0} -> {1}",
                           production.Outcome.Name,
                           string.Join(" ", from s in production.Pattern select s.Name)));
            }

            return(production.Outcome.Name);
        }
Пример #7
0
        void ISppfNodeVisitor.VisitAlternatives(SppfNode alternatives)
        {
            var    token  = alternatives.GetTokenId(grammar);
            var    symbol = grammar.Symbols[token];
            string label  = symbol.Name + " pos: " + alternatives.Location.Position
#if DEBUG
                            + " t: " + currentNode.timestamp
#endif
            ;

            object parentIdentity = currentNodeIdentity;

            graph.AddNode(parentIdentity, label: label, shape: Shape.Rect);

            var familyNode  = alternatives;
            var altIdentity = alternatives.Children ?? new object();

            int altIndex = 0;

            do
            {
                graph.AddEdge(
                    parentIdentity,
                    altIdentity,
                    style: Style.Dotted,
                    label: "alt#" + ++altIndex);

                this.currentNodeIdentity = altIdentity;
                this.currentNode         = familyNode;
                visited.Add(familyNode);
                familyNode.Accept(this, ignoreAlternatives: true);

                familyNode  = familyNode.NextAlternative;
                altIdentity = familyNode;
            }while (familyNode != null);
        }
Пример #8
0
 private void WriteNode(SppfNode node)
 {
     this.currentNodeIdentity = node;
     this.currentNode         = node;
     node.Accept(this, false);
 }