Esempio n. 1
0
 //Чтобы рисовать произвольный граф, например граф циклов, в основном, для отладки
 public void DrawAnyGraph(tGraph aGraph)
 {
     GraphBuilder.Start();
     foreach (tEdge ed in aGraph.Edges)
     {
         GraphBuilder.AddSimpleEdge(ed.fromNode, ed.toNode);
     }
     GraphBuilder.End();
 }
Esempio n. 2
0
        //public IPhrase Parent;

        public BuildGraphContext(Grammar aGrammar, tGraph aGraph)
            : base(aGrammar)
        {
            if (aGraph == null)
            {
                throw new ArgumentNullException();
            }
            BuildingGraph = aGraph;
        }
Esempio n. 3
0
        /// <summary>
        /// Строит граф грамматики. Для наглядного отображения
        /// </summary>
        public void BuildGrammarGraph()
        {
            GrammarGraph = new tGraph();
            // строим вершины графа грамматики
            //foreach (string lNotTermName in Rules.Keys) //AllNotTerminals.Keys) так ошибка, когда есть неиспользуемые правила
            //{
            //  GrammarGraph.addNode(lNotTermName);
            //}
            GrammarGraph.addNode(MainSymbol.Text);

            BuildGraphContext context = new BuildGraphContext(this, GrammarGraph);

            mMainSymbol.Context         = context;
            mMainSymbol.Context.Visitor = new BuildGraphVisitor();
            mMainSymbol.Accept(context);
        }
Esempio n. 4
0
        public override IDerivation Visit(NonTerminal aSymbol, DerivationContext aContext)
        {
            tGraph graph = (aContext as BuildGraphContext).BuildingGraph;

            if ((aSymbol.CycicKind & CycicKind.CyclicOrigin) > 0)
            {
                graph.ensureExistsNode(aSymbol.CounterName, aSymbol.Text);
                graph.ensureExistsNode(aSymbol.CyclicToOccurence, aSymbol.Text);
                tEdge e = graph.addEdge(aSymbol.CounterName, aSymbol.CyclicToOccurence);
                if (e != null)
                {
                    e.CustomAttributes = GrammarGraphEdgeAttrs.IsPunktir;
                }
            }
            if (aSymbol.CycicKind == CycicKind.None ||
                aSymbol.CycicKind == CycicKind.CyclicPropagated)
            {
                aSymbol.FindItsRule().Expand(aContext);
            }
            return(null);
        }
Esempio n. 5
0
        private tEdge addEdge(DerivationContext aContext, IPhrase aPhr, IPhrase aParent)
        {
            tGraph graph    = (aContext as BuildGraphContext).BuildingGraph;
            string fromName = "unk";
            string toName   = "unk";

            // determine fromName
            if (aParent == null)
            {
                fromName = aContext.Grammar.MainSymbol.CounterName;
                graph.ensureExistsNode(fromName, aContext.Grammar.MainSymbol.Text);
            }
            else
            {
                NonTerminal parentNt = aParent as NonTerminal;
                if (parentNt != null)
                {
                    fromName = parentNt.CounterName;
                    graph.ensureExistsNode(parentNt.CounterName, parentNt.Text);
                }
                else
                {
                    fromName = (aContext as BuildGraphContext).GeneratedToName;
                    Debug.Assert(!string.IsNullOrEmpty(fromName), "Не должно быть");
                }
            }
            // determine toName
            NonTerminal nonTerminal = aPhr as NonTerminal;
            Terminal    terminal    = aPhr as Terminal;

            if (nonTerminal != null)
            {
                toName = nonTerminal.CounterName;
                string text = nonTerminal.Text;
                if ((nonTerminal.CycicKind & CycicKind.SkippedAsSeen) > 0)
                {
                    text += " *";
                }
                graph.ensureExistsNode(toName, text);
            }
            else if (terminal != null)
            {
                string text = string.IsNullOrEmpty(terminal.Text) ? "e" : terminal.Text;
                tNode  n    = graph.addNonUniqueNode(text);
                toName             = n.Name;
                n.CustomAttributes = "term";
            }
            else
            {
                toName = graph.addNonUniqueNode(aPhr.ToString()).Name;
                //надо запомнить это в контексте
                (aContext as BuildGraphContext).GeneratedToName = toName;
            }
            tEdge e = graph.addEdge(fromName, toName);

            if (e == null)
            {
                Debug.WriteLine("не создалась дуга, потому что нет вершин");
            }
            return(e);
        }
Esempio n. 6
0
 public BuildGraphContext(BuildGraphContext aBuildGraphContext)
     : base(aBuildGraphContext.Grammar)
 {
     BuildingGraph = aBuildGraphContext.BuildingGraph;
 }