Пример #1
0
        RuleSet Chomskey5_Terminals(RuleSet rs, List<char> newVars) {
            var newRs = new RuleSet();
            var translate = new Dictionary<char, char>();

            foreach (var r in rs) {
                var newVals = new List<string>(r.Value.Length);
                foreach (string ibody in r.Value) {
                    string newBody = ibody;
                    if (ibody.Length == 2) {

                        var c2Replaces = new List<char>();
                        if (Terminals.Contains(newBody[0]))
                            c2Replaces.Add(newBody[0]);
                        if (Terminals.Contains(newBody[1]))
                            c2Replaces.Add(newBody[1]);

                        foreach (var c2Replace in c2Replaces) {
                            if (translate.TryGetValue(c2Replace, out char nl)) { } else {
                                nl = Utils.NextFreeCapitalLetter(newVars.Union(Terminals).ToArray(), c2Replace.ToString().ToUpper()[0]);
                                newVars.Add(nl);
                                translate.Add(c2Replace, nl);
                            }
                            newBody = newBody.Replace(c2Replace, nl);
                        }
                    } //end if body.Length = 2
                    newVals.Add(newBody);
                } //next body
                newRs.Add(r.Key, newVals.ToArray());
            } //next r

            foreach (var la in translate)
                newRs.Add(la.Value, new string[] { la.Key.ToString() });

            return newRs;
        } //end function
Пример #2
0
        public string[] FirstSet(char Var)
        {
            if (Terminals.Contains(Var))
            {
                return new String[] { Var.ToString() }
            }
            ;

            var first = new Dictionary <char, List <string> >();

            foreach (var v in Variables)
            {
                first.Add(v, new List <string>());
            }
            foreach (var t in Terminals)
            {
                first.Add(t, new List <string> {
                    t.ToString()
                });
            }

            var Prods = Rules[Var];
            var D     = new List <string> [Prods.Length];

            for (int i = 0; i < Prods.Length; i++)
            {
                var prod = Prods[i];

                if (prod == string.Empty)
                {
                    D[i] = new List <string>();
                    D[i].Add("");
                }
                else
                {
                    D[i] = new List <string>(FirstSet(prod[0]).Where(s => s != ""));
                    int j = 1;
                    while (Prods[i].Length > j && (FirstSet(Prods[i][j])).Contains("") && j < Prods[i].Length)
                    {
                        j++;
                        D[i] = D[i].Union((FirstSet(Prods[i][j]).Where(s => s != ""))).ToList();
                    }
                    if (j == Prods[i].Length && FirstSet(prod[prod.Length - 1]).Contains(""))
                    {
                        D[i].Add("");
                    }
                }
                first[Var].AddRange(D[i]);
            }
            return(first[Var].ToArray());
        }
Пример #3
0
        /// <summary>
        /// Removes a terminal from this node.
        /// </summary>
        /// <param name="terminal">The terminal to remove.</param>
        public virtual void RemoveTerminal(TerminalModel terminal)
        {
            if (!Terminals.Contains(terminal))
            {
                throw new ModelValidationException(this, "Add terminal before removing it");
            }

            if (terminal.ConnectedWires.Any())
            {
                throw new ModelValidationException(this, "Disconnect terminal before removing it");
            }

            terminal.ParentNode = null;
            Terminals.Remove(terminal);
        }
Пример #4
0
        /// <summary>
        /// Adds a terminal to this node.
        /// </summary>
        /// <param name="terminal">The terminal to add.</param>
        public virtual void AddTerminal(TerminalModel terminal)
        {
            if (Terminals.Contains(terminal))
            {
                throw new ModelValidationException(this, "This terminal has already been added");
            }

            if (terminal.ParentNode is object)
            {
                throw new ModelValidationException(this, "Remove terminal from its current node before adding it to this one");
            }

            terminal.ParentNode = this;
            Terminals.Add(terminal);
        }
Пример #5
0
        public override void RemoveReference(ModelCode referenceId, long globalId)
        {
            switch (referenceId)
            {
            case ModelCode.TERMINAL_CONDEQUIP:
                if (Terminals.Contains(globalId))
                {
                    Terminals.Remove(globalId);
                }
                else
                {
                    CommonTrace.WriteTrace(CommonTrace.TraceWarning, "Entity(GID = 0x{ 0:x16}) doesn't contain reference 0x{1:x16}.", this.GlobalId, globalId);
                }
                break;

            default:
                base.RemoveReference(referenceId, globalId);
                break;
            }
        }
Пример #6
0
        protected override void CheckConstraints()
        {
            base.CheckConstraints();

            foreach (var r in Rules)
            {
                foreach (string body in r.Value)
                {
                    if (body.Length > 2)
                    {
                        throw new GrammerException($"body {body} longer than 2");
                    }
                    else if (body.Length == 0)
                    {
                        // ok
                    }
                    else if (body.Length == 1)
                    {
                        if (Variables.Contains(body[0]))
                        {
                            throw new GrammerException($"only body {body} is Var");
                        }
                    }
                    else
                    {
                        if (!Terminals.Contains(body[0]))
                        {
                            throw new GrammerException($"first char in {body} is no Terminal {string.Join(',', Terminals)}");
                        }
                        if (!Variables.Contains(body[1]))
                        {
                            throw new GrammerException($"second char in {body} is no Variables {string.Join(',', Variables)}");
                        }
                    }
                }
            }
        }
Пример #7
0
 public override bool IsTerminal(string symbol) => Terminals.Contains(symbol);
Пример #8
0
 public bool isNotTerminal(TokenType token)
 {
     return(!Terminals.Contains(token));
 }