static void Main(string[] args) { List <string> names = new List <string>(); int _errorCount = 0; string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); var options = new Options(); ICommandLineParser clp = new CommandLineParser(new CommandLineParserSettings(true, Console.Error)); if (!clp.ParseArguments(args, options)) { Environment.Exit(1); } #if !ANTLR #if REV4 Parser4 p = new Parser4(); #else Parser3 p = new Parser3(); #endif p.OutputPath = options.OutputDir; #endif Console.WriteLine("Initializing..."); TemplateGroupFile loader = new TemplateGroupFile(path, null); loader.Load(); // TemplateGroupString templates = loader.Compile() ;//"cpp2");//, typeof(TemplateLexer), null); // templates.Listener = new ErrorListener(); if (options.Recurse) { string rootpath = options.InputFile; if (!rootpath.EndsWith("\\")) { rootpath += @"\"; } Console.WriteLine("Processing..."); AS3TParser parser; string[] files = Directory.GetFiles(options.InputFile, "*.as", SearchOption.AllDirectories); foreach (string f in files) { #if ANTLR AS3TLexer lex = new AS3TLexer(new ANTLRFileStream(f)); //CommonTokenStream tokens = new CommonTokenStream(lex); TokenRewriteStream tokens = new TokenRewriteStream(lex); //CommonTokenStream tokens = new CommonTokenStream(lex); parser = new AS3TParser(tokens); parser.TemplateGroup = templates; parser.OutputPath = options.OutputDir; try { parser.program(); if (options.VerboseLevel > 2) { Console.WriteLine("calling generateSource {0}", parser.Classname); } generateSource(options, tokens, parser.Classname); if (options.VerboseLevel > 2) { Console.WriteLine("calling generateHeader {0}", parser.Classname); } generateHeader(options, tokens, parser.Classname, parser.Basetype, parser.SymTable); parser.Reset(); } catch (NoViableAltException e) { Console.WriteLine("{0} {1}", e.Line, e.Message); _errorCount += 1; } catch (RewriteEmptyStreamException e) { if (options.VerboseLevel > 2) { Console.WriteLine(e.Message); } _errorCount += 1; } catch (ArgumentException e) { Console.WriteLine("{0} {1}", e.Source, e.Message); _errorCount += 1; } catch (NullReferenceException e) { Console.WriteLine("{0} {1}", e.Source, e.Message); _errorCount += 1; } #else Console.WriteLine("{0}", f); p.Parse(f); #endif } Console.WriteLine("xas done. {0} file(s) processed, {1} Error(s)", files.Length, _errorCount); #if DEBUG Console.ReadKey(); #endif } else { #if ANTLR AS3TLexer lex = new AS3TLexer(new ANTLRFileStream(options.InputFile)); TokenRewriteStream tokens = new TokenRewriteStream(lex); AS3TParser parser = new AS3TParser(tokens); parser.TemplateGroup = templates; parser.OutputPath = options.OutputDir; //parser.TemplateGroup = templates. try { parser.program(); generateSource(options, tokens, parser.Classname); generateHeader(options, tokens, parser.Classname, parser.Basetype, parser.SymTable); parser.Reset(); } catch (NoViableAltException e) { if (options.VerboseLevel > 2) { Console.WriteLine(e.Message); } } catch (RewriteEmptyStreamException e) { if (options.VerboseLevel > 2) { Console.WriteLine(e.Message); } } catch (ArgumentException e) { if (options.VerboseLevel > 2) { Console.WriteLine(e.Message); } } catch (NullReferenceException e) { if (options.VerboseLevel > 2) { Console.WriteLine(e.Message); } } Console.WriteLine("xas done. {0} file(s) processed, {1} Error(s)", 1, _errorCount); #if DEBUG Console.ReadKey(); #endif #else p.Parse(options.InputFile); #endif } }
public override void generate(string outputpath, Metadata meta, SymbolTable table) { base.generate(outputpath, meta, table); string path = outputpath + @"\"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } StreamWriter sourceFile = new StreamWriter(path + Basename + ".cpp", false); StreamWriter headerFile = new StreamWriter(path + Basename + ".h", false); sourceFile.WriteLine("/* Autogenerated by xas on {0} */", DateTime.Now); // write includes if (meta.Includes.Count > 0) { sourceFile.WriteLine("// includes"); foreach (String s in meta.Includes) { sourceFile.WriteLine("{0}", s); } } // write statics if (meta.Statics.Count > 0) { sourceFile.WriteLine("\n\n// statics"); foreach (String s in meta.Statics) { sourceFile.WriteLine("{0}\n", s); } } foreach (Symbol s in table) { switch (s.Storage) { case Symbol.STATIC: if (s.DefaultValue != null) { sourceFile.WriteLine("{0}::{1} = {2};\n", s.EnclosingType, s.Name, s.DefaultValue); } else { sourceFile.WriteLine("{0}::{1};\n", s.EnclosingType, s.Name); } break; default: break; } } #if DEBUG // dump symtab foreach (Symbol z in table) { sourceFile.WriteLine("//@ {0} {1} {2} {3} {4} ", z.Type, z.Name, z.Modifier, z.Scope, z.Storage); if (z.Storage == Symbol.STATIC) { sourceFile.WriteLine("//@ {0}::{1}", z.EnclosingName, z.Name); } } #endif // // write source // if (meta.Sources.Count > 0) { foreach (String s in meta.Sources) { string src = s; foreach (Symbol z in table) { if (s.Contains(z.Name)) { if (z.Storage == Symbol.STATIC) { src = src.Replace(z.Name, z.EnclosingName + "::" + z.Name); } break; } } sourceFile.WriteLine("{0}", src); } } StringBuilder sb = new StringBuilder(); // // write header (interface) // headerFile.WriteLine("/* Autogenerated by xas on {0} */", DateTime.Now); headerFile.WriteLine("namespace {0} {1}", meta.Namespace, "{"); foreach (Symbol s in table) { switch (s.Kind) { case Symbol.CLASS: switch (s.Scope) { case Symbol.PUBLIC: sb.AppendFormat("public class {0}({1}) ", s.Name, Parser3.RewriteArgs(s.Arguments)); break; case Symbol.PROTECTED: sb.AppendFormat("protected class {0}({1}) ", s.Name, Parser3.RewriteArgs(s.Arguments)); break; case Symbol.PRIVATE: sb.AppendFormat("private class {0}({1}) ", s.Name, Parser3.RewriteArgs(s.Arguments)); break; default: break; } if (s.ExtendedType != null) { sb.AppendFormat(": {0}()", s.ExtendedType); } if (s.ImplementedType != null) { sb.AppendFormat(", {0}", s.ImplementedType); } break; default: break; } } sb.Append(" {"); headerFile.WriteLine(sb.ToString()); if (meta.Headers.Count > 0) { foreach (String s in meta.Headers) { headerFile.WriteLine("{0}", s); } } headerFile.WriteLine("\n// Fields"); headerFile.WriteLine("public:\n"); foreach (Symbol s in table) { switch (s.Kind) { case Symbol.VARIABLE: if (s.Scope == Symbol.PUBLIC) { headerFile.WriteLine("\t{0} {1};", s.Type, s.Name); } break; default: break; } } headerFile.WriteLine("protected:\n"); foreach (Symbol s in table) { switch (s.Kind) { case Symbol.VARIABLE: if (s.Scope == Symbol.PROTECTED) { headerFile.WriteLine("\t{0} {1};", s.Type, s.Name); } break; default: break; } } headerFile.WriteLine("private:\n"); foreach (Symbol s in table) { switch (s.Kind) { case Symbol.VARIABLE: if (s.Scope == Symbol.PRIVATE) { headerFile.WriteLine("\t{0} {1};", s.Type, s.Name); } break; default: break; } } headerFile.WriteLine("\n// Constructors"); headerFile.WriteLine("public:\n"); foreach (Symbol s in table) { switch (s.Kind) { case Symbol.FUNCTION: if (s.Constructor) { headerFile.WriteLine("\t{0} {1}({2});\n", s.ReturnType, s.Name, Parser3.RewriteArgs(s.Arguments)); // Destructor headerFile.WriteLine("\t~{0}();\n", s.Name); } break; default: break; } } // public members headerFile.WriteLine("public:\n"); foreach (Symbol s in table) { switch (s.Scope) { case Symbol.PUBLIC: switch (s.Kind) { case Symbol.FUNCTION: if (!s.Constructor) { headerFile.WriteLine("\t{0} {1}({2});\n", s.ReturnType, s.Name, Parser3.RewriteArgs(s.Arguments)); } break; default: break; } break; default: break; } } // protected members headerFile.WriteLine("protected:\n"); foreach (Symbol s in table) { switch (s.Scope) { case Symbol.PROTECTED: switch (s.Kind) { case Symbol.FUNCTION: if (!s.Constructor) { headerFile.WriteLine("\t{0} {1}({2});\n", s.ReturnType, s.Name, Parser3.RewriteArgs(s.Arguments)); } break; default: break; } break; default: break; } } // protected members methods headerFile.WriteLine("private:\n"); foreach (Symbol s in table) { switch (s.Scope) { case Symbol.PRIVATE: switch (s.Kind) { case Symbol.FUNCTION: if (!s.Constructor) { headerFile.WriteLine("\t{0} {1}({2});\n", s.ReturnType, s.Name, Parser3.RewriteArgs(s.Arguments)); } break; default: break; } break; default: break; } } // terminate class headerFile.WriteLine("};"); headerFile.WriteLine("{0} // namespace {1}", "}", meta.Namespace); sourceFile.Close(); headerFile.Close(); }