private static void addEntry(Dictionary <SymbolChunk <SYMBOL_ENUM>, List <SymbolPrecedence <SYMBOL_ENUM> > > table, SymbolPrecedence <SYMBOL_ENUM> entry, StringRep <SYMBOL_ENUM> symbolsRep) { List <SymbolPrecedence <SYMBOL_ENUM> > list; if (!table.TryGetValue(entry.Symbols, out list)) { list = new List <SymbolPrecedence <SYMBOL_ENUM> >(); table.Add(entry.Symbols, list); } { IEnumerable <SymbolPrecedence <SYMBOL_ENUM> > conflicts = list.Where(it => it.IsConflictingWith(entry)).ToArray(); if (conflicts.Any()) { throw new ArgumentException("Duplicated precedence for " + entry.Symbols.ToString(symbolsRep)); } } list.Add(entry); }
private void addPatternMatch(SymbolPrecedence.ModeEnum mode, AssociativityEnum assoc, SymbolChunk <SYMBOL_ENUM> inputChunk, SYMBOL_ENUM[] shiftProductions, SYMBOL_ENUM[] reduceProductions, IEnumerable <SYMBOL_ENUM> stackOperators) { if (priorityGroupCounter == 0) { ++runningPriority; } var entry = new SymbolPrecedence <SYMBOL_ENUM>(mode) { Symbols = inputChunk, Associativity = assoc, Priority = runningPriority, ShiftProductions = new HashSet <SYMBOL_ENUM>(shiftProductions), ReduceProductions = new HashSet <SYMBOL_ENUM>(reduceProductions), StackOperators = new HashSet <SYMBOL_ENUM>(stackOperators ?? new SYMBOL_ENUM[] { }) }; addEntry(this.patterns, entry, symbolsRep); }