Ejemplo n.º 1
0
 public void Add(BnfRule rule)
 {
     if (rules.ContainsKey(rule) == false)
     {
         rules.Add(rule, rule);
     }
 }
Ejemplo n.º 2
0
        public void Add(BnfRule rule)
        {
            rules.Add(rule);
            var nt = rule.Nonterminal;

            if (NonTerminals.ContainsKey(nt.Name) == false)
            {
                NonTerminals.Add(nt.Name, nt);
            }
            nt.Add(rule);
        }
Ejemplo n.º 3
0
        BnfGrammar Convert(EbnfGrammar EG)
        {
            Bnf       = new BnfGrammar();
            Footprint = new GrammarConversionFootprint(EG, Bnf);
            foreach (var er in EG.Rules)
            {
                BnfRule br = Convert(er);
            }
            List <IOperationFootprint> ops = new List <IOperationFootprint> ();

            ops.AddRange(nonterminalConversions.Values);
            ops.AddRange(ruleConversions.Values);
            Footprint.Parts = ops.ToArray();
            return(Bnf);
        }
Ejemplo n.º 4
0
        public static BnfGrammar Test1()
        {
            BnfNonterminal S = new BnfNonterminal(nameof(S));
            BnfNonterminal A = new BnfNonterminal(nameof(A));

            TerminalSymbol a = new TerminalSymbol(nameof(a));
            TerminalSymbol b = new TerminalSymbol(nameof(b));
            TerminalSymbol c = new TerminalSymbol(nameof(c));
            TerminalSymbol d = new TerminalSymbol(nameof(d));

            var rule1 = new BnfRule(S, new ISymbol [] { c, A, d });
            var rule2 = new BnfRule(A, new ISymbol [] { a, b });
            var rule3 = new BnfRule(A, new ISymbol [] { a });
            var G     = new BnfGrammar();

            G.Add(rule1);
            G.Add(rule2);
            G.Add(rule3);
            return(G);
        }
Ejemplo n.º 5
0
        BnfRule Convert(EbnfRule E)
        {
            BnfRule B = null;

            if (ruleConversions.ContainsKey(E))
            {
                var footprint = ruleConversions [E];
                B = footprint.After;
            }
            else
            {
                BnfNonterminal bn = Convert(E.Nonterminal);

                List <ISymbol> terms = new List <ISymbol> ();
                var            p     = E.RightPart;
                if (p is EbnfEnumeration)
                {
                    foreach (var pp in ((EbnfEnumeration)p).Parts)
                    {
                        if (pp is EbnfNonterminal)
                        {
                            var name = (pp as EbnfNonterminal).Name;
                            var node = Bnf.AddNonterminal(name);
                            terms.Add(node);
                        }
                        else
                        {
                            if (pp is EbnfTerminal)
                            {
                                var node = (TerminalSymbol)pp;
                                terms.Add(node);
                            }
                            else
                            {
                                throw new ApplicationException();
                            }
                        }
                    }
                }
                else
                {
                    if (p is EbnfNonterminal)
                    {
                        var name = (p as EbnfNonterminal).Name;
                        var node = Bnf.AddNonterminal(name);
                        terms.Add(node);
                    }
                    else
                    {
                        if (p is EbnfTerminal)
                        {
                            var node = (TerminalSymbol)p;
                            terms.Add(node);
                        }
                        else
                        {
                            throw new ApplicationException();
                        }
                    }
                }

                B = new BnfRule(bn, terms.ToArray());
                bn.Add(B);
                var footprint = new RuleConversionFootprint(E, B);
                ruleConversions.Add(E, footprint);
            }
            return(B);
        }