Пример #1
0
        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);
        }
Пример #2
0
        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);
        }