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; }
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); }