1 using Mercury.Formats.Basic;
2 using Mercury.Interpreting;
3 using Mercury.Scanning;
5 using System.Collections.Generic;
16 namespace Mercury.Experimental
18 internal class GrammarLoaderInternal<T> where T : class
20 private string grammarcwd;
21 private Grammar grammar;
23 private IList<InterpreterAction<T>> actions;
25 private IScanner GetScanner()
27 List<IScanner> scanners =
new List<IScanner>();
47 return scanners.Count == 1 ? scanners[0] :
new CompositeScanner(scanners);
50 private Grammar GetGrammar()
52 var gb =
new GrammarBuilder(
new Symbol(GrammarInfo.Root),
new Symbol(GrammarInfo.Epsilon, SymbolType.Epsilon));
54 foreach(var gname
in GrammarInfo.GrammarFiles)
56 var gparser =
new GrammarParser(Path.Combine(GrammarInfo.Path, gname));
57 gb.Include(gparser.GetBuilder());
60 return gb.GetGrammar();
63 private IList<InterpreterAction<T>> GetActions()
65 var actions =
new List<InterpreterAction<T>>() { };
93 private RewriteRuleCollection<T> GetRwRules()
95 var rwrb =
new RewriteRuleCollectionBuilder<T>();
97 foreach (var rwrname
in GrammarInfo.RwRulesFiles)
99 var iparser =
new RewriteRulesParser<T>(rwrname,
new Symbol(GrammarInfo.Epsilon, SymbolType.Epsilon), actions);
100 rwrb.AddRules(iparser.GetRules());
103 return rwrb.GetCollection();
106 public GrammarLoaderInternal(GrammarInfo grminf)
108 this.GrammarInfo = grminf;
109 this.grammarcwd = grminf.Path;
112 public LanguageInfo<T> GetLanguageInfo()
114 grammar = GetGrammar();
115 actions = GetActions();
116 return new LanguageInfo<T>(GrammarInfo.Name,
new Tokenizer(), GetScanner(), grammar, GetRwRules());
119 public GrammarInfo GrammarInfo {
get;
private set; }
122 internal static class GrammarLoader<T> where T : class
124 public static LanguageInfo<T> GetLanguageInfo(GrammarInfo grminf)
125 {
return (
new GrammarLoaderInternal<T>(grminf)).GetLanguageInfo(); }
127 public static LanguageInfo<T> GetLanguageInfo(
string file)
128 {
return GetLanguageInfo(GrammarInfo.FromXML(file)); }
130 public static Analyser<T> GetAnalyzer(GrammarInfo grminf)
131 {
return new Analyser<T>(
new GrammarLoaderInternal<T>(grminf).GetLanguageInfo()); }
133 public static Analyser<T> GetAnalyzer(
string file)
134 {
return GetAnalyzer(GrammarInfo.FromXML(file)); }