Пример #1
0
        private static RegularGrammar validateProductions(string[] nt, RegularGrammar rg)
        {
            TextScanner      vnScan    = null;
            string           vn        = "";
            string           prod      = "";
            HashSet <string> pr        = new HashSet <string>();
            bool             isDefined = false;

            for (int i = 0; i < nt.Length; i++)
            {
                prod   = nt[i];
                vnScan = new TextScanner(prod);
                vnScan.UseDelimiter("->");
                bool valid;

                if (vnScan.HasNext())
                {
                    vn    = vnScan.Next();
                    valid = rg.productions.TryGetValue(vn[0], out pr);
                    if (pr == null)
                    {
                        pr = new HashSet <string>();
                    }

                    if (vn.Length > 1 || char.IsLower(vn[0]) || !char.IsLetter(vn[0]))
                    {
                        rg.vn.Clear();
                        vnScan.Close();
                    }
                    else
                    {
                        rg.vn.Add(vn[0]);
                        if (!isDefined)
                        {
                            rg.s      = vn[0];
                            isDefined = true;
                        }

                        if (!validateProduction(vn[0], prod, pr, rg))
                        {
                            rg.vn.Clear();
                            vnScan.Close();
                            return(null);
                        }
                    }
                }

                vnScan.Close();
            }

            return(rg);
        }
Пример #2
0
        private static bool validateProduction(char vn, string productions, HashSet <string> prodList, RegularGrammar rg)
        {
            string prod = productions.Substring(productions.IndexOf("->") + 2);
            int    prodLenght = 0;
            char   first, second;

            prodScan = new TextScanner(prod);
            prodScan.UseDelimiter("[|]");
            if (prod.Length < 1)
            {
                prodScan.Close();;
                return(false);
            }

            while (prodScan.HasNext())
            {
                prod       = prodScan.Next();
                prodLenght = prod.Length;
                if (prodLenght < 1 || prodLenght > 2)
                {
                    prodScan.Close();
                    return(false);
                }
                else
                {
                    first = prod[0];
                    if (char.IsUpper(first))
                    {
                        prodScan.Close();
                        return(false);
                    }

                    if (char.IsDigit(first) || char.IsLetter(first))
                    {
                        rg.vt.Add(first);
                    }

                    if (prodLenght == 2)
                    {
                        second = prod[1];
                        if (char.IsUpper(first))
                        {
                            prodScan.Close();
                            return(false);
                        }
                        if (char.IsLetter(second) || char.IsDigit(second))
                        {
                            prodScan.Close();
                            return(false);
                        }

                        if (first == '&' || second == '&')
                        {
                            prodScan.Close();
                            return(false);
                        }
                        if (second == rg.s && rg.vt.Contains('&'))
                        {
                            prodScan.Close();
                            return(false);
                        }

                        rg.vn.Add(second);
                        prodList.Add(prod);
                        rg.productions.Add(vn, prodList);
                    }
                    else
                    {
                        if (char.IsUpper(first))
                        {
                            prodScan.Close();
                            return(false);
                        }

                        if (first == '&')
                        {
                            rg.vt.Add(first);
                            if (vn != rg.s)
                            {
                                prodScan.Close();
                                return(false);
                            }

                            if (rg.productions.Values.Any()) //rever!
                            {
                                prodScan.Close();
                                return(false);
                            }
                        }

                        prodList.Add(prod);
                        rg.productions.Add(vn, prodList);
                    }
                }
            }

            prodScan.Close();
            return(true);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="PeekStream"/> class.
 /// </summary>
 /// <param name="textScanner">The text scanner.</param>
 public PeekStream(TextScanner textScanner)
 {
     this.textReader      = textScanner.textReader;
     this.unconsumedChars = textScanner.unconsumedChars;
 }