1 using Mercury.Nucleus.Collections;
4 using System.Collections.Generic;
7 namespace Mercury.Interpreting
14 public class RewriteRuleCollection<T> : IReadOnlyCollection<RewriteRule<T>>
19 private IReadOnlyList<RewriteRule<T>> rules;
20 private IReadOnlyMultiDictionary<Symbol, RewriteRule<T>> rulemap;
21 private IReadOnlyList<RewriteRule<T>> wildrules;
27 if (rules == null)
throw new ArgumentNullException(
"rules");
28 if (rulemap == null)
throw new ArgumentNullException(
"rulemap");
30 this.rules = rules.ToList();
31 this.rulemap = rulemap;
33 if (!rulemap.TryGetValue(
new Symbol(), out wildrules))
46 IReadOnlyList<RewriteRule<T>> tmp;
48 if (!rulemap.TryGetValue(head, out tmp))
51 return tmp.Concat(wildrules);
56 #region [ IReadOnlyCollection ]
58 public int Count {
get {
return rules.Count; } }
61 {
return rules.GetEnumerator(); }
63 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
64 {
return rules.GetEnumerator(); }
78 public class RewriteRuleCollectionBuilder<T>
83 private List<RewriteRule<T>> rules;
84 private UniqueListMultiDictionary<Symbol, RewriteRule<T>> rulemap;
93 rules =
new List<RewriteRule<T>>();
94 rulemap =
new UniqueListMultiDictionary<Symbol, RewriteRule<T>>();
107 if (alt.Symbols.Count == 0)
108 newrule = rulemap.Add(
new Symbol(), rule);
109 else for (
int ix = 0; ix < alt.Symbols.Count; ++ix)
110 newrule &= rulemap.Add(alt.Symbols[ix], rule);
112 if (newrule) rules.Add(rule);
121 {
foreach (var rule
in rules) AddRewriteRule(rule);
return this; }
Represents an alternative of elements. It may match specified symbols or symboltypes (Nonterminals...
IEnumerator< RewriteRule< T > > GetEnumerator()
Can be used to construct Mercury.Interpreting.RewriteRuleCollection{T}
A read-only collection of rewrite rules
RewriteRuleCollectionBuilder< T > AddRules(RewriteRuleCollection< T > rules)
Adds the collection of rules.
RewriteRuleCollection< T > GetCollection()
Creates a RewriteRuleCollection with rules from this builder.
IEnumerable< RewriteRule< T > > RulesFor(Symbol head)
Returns a list of rules whose LHS Structure's head matches the given head .
IElement Head
Value of LHS's root node.
RewriteRuleCollectionBuilder()
Initializes a new instance of the RewriteRuleCollectionBuilder{T} class.
RewriteRuleCollectionBuilder< T > AddRewriteRule(RewriteRule< T > rule)
Adds a RewriteRule to the collection
Represents a single symbol of the grammar. This is an immutable class. For a symbol name to be val...