static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("The syntax for the command is:"); Console.WriteLine("IFC-gen <express schema path> <output directory>"); return; } var expressPath = args[0]; if (!File.Exists(expressPath)) { Console.WriteLine($"The specified express file path, {expressPath}, does not exist."); return; } var outputDir = args[1]; if (!Directory.Exists(outputDir)) { Console.WriteLine($"The specified output directory, {outputDir}, does not exist."); return; } using (FileStream fs = new FileStream(expressPath, FileMode.Open)) { var input = new AntlrInputStream(fs); var lexer = new Express.ExpressLexer(input); var tokens = new CommonTokenStream(lexer); var parser = new Express.ExpressParser(tokens); parser.BuildParseTree = true; var tree = parser.schemaDecl(); var walker = new ParseTreeWalker(); var sb = new StringBuilder(); var listener = new Express.ExpressListener(sb); walker.Walk(listener, tree); var outPath = Path.Combine(outputDir, "IFC.cs"); File.WriteAllText(outPath, sb.ToString()); // Write tokens to a file for debugging. /*var tokenStr = new StringBuilder(); * foreach(var t in tokens.GetTokens()) * { * tokenStr.AppendLine(t.ToString()); * } * File.WriteAllText("tokens.txt",tokenStr.ToString());*/ } }
static void Main(string[] args) { ParseOptions(args); if (showHelp) { return; } var generators = new List <Tuple <ILanguageGenerator, ITestGenerator> >(); if (language == "csharp") { generators.Add(new Tuple <ILanguageGenerator, ITestGenerator>(new CsharpLanguageGenerator(), new CsharpTestGenerator())); } else if (language == "proto") { generators.Add(new Tuple <ILanguageGenerator, ITestGenerator>(new ProtobufGenerator(), new ProtobufTestGenerator())); } using (FileStream fs = new FileStream(expressPath, FileMode.Open)) { var input = new AntlrInputStream(fs); var lexer = new Express.ExpressLexer(input); var tokens = new CommonTokenStream(lexer); var parser = new Express.ExpressParser(tokens); parser.BuildParseTree = true; var tree = parser.schemaDecl(); var walker = new ParseTreeWalker(); var testSb = new StringBuilder(); foreach (var generator in generators) { var listener = new Express.ExpressListener(generator.Item1, generator.Item2); walker.Walk(listener, tree); Generate(listener, outDir, outDirTests, generator.Item1, generator.Item2); } // Write tokens to a file for debugging. /*var tokenStr = new StringBuilder(); * foreach(var t in tokens.GetTokens()) * { * tokenStr.AppendLine(t.ToString()); * } * File.WriteAllText("tokens.txt",tokenStr.ToString());*/ } }
static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("The syntax for the command is:"); Console.WriteLine("IFC-gen <express schema path> <output directory>"); return; } var expressPath = args[0]; if (!File.Exists(expressPath)) { Console.WriteLine($"The specified express file path, {expressPath}, does not exist."); return; } var outputDir = args[1]; if (!Directory.Exists(outputDir)) { Console.WriteLine($"The specified output directory, {outputDir}, does not exist."); return; } using (FileStream fs = new FileStream(expressPath, FileMode.Open)) { var input = new AntlrInputStream(fs); var lexer = new Express.ExpressLexer(input); var tokens = new CommonTokenStream(lexer); var parser = new Express.ExpressParser(tokens); parser.BuildParseTree = true; var tree = parser.schemaDeclaration(); var walker = new ParseTreeWalker(); var listener = new Express.ExpressListener(); walker.Walk(listener, tree); var sb = new StringBuilder(); // Write types, excluding selects. foreach (var t in listener.Types) { sb.Append(t.ToString()); } // Build the inheritance graph by using the string // type names in SupertypeOf and SubtypeOf to find // the mathing EntityDeclarations. foreach (var e in listener.Entities) { if (e.SubtypeOf.Any()) { e.ParentEntity = listener.Entities.First(ent => ent.Name == e.SubtypeOf.First()); } if (e.SupertypeOf.Any()) { e.ChildEntities.AddRange(listener.Entities.Where(ent => e.SupertypeOf.Contains(ent.Name))); } // Do a pass over all attributes on the entity, ensuring // that the type info on the attribute has its corresponding entity value; // THIS IS STUPID AND SLOW. foreach (var a in e.Attributes) { a.TypeInfo.Entity = listener.Entities.FirstOrDefault(ent => ent.Name == a.TypeInfo.ValueType); } } //Write entities. foreach (var e in listener.Entities) { sb.Append(e.ToString()); } var types = $@"/* This code was generated by a tool. DO NOT MODIFY this code manually, unless you really know what you are doing. */ using System; using System.Collections.Generic; namespace IFC4 {{ {sb.ToString()} }}"; var outPath = Path.Combine(outputDir, "IFC.cs"); File.WriteAllText(outPath, types); var maxSelectParams = listener.Types .Where(t => t.TypeInfo is Express.SelectInfo) .Select(t => t.TypeInfo).Cast <Express.SelectInfo>() .Max(si => si.Values.Count()); var selectConstructors = new StringBuilder(); for (var i = 2; i <= maxSelectParams; i++) { selectConstructors.AppendLine(WriteSelect(i)); } var selects = $@"/* /* This code was generated by a tool. DO NOT MODIFY this code manually, unless you really know what you are doing. */ using System.Collections.Generic; namespace IFC4 {{ public abstract class Select {{ public dynamic Value {{get;protected set;}} }} {selectConstructors.ToString()} }}"; outPath = Path.Combine(outputDir, "IfcSelect.cs"); File.WriteAllText(outPath, selects); /*var tokenStr = new StringBuilder(); * foreach(var t in tokens.GetTokens()) * { * tokenStr.AppendLine(t.ToString()); * } * File.WriteAllText("tokens.txt",tokenStr.ToString());*/ } }