Given the following MGrammar:
module Demo.Employees{
language EmployeeDSL
{
syntax Main = e:Employee*
=> Employees { valuesof(e) };
syntax Employee = employeeName n:text endEmployee
=> id(n) {Name {n}};
@{Classification["Keyword"]}
token employeeName = "Name: ";
token text = ( 'A'..'Z' | 'a'..'z')+;
token endEmployee = "*";
interleave WhiteSpacing = " " | "\r" | "\n";
}
}
And this input:
Name: Bob
*
Name: Alice
*
...Both Intellipad and mgx.exe procude the following output (Intellipad does not include the module name of course):
module Demo.Employees {
Employees {
Bob {
Name => "Bob"
},
Alice {
Name => "Alice"
}
}
}
When I do thesame programmatically with DynamicParser like this:
class Program
{
static void Main(string[] args)
{
DynamicParser parser = null;
string fileToParse = "EmployeeData.ed";
string moduleName = "Demo.Employees";
string languageName = "EmployeeDSL";
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
using (var img = MImage.LoadFromResource(assembly, "EmployeeParser.mx"))
{
var factory = img.ParserFactories[moduleName+ "." + languageName];
parser = factory.Create();
parser.GraphBuilder = new NodeGraphBuilder();
Node root = (Node)parser.Parse(fileToParse, new ParserErrorReporter());
// Save the graph as an m file
string destinationFile = Path.ChangeExtension(fileToParse, "m");
StringBuilder fullMFile = new StringBuilder();
fullMFile.AppendFormat("module {0} ", moduleName);
fullMFile.AppendLine("{");
fullMFile.Append(root.WriteToString());
fullMFile.AppendLine("}");
File.WriteAllText(destinationFile, fullMFile.ToString());
}
}
}
...the generated graph looks like the following:
module Demo.Employees {
Employees {
Bob {
Name {
'Bob'
}
},
Alice {
Name {
'Alice'
}
}
}
Again, for comparison, the mgx.exe version:
module Demo.Employees {
Employees {
Bob {
Name => "Bob"
},
Alice {
Name => "Alice"
}
}
}
Whatam I missing here?