示例#1
0
        /// <summary>
        /// Parser to turn lg content into an <see cref="LGFile"/>.
        /// </summary>
        /// <param name="content">Text content contains lg templates.</param>
        /// <param name="id">id is the content identifier. If importResolver is null, id must be a full path string. </param>
        /// <param name="importResolver">resolver to resolve LG import id to template text.</param>
        /// <returns>new <see cref="LGFile"/> entity.</returns>
        public static LGFile ParseText(string content, string id = "", ImportResolverDelegate importResolver = null)
        {
            importResolver = importResolver ?? DefaultFileResolver;
            var lgFile      = new LGFile(content: content, id: id, importResolver: importResolver);
            var diagnostics = new List <Diagnostic>();

            try
            {
                var(templates, imports, invalidTemplateErrors) = AntlrParse(content, id);
                lgFile.Templates = templates;
                lgFile.Imports   = imports;
                diagnostics.AddRange(invalidTemplateErrors);

                lgFile.References = GetReferences(lgFile, importResolver);
                var semanticErrors = new StaticChecker(lgFile).Check();
                diagnostics.AddRange(semanticErrors);
            }
            catch (LGException ex)
            {
                diagnostics.AddRange(ex.Diagnostics);
            }
            catch (Exception err)
            {
                diagnostics.Add(BuildDiagnostic(err.Message, source: id));
            }

            lgFile.Diagnostics = diagnostics;

            return(lgFile);
        }
示例#2
0
        public void WariningTest(string input)
        {
            var engine = new TemplateEngine().AddFile(GetExampleFilePath(input));

            var report = new StaticChecker().CheckTemplates(engine.Templates);

            TestContext.WriteLine(string.Join("\n", report));
        }
示例#3
0
        public void AddNumberAndString()
        {
            var binAst = BinExpr(Num(1), Str("3"), "/");

            var staticChecker = new StaticChecker(new PrinterErrorListener());

            Assert.IsFalse(binAst.Accept(staticChecker));
        }
示例#4
0
        public void AddTwoNumbers()
        {
            var binAst = BinExpr(Num(1), Num(3), "+");

            var staticChecker = new StaticChecker(new PrinterErrorListener());

            Assert.IsTrue(binAst.Accept(staticChecker));
        }
示例#5
0
        public void SubtractNumberAndStringFails()
        {
            var binAst = BinExpr(Num(1), Str("3"), "-");

            var errorCollector = new PrinterErrorListener();
            var staticChecker  = new StaticChecker(errorCollector);

            Assert.IsFalse(binAst.Accept(staticChecker) && (errorCollector.Count != 0));
        }
示例#6
0
        public void SimpleIf()
        {
            var ast = If(BinExpr(Num(1), Num(1), ">"), Num(2), Num(3));

            var errorListener = new PrinterErrorListener();

            StaticChecker staticChecker = new StaticChecker(errorListener);

            Assert.IsTrue(ast.Accept(staticChecker) && errorListener.Count == 0);
        }
示例#7
0
        public void Variables1()
        {
            var let = Let(
                Decls(
                    VarDecl("x", Num(1))
                    ),
                Seq(Var("x")));

            var errors        = new PrinterErrorListener();
            var staticChecker = new StaticChecker(errors, InitialScope());

            Assert.IsTrue(let.Accept(staticChecker) && errors.Count == 0);
        }
示例#8
0
        public void EmptyLet()
        {
            var let = Let(
                Decls(
                    ),
                Seq());

            var errors        = new PrinterErrorListener();
            var staticChecker = new StaticChecker(errors, InitialScope());

            Assert.IsTrue(let.Accept(staticChecker));
            Assert.IsTrue(errors.Count == 0);
        }
示例#9
0
        public void BasicArrayInstantiationFail()
        {
            var arrayInstDecl = VarDecl("a", ArrayInst("intArray", Num(1), Num(5)));

            var let = Let(
                Decls(arrayInstDecl),
                Seq()
                );

            var errorCollector = new PrinterErrorListener();
            var staticChecker  = new StaticChecker(errorCollector, InitialScope());

            Assert.IsFalse(let.Accept(staticChecker));
            Assert.IsFalse(errorCollector.Count == 0);
        }
示例#10
0
        public void BasicArrayDeclarationFails()
        {
            var arrayDecl = ArrayDecl("intArray", "unknowntype");

            var let = Let(
                Decls(arrayDecl),
                Seq()
                );

            var errorCollector = new PrinterErrorListener();
            var staticChecker  = new StaticChecker(errorCollector, InitialScope());

            Assert.IsFalse(let.Accept(staticChecker));
            Assert.IsFalse(errorCollector.Count == 0);
        }
示例#11
0
        public void BasicArrayAccess()
        {
            var arrayDecl     = ArrayDecl("intArray", "int");
            var arrayInstDecl = VarDecl("a", ArrayInst("intArray", Num(1), Num(5)));

            var let = Let(
                Decls(arrayDecl, arrayInstDecl),
                Seq(ArrayAccess(Var("a"), Num(0)))
                );

            var errorCollector = new PrinterErrorListener();
            var staticChecker  = new StaticChecker(errorCollector, InitialScope());

            Assert.IsTrue(let.Accept(staticChecker));
            Assert.IsTrue(errorCollector.Count == 0);
            Assert.IsTrue(let.ReturnType == TigerType.GetType <IntType>());
        }
        /// <summary>
        /// Parser to turn lg content into a <see cref="Templates"/>.
        /// </summary>
        /// <param name="content">Text content contains lg templates.</param>
        /// <param name="id">id is the identifier of content. If importResolver is null, id must be a full path string. </param>
        /// <param name="importResolver">resolver to resolve LG import id to template text.</param>
        /// <param name="expressionParser">expressionEngine parser engine for parsing expressions.</param>
        /// <param name="cachedTemplates">give the file path and templates to avoid parsing and to improve performance.</param>
        /// <returns>new <see cref="Templates"/> entity.</returns>
        private static Templates InnerParseText(
            string content,
            string id = "",
            ImportResolverDelegate importResolver          = null,
            ExpressionParser expressionParser              = null,
            Dictionary <string, Templates> cachedTemplates = null)
        {
            cachedTemplates = cachedTemplates ?? new Dictionary <string, Templates>();
            if (cachedTemplates.ContainsKey(id))
            {
                return(cachedTemplates[id]);
            }

            importResolver = importResolver ?? DefaultFileResolver;
            var lg = new Templates(content: content, id: id, importResolver: importResolver, expressionParser: expressionParser);

            var diagnostics = new List <Diagnostic>();

            try
            {
                var(templates, imports, invalidTemplateErrors, options) = AntlrParse(content, id);
                lg.AddRange(templates);
                lg.Imports = imports;
                lg.Options = options;
                diagnostics.AddRange(invalidTemplateErrors);

                lg.References = GetReferences(lg, cachedTemplates);
                var semanticErrors = new StaticChecker(lg).Check();
                diagnostics.AddRange(semanticErrors);
            }
            catch (TemplateException ex)
            {
                diagnostics.AddRange(ex.Diagnostics);
            }
            catch (Exception err)
            {
                diagnostics.Add(BuildDiagnostic(err.Message, source: id));
            }

            lg.Diagnostics = diagnostics;

            return(lg);
        }
        /// <summary>
        /// Parser to turn lg content into a <see cref="Templates"/> based on the original LGFile.
        /// </summary>
        /// <param name="content">Text content contains lg templates.</param>
        /// <param name="lg">original LGFile.</param>
        /// <returns>new <see cref="Templates"/> entity.</returns>
        public static Templates ParseTextWithRef(string content, Templates lg)
        {
            if (lg == null)
            {
                throw new ArgumentNullException(nameof(lg));
            }

            var id          = "inline content";
            var newLG       = new Templates(content: content, id: id, importResolver: lg.ImportResolver, options: lg.Options);
            var diagnostics = new List <Diagnostic>();

            try
            {
                var(templates, imports, invalidTemplateErrors, options) = AntlrParse(content, id);
                newLG.AddRange(templates);
                newLG.Imports = imports;
                newLG.Options = options;
                diagnostics.AddRange(invalidTemplateErrors);

                newLG.References = GetReferences(newLG, newLG.ImportResolver)
                                   .Union(lg.References)
                                   .Union(new List <Templates> {
                    lg
                })
                                   .ToList();

                var semanticErrors = new StaticChecker(newLG).Check();
                diagnostics.AddRange(semanticErrors);
            }
            catch (TemplateException ex)
            {
                diagnostics.AddRange(ex.Diagnostics);
            }
            catch (Exception err)
            {
                diagnostics.Add(BuildDiagnostic(err.Message, source: id));
            }

            newLG.Diagnostics = diagnostics;

            return(newLG);
        }
示例#14
0
        public void FunctionWithRepeatedParameters()
        {
            var functionAst = Fun("add",
                                  Parameters(
                                      Param("a", "int"),
                                      Param("a", "int")
                                      ),
                                  BinExpr(Var("a"), Var("a"), "+"),
                                  "int");

            var let = Let(
                Decls(functionAst),
                Seq()
                );

            var errorCollector = new PrinterErrorListener();
            var staticChecker  = new StaticChecker(errorCollector);

            Assert.IsFalse(let.Accept(staticChecker));
            Assert.IsFalse(errorCollector.Count == 0);
        }
示例#15
0
        /// <summary>
        /// Compila el codigo que se encuentra en el fichero filename
        /// </summary>
        /// <param name="filename">El fichero a compilar</param>
        /// <param name="typeName">El nombre del tipo que contendra las funciones que se definan</param>
        /// <returns>Retorna una lista con los errores que se produjeron</returns>
        private IEnumerable <AnalysisError> Compile(string filename, string typeName)
        {
            var s           = new StreamReader(filename);
            var stm         = new AntlrInputStream(s);;
            var lexer       = new TigerLexer(stm);
            var tokenStream = new CommonTokenStream(lexer);
            var parser      = new BengalaParser(tokenStream);

            parser.ConfigErrorListeners();
            var expContext = parser.program();

            var contextVisitor = new BuildAstVisitor();

            var errorsWarning = parser.Errors;

            if (parser.NumberOfSyntaxErrors != 0 || parser.Errors.Any())
            {
                return(errorsWarning);
            }

            var astRoot = expContext.Accept(contextVisitor);

            var generalScope = new Scope(null);

            init = new Inizializator <ILCode>(generalScope);
            InitScope(generalScope);

            var errorListener         = new BengalaBaseErrorListener();
            var staticAnalysisVisitor = new StaticChecker(errorListener, generalScope);

            astRoot.Accept(staticAnalysisVisitor);

            if (GenerateCode && !errorListener.Errors.Any())
            {
                CreateCode(FileName(filename), typeName, astRoot);
            }

            return(errorListener.Errors);
        }