Esempio n. 1
0
        private Rule parseRule(string s, List<string> terminals, List<string> nonterminals)
        {
            Rule r = new Rule();
            int leftLength = s.IndexOf(" -> ");
            if (leftLength != 1)
                throw new FormatException("Некорректный формат файла.");
            r.Left.Sym = s.First().ToString();
            if (s.Length == 6 && s[5] == 'e')
            {
                r.Right.Add(new EmptySymbol());
                return r;
            }
            for (int i=5; i<s.Length; i++)
            {
                if (s[i] == 'e')
                    throw new FormatException("Некорректный формат файла.");
                if (terminals.Contains(s[i].ToString()))
                    r.Right.Add(new Terminal(s[i].ToString()));
                else
                    if (nonterminals.Contains(s[i].ToString()))
                        r.Right.Add(new Nonterminal(s[i].ToString()));
                    else
                        throw new FormatException("Некорректный формат файла.");

            }
            return r;
        }
Esempio n. 2
0
 public Rule(Rule r)
 {
     _left = new Nonterminal(r.Left);
     _right = new List<Symbol>(r.Right);
 }
 private Alternative createAlternative(Rule r)
 {
     int idx = _orderedAlternatives[r.Left.Sym].Count;
     return new Alternative(r.Left, idx, r.Right);
 }