示例#1
0
        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);
        }
示例#2
0
 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);
         }
     }
 }