예제 #1
0
 public DottedRuleFactory(IEnumerable <Production> productions)
 {
     foreach (var production in productions)
     {
         var rules = new DottedRule[production.Count + 1];
         this.index.Add(production, rules);
         for (var dot = 0; dot <= production.Count; dot++)
         {
             rules[dot] = new DottedRule(this, production, dot);
         }
     }
 }
예제 #2
0
        public bool Contains(DottedRule dottedRule, int origin)
        {
            if (dottedRule.IsComplete)
            {
                return(CompletionsContains(dottedRule, origin));
            }

            var currentSymbol = dottedRule.PostDot;

            return(currentSymbol is Nonterminal
                       ? NonterminalsContains(dottedRule, origin)
                       : TerminalsContains(dottedRule, origin));
        }
예제 #3
0
        public EarleyState NewState(DottedRule dottedRule, int origin)
        {
            if (dottedRule.IsComplete)
            {
                return(new CompletedState(dottedRule, origin));
            }

            if (dottedRule.PostDot is Nonterminal)
            {
                return(new NonterminalState(dottedRule, origin));
            }

            return(new TerminalState(dottedRule, origin));
        }
예제 #4
0
 private bool TerminalsContains(DottedRule rule, int origin)
 {
     return(this.terminalStates.Contains(rule, origin));
 }
예제 #5
0
 private bool CompletionsContains(DottedRule rule, int origin)
 {
     return(this.completionStates.Contains(rule, origin));
 }
예제 #6
0
 public bool Contains(int location, DottedRule dottedRule, int origin)
 {
     return(this[location].Contains(dottedRule, origin));
 }
예제 #7
0
 public CompletedState(DottedRule dottedRule, int origin)
     : base(dottedRule, origin)
 {
     Debug.Assert(dottedRule.Dot == dottedRule.Count);
 }
예제 #8
0
 public TerminalState(DottedRule dottedRule, int origin)
     : base(dottedRule, origin)
 {
     Debug.Assert(dottedRule.PostDot is Terminal);
 }
예제 #9
0
 protected EarleyState(DottedRule dottedRule, int origin)
 {
     DottedRule = dottedRule;
     Origin     = origin;
 }
예제 #10
0
 public bool Contains(DottedRule rule, int origin)
 {
     return(this.lookup.TryGetValue(rule, out var origins) && origins.TryGetValue(origin, out var _));
 }