Пример #1
0
        public void TestImportGroupPreservesDelimiters()
        {
            string groupFile =
                "group GenerateHtml;" + newline +
                "import \"HtmlTemplates.stg\"" + newline +
                "entry() ::= <<" + newline +
                "$html()$" + newline +
                ">>" + newline;
            string htmlFile =
                "html() ::= <<" + newline +
                "<table style=\"stuff\">" + newline +
                ">>" + newline;

            string dir = tmpdir;

            writeFile(dir, "GenerateHtml.stg", groupFile);
            writeFile(dir, "HtmlTemplates.stg", htmlFile);

            TemplateGroup group = new TemplateGroupFile(dir + "/GenerateHtml.stg", '$', '$');

            // test html template directly
            Template st = group.GetInstanceOf("html");

            Assert.IsNotNull(st);
            string expected = "<table style=\"stuff\">";
            string result   = st.Render();

            Assert.AreEqual(expected, result);

            // test from entry template
            st = group.GetInstanceOf("entry");
            Assert.IsNotNull(st);
            expected = "<table style=\"stuff\">";
            result   = st.Render();
            Assert.AreEqual(expected, result);
        }
Пример #2
0
        public void TestNestedWithIndentAndTrackStartOfExpr()
        {
            string templates =
                "top(d) ::= <<  <d>!>>" + newline +
                "duh(chars) ::= <<" + newline +
                "x: <chars; anchor, wrap=\"\\n\">" + newline +
                ">>" + newline;

            writeFile(tmpdir, "t.stg", templates);
            TemplateGroup group = new TemplateGroupFile(Path.Combine(tmpdir, "t.stg"));

            Template top = group.GetInstanceOf("top");
            Template duh = group.GetInstanceOf("duh");

            duh.Add("chars", new string[] { "a", "b", "c", "d", "e" });
            top.Add("d", duh);
            //
            string expecting =
                "  x: ab" + Environment.NewLine +
                "     cd" + Environment.NewLine +
                "     e!";

            Assert.AreEqual(expecting, top.Render(7));
        }
Пример #3
0
        public void TestNestedIndentedExpr()
        {
            string templates =
                "top(d) ::= <<  <d>!>>" + newline +
                "duh(chars) ::= <<" + newline +
                "  <chars; wrap=\"\\n\">" + newline +
                ">>" + newline;

            writeFile(tmpdir, "t.stg", templates);
            TemplateGroup group = new TemplateGroupFile(Path.Combine(tmpdir, "t.stg"));

            Template top = group.GetInstanceOf("top");
            Template duh = group.GetInstanceOf("duh");

            duh.Add("chars", new string[] { "a", "b", "c", "d", "e" });
            top.Add("d", duh);
            string expecting =
                "    ab" + Environment.NewLine +
                "    cd" + Environment.NewLine +
                "    e!";

            // width=4 spaces + 2 char.
            Assert.AreEqual(expecting, top.Render(6));
        }
Пример #4
0
        public void TestImportTemplateInGroupFileFromGroupFile()
        {
            string dir       = tmpdir;
            string groupFile =
                "a() ::= \"g1 a\"\n" +
                "b() ::= \"<c()>\"\n";

            writeFile(dir, Path.Combine("x", "group.stg"), groupFile);

            groupFile =
                "b() ::= \"g2 b\"\n" +
                "c() ::= \"g2 c\"\n";
            writeFile(dir, Path.Combine("y", "group.stg"), groupFile);

            TemplateGroup group1 = new TemplateGroupFile(Path.Combine(dir, "x", "group.stg"));
            TemplateGroup group2 = new TemplateGroupFile(Path.Combine(dir, "y", "group.stg"));

            group1.ImportTemplates(group2);
            Template st       = group1.GetInstanceOf("b");
            string   expected = "g2 c";
            string   result   = st?.Render();

            Assert.AreEqual(expected, result);
        }
Пример #5
0
        public void TestEmptyGroupImportGroupFileSameDir()
        {
            /*
             * dir
             *  group1.stg		that imports group2.stg in same dir with just filename
             *  group2.stg		has c()
             */
            string dir       = tmpdir;
            string groupFile =
                "import \"group2.stg\"\n";

            writeFile(dir, "group1.stg", groupFile);

            groupFile =
                "c() ::= \"g2 c\"\n";
            writeFile(dir, "group2.stg", groupFile);

            TemplateGroup group1   = new TemplateGroupFile(Path.Combine(dir, "group1.stg"));
            Template      st       = group1.GetInstanceOf("c"); // should see c()
            string        expected = "g2 c";
            string        result   = st?.Render();

            Assert.AreEqual(expected, result);
        }
Пример #6
0
        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
            }
        }
        internal void Generate(Repository repository, DirectoryInfo outputDirectory)
        {
            TemplateGroup templateGroup = new TemplateGroupFile(this.fileInfo.FullName, '$', '$');

            templateGroup.ErrorManager = new ErrorManager(new LogAdapter());

            var configurationTemplate = templateGroup.GetInstanceOf(TemplateConfiguration);

            configurationTemplate.Add(RepositoryKey, repository);

            var configurationXml = new XmlDocument();

            configurationXml.LoadXml(configurationTemplate.Render());

            var location = new Location(outputDirectory);

            foreach (XmlElement generation in configurationXml.DocumentElement.SelectNodes(GenerationKey))
            {
                var templateName = generation.GetAttribute(TemplateKey);
                var template     = templateGroup.GetInstanceOf(templateName);
                var output       = generation.GetAttribute(OutputKey);

                template.Add(RepositoryKey, repository);

                if (generation.HasAttribute(InputKey))
                {
                    //var input = new Guid(generation.GetAttribute(InputKey));
                    //var objectType = repository.Find(input) as IObjectType;
                    //if (objectType != null)
                    //{
                    //    template.Add(ObjectTypeKey, objectType);
                    //}
                    //else
                    //{
                    //    var relationType = repository.Find(input) as RelationType;
                    //    if (relationType != null)
                    //    {
                    //        template.Add(RelationTypeKey, relationType);
                    //    }
                    //    else
                    //    {
                    //        var inheritance = repository.Find(input) as Inheritance;
                    //        if (inheritance != null)
                    //        {
                    //            template.Add(InheritanceKey, inheritance);
                    //        }
                    //        else
                    //        {
                    //            var methodType = repository.Find(input) as MethodType;
                    //            if (methodType != null)
                    //            {
                    //                template.Add(MethodTypeKey, methodType);
                    //            }
                    //            else
                    //            {
                    //                throw new ArgumentException(input + " was not found");
                    //            }
                    //        }
                    //    }
                    //}
                }

                var result = template.Render();
                location.Save(output, result);
            }
        }
Пример #8
0
        internal void Generate(MetaPopulation metaPopulation, DirectoryInfo outputDirectory, Log log)
        {
            var validation = metaPopulation.Validate();

            if (validation.ContainsErrors)
            {
                log.Error(this, "Meta population has validation errors.");
                foreach (var error in validation.Errors)
                {
                    log.Error(this, error.Message);
                }

                return;
            }

            try
            {
                TemplateGroup templateGroup = new TemplateGroupFile(this.fileInfo.FullName, '$', '$');

                templateGroup.ErrorManager = new ErrorManager(new LogAdapter(log));

                var configurationTemplate = templateGroup.GetInstanceOf(TemplateConfiguration);
                configurationTemplate.Add(MetaKey, metaPopulation);

                var configurationXml = new XmlDocument();
                configurationXml.LoadXml(configurationTemplate.Render());

                var location = new Location(outputDirectory);
                foreach (XmlElement generation in configurationXml.DocumentElement.SelectNodes(GenerationKey))
                {
                    var templateName = generation.GetAttribute(TemplateKey);
                    var template     = templateGroup.GetInstanceOf(templateName);
                    var output       = generation.GetAttribute(OutputKey);

                    template.Add(MetaKey, metaPopulation);

                    if (generation.HasAttribute(InputKey))
                    {
                        var input      = new Guid(generation.GetAttribute(InputKey));
                        var objectType = metaPopulation.Find(input) as IObjectType;
                        if (objectType != null)
                        {
                            template.Add(ObjectTypeKey, objectType);
                        }
                        else
                        {
                            var relationType = metaPopulation.Find(input) as RelationType;
                            if (relationType != null)
                            {
                                template.Add(RelationTypeKey, relationType);
                            }
                            else
                            {
                                var inheritance = metaPopulation.Find(input) as Inheritance;
                                if (inheritance != null)
                                {
                                    template.Add(InheritanceKey, inheritance);
                                }
                                else
                                {
                                    var methodType = metaPopulation.Find(input) as MethodType;
                                    if (methodType != null)
                                    {
                                        template.Add(MethodTypeKey, methodType);
                                    }
                                    else
                                    {
                                        throw new ArgumentException(input + " was not found");
                                    }
                                }
                            }
                        }
                        //TODO: Super Domains
                    }

                    var result = template.Render();
                    location.Save(output, result);
                }
            }
            catch (Exception e)
            {
                log.Error(this, "Generation error : " + e.Message + "\n" + e.StackTrace);
            }
        }
        internal void Generate(Domain domain, Settings settings, DirectoryInfo outputDirectory, Log log)
        {
            //if (!domain.IsValid)
            //{
            //    log.Error(this, "Domain " + domain + " has validation errors.");
            //    return;
            //}

            try
            {
                Repository.CheckAllorsVersion(this.Allors, this.fileInfo.Name);
            }
            catch (Exception e)
            {
                log.Error(this, e.Message);
            }

            try
            {
                TemplateGroup group = new TemplateGroupFile(this.fileInfo.FullName, '$', '$');

                group.ErrorManager = new ErrorManager(new LogAdapter(log));

                var configurationTemplate = group.GetInstanceOf(TemplateConfiguration);
                configurationTemplate.Add(DomainKey, domain);
                configurationTemplate.Add(SettingsKey, settings.CreateIndexedObject());

                var configurationXml = new XmlDocument();
                configurationXml.LoadXml(configurationTemplate.Render());

                var location = new Location(outputDirectory);
                foreach (XmlElement generation in configurationXml.DocumentElement.SelectNodes(GenerationKey))
                {
                    var template = group.GetInstanceOf(generation.GetAttribute(TemplateKey));
                    var output   = generation.GetAttribute(OutputKey);

                    template.Add(DomainKey, domain);
                    template.Add(SettingsKey, settings.CreateIndexedObject());
                    if (generation.HasAttribute(InputKey))
                    {
                        var input      = new Guid(generation.GetAttribute(InputKey));
                        var objectType = domain.Domain.Find(input) as ObjectType;
                        if (objectType != null)
                        {
                            template.Add(ObjectTypeKey, objectType);
                        }
                        else
                        {
                            var relationType = domain.Domain.Find(input) as RelationType;
                            if (relationType != null)
                            {
                                template.Add(RelationTypeKey, relationType);
                            }
                            else
                            {
                                var inheritance = domain.Domain.Find(input) as Inheritance;
                                if (inheritance != null)
                                {
                                    template.Add(InheritanceKey, inheritance);
                                }
                                else
                                {
                                    throw new ArgumentException(input + " was not found");
                                }
                            }
                        }
                        //TODO: Super Domains
                    }

                    var result = template.Render();
                    location.Save(output, result);
                }
            }
            catch (Exception e)
            {
                log.Error(this, "Generation error : " + e.Message + "\n" + e.StackTrace);
            }
        }
Пример #10
0
        internal void Generate(Model model, DirectoryInfo outputDirectory, Log log)
        {
            var validation = model.Validate();

            if (validation.HasErrors)
            {
                log.Error(this, "Model has validation errors.");
                foreach (var error in validation.Errors)
                {
                    log.Error(this, error);
                }

                return;
            }

            try
            {
                TemplateGroup templateGroup = new TemplateGroupFile(this.fileInfo.FullName, '$', '$')
                {
                    ErrorManager = new ErrorManager(new LogAdapter(log)),
                };
                templateGroup.RegisterRenderer(typeof(string), new StringRenderer());

                var configurationTemplate = templateGroup.GetInstanceOf(TemplateConfiguration);
                configurationTemplate.Add(ModelKey, model);

                var configurationXml = new XmlDocument();
                configurationXml.LoadXml(configurationTemplate.Render());

                var outputs = new HashSet <string>();

                var location = new Location(outputDirectory);
                foreach (XmlElement generation in configurationXml.DocumentElement.SelectNodes(GenerationKey))
                {
                    var templateName = generation.GetAttribute(TemplateKey);
                    var template     = templateGroup.GetInstanceOf(templateName);
                    var output       = generation.GetAttribute(OutputKey);

                    var initialOutput = output;
                    for (var i = 2; outputs.Contains(output); i++)
                    {
                        const char separator = '.';
                        var        split     = initialOutput.Split(separator);
                        split[0] = split[0] + "_" + i;
                        output   = string.Join(separator, split);
                    }

                    outputs.Add(output);

                    template.Add(ModelKey, model);

                    if (generation.HasAttribute(InputKey))
                    {
                        var input = generation.GetAttribute(InputKey);
                        switch (input)
                        {
                        case MenuKey:
                            template.Add(MenuKey, model.Menu);
                            break;

                        default:

                            var project = model.Project;

                            if (project.DirectiveById.TryGetValue(input, out var directive))
                            {
                                template.Add(DirectiveKey, directive);
                            }

                            break;
                        }
                    }

                    var result = template.Render();
                    location.Save(output, result);
                }
            }
            catch (Exception e)
            {
                log.Error(this, "Generation error : " + e.Message + "\n" + e.StackTrace);
            }
        }