public Grammar(Productions.Grammar grammar) { Symbols = new Symbols(); Symbols.AddSymbols(grammar.Symbols); if (!Symbols.TryFind(grammar.Start, out var startSym)) { startSym = Symbols.Create( name: grammar.Productions[0].Name, isTerminal: false); } //Create kernal rule var languageSymbol = new Symbol(name: "S'", id: (uint)Symbols.Count, terminal: false); var rule = new Rule(this, 0, languageSymbol, startSym !); rules = new List <Rule> { rule }; foreach (var prod in grammar.Productions) { var left = Symbols.Create(prod.Name, false); var right = prod.Right .Select(x => Symbols[x.Name]) .ToArray(); prod.RuleId = rules.Count; rules.Add(new Rule(this, rules.Count, left, right)); } TerminalSets = new TerminalSets(this); }
public ConflictResolvers(ConflictList conflicts, Symbols symbols, ILogger logger) { data = new Dictionary <Key, int>(); foreach (var conflict in conflicts) { if (symbols.TryFind(conflict.Symbol, out var symbol)) { var key = new Key(conflict.State, symbol !.Id); var action = conflict.Shift ? conflict.NextState : -(int)(2 + conflict.NextState); data[key] = action; } else { logger.LogWarning(conflict, "Missing symbol {0}", conflict.Symbol); } } }