コード例 #1
0
ファイル: Program.cs プロジェクト: jbakst/xas
        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
            }
        }
コード例 #2
0
        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();
        }