1: using System.Dataflow;
2: using System.IO;
3: using System.Collections.Generic;
4:
5: namespace JeffFerguson.Oslo.MGrammar
6: {
7: internal class GraphNavigator
8: {
9: internal delegate void NodeProcessorDelegate(GraphBuilder Builder, object Node);
10:
11: private DynamicParser thisParser;
12: private object thisGraphRoot;
13: private Dictionary<string, NodeProcessorDelegate> thisNodeDictionary;
14:
15: //-----------------------------------------------------------------------------------
16: //-----------------------------------------------------------------------------------
17: internal GraphNavigator(string MgxFile, string LanguageName)
18: {
19: thisParser = DynamicParser.LoadFromMgx(MgxFile, LanguageName);
20: thisNodeDictionary = new Dictionary<string, NodeProcessorDelegate>();
21: }
22:
23: //-----------------------------------------------------------------------------------
24: //-----------------------------------------------------------------------------------
25: internal void AddNodeProcessorDelegate(string NodeName, NodeProcessorDelegate NodeDelegate)
26: {
27: thisNodeDictionary.Add(NodeName, NodeDelegate);
28: }
29:
30: //-----------------------------------------------------------------------------------
31: //-----------------------------------------------------------------------------------
32: internal void Parse(string SourceFileName)
33: {
34: StreamReader SourceFileReader = File.OpenText(SourceFileName);
35: Parse(SourceFileReader);
36: SourceFileReader.Close();
37: SourceFileReader.Dispose();
38: }
39:
40: //-----------------------------------------------------------------------------------
41: //-----------------------------------------------------------------------------------
42: internal void Parse(StreamReader SourceStreamReader)
43: {
44: thisGraphRoot = thisParser.Parse<object>(null, SourceStreamReader, ErrorReporter.Standard);
45: EnumerateGraph(new GraphBuilder(), thisGraphRoot);
46: }
47:
48: //-----------------------------------------------------------------------------------
49: //-----------------------------------------------------------------------------------
50: private void EnumerateGraph(GraphBuilder builder, object node)
51: {
52: NodeProcessorDelegate NodeDelegate = null;
53: object Label = builder.GetLabel(node);
54:
55: if (Label != null)
56: {
57: Identifier IdentifierLabel = Label as Identifier;
58: if (IdentifierLabel != null)
59: thisNodeDictionary.TryGetValue(IdentifierLabel.Text, out NodeDelegate);
60: }
61: foreach (object ChildNode in builder.GetSequenceElements(node))
62: {
63: if ((ChildNode is string) == false)
64: EnumerateGraph(builder, ChildNode);
65: }
66: if (NodeDelegate != null)
67: NodeDelegate(builder, node);
68: }
69: }
70: }