public override SemanticCheckResult VisitProgram(ASTProgramNode Program)
        {
            //Creating All Types
            foreach (var type in Program.Clases)
            {
                var noSelftype = !Types.IsSelfType(type.TypeName);

                Program.SemanticCheckResult.Ensure(!Types.IsSelfType(type.TypeName),
                                                   new Lazy <Error>(() => new Error($"Not Allowed {type.TypeName}", ErrorKind.SemanticError, type.Type.Line, type.Type.Column)));
                if (!noSelftype)
                {
                    return(Program.SemanticCheckResult);
                }

                var exist = CompilationUnit.TypeEnvironment.GetTypeDefinition(type.TypeName, Program.SymbolTable, out var _);
                Program.SemanticCheckResult.Ensure(!exist,
                                                   new Lazy <Error>(() => new Error($"Multiple Definitions for class {type.TypeName}", ErrorKind.TypeError, type.Type.Line, type.Type.Column)));
                if (!exist && !Types.IsSelfType(type.TypeName))
                {
                    CompilationUnit.TypeEnvironment.AddType(type.SymbolTable);
                }
            }

            //Inheritance
            foreach (var type in Program.Clases)
            {
                Program.SemanticCheckResult.Ensure(type.Accept(this));
            }

            Program.SemanticCheckResult.Ensure(CompilationUnit.NotCyclicalInheritance(),
                                               new Lazy <Error>(() => new Error("Detected Cyclical Inheritance", ErrorKind.SemanticError)));

            return(Program.SemanticCheckResult);
        }
Esempio n. 2
0
 public override SemanticCheckResult VisitProgram(ASTProgramNode Program)
 {
     foreach (var item in Program.Clases)
     {
         Program.SemanticCheckResult.Ensure(item.Accept(this));
     }
     return(Program.SemanticCheckResult);
 }
 public virtual T VisitProgram(ASTProgramNode Program)
 {
     foreach (var item in Program.Clases)
     {
         item.Accept(this);
     }
     return(default(T));
 }
 public override SemanticCheckResult VisitProgram(ASTProgramNode Program)
 {
     foreach (var item in Program.Clases)
     {
         Program.SemanticCheckResult.Ensure(item.Accept(this));
     }
     Program.SemanticCheckResult.Ensure(CompilationUnit.HasEntryPoint(), new Lazy <Error>(() => new Error("No Entry Point Detected", ErrorKind.SemanticError)));
     return(Program.SemanticCheckResult);
 }
Esempio n. 5
0
        public bool ParseProgram()
        {
            var files = new List <ASTFileNode>();

            if (!ParserLoop(files))
            {
                return(false);
            }

            Tree = new ASTProgramNode {
                Files = files
            };

            return(true);
        }
Esempio n. 6
0
        public bool ParseProgram(TextReader reader)
        {
            var files  = new List <ASTFileNode>();
            var parser = new Parser(reader, this);

            var fileNode = parser.ParseFile();

            if (fileNode == null)
            {
                return(false);
            }

            files.Add(fileNode);

            ParserLoop(files);

            Tree = new ASTProgramNode {
                Files = files
            };

            return(true);
        }
Esempio n. 7
0
        protected override bool Visit(ASTProgramNode node)
        {
            _includes.Add(new CInclude {
                Name = "inttypes", Standard = true
            });
            _includes.Add(new CInclude {
                Name = "string", Standard = true
            });

            // typedef struct { void* data; int64_t count; } ArrayName;
            _structs.Add(new CStruct
            {
                Name       = ArrayName,
                Enumerable = new []
                {
                    new CStruct.Field
                    {
                        Type = new CPointer {
                            Child = new CSymbol {
                                Name = "void"
                            }
                        },
                        Name = "data"
                    },
                    new CStruct.Field
                    {
                        Type = new CSymbol {
                            Name = "int64_t"
                        },
                        Name = "count"
                    }
                }
            });

            // ArrayName CreateStringProcedure(char* c) { return (ArrayName){ .data = c, .count = strlen(c) }; };
            _functions.Add(new CFunction
            {
                Return = new CSymbol {
                    Name = ArrayName
                },
                Name      = CreateStringProcedure,
                Arguments = new []
                {
                    new CFunction.Argument
                    {
                        Type = new CPointer {
                            Child = new CSymbol {
                                Name = "char"
                            }
                        },
                        Name = "c"
                    },
                },
                Block = new CBlock
                {
                    Statements = new []
                    {
                        new CReturn
                        {
                            Child = new CStructInitializer
                            {
                                Type = new CSymbol {
                                    Name = ArrayName
                                },
                                Fields = new []
                                {
                                    new CStructInitializer.Field {
                                        Name = "data", Value = new CSymbol {
                                            Name = "c"
                                        }
                                    },
                                    new CStructInitializer.Field {
                                        Name  = "count",
                                        Value = new CCall
                                        {
                                            Callee = new CSymbol {
                                                Name = "strlen"
                                            },
                                            Arguments = new [] { new CSymbol {
                                                                     Name = "c"
                                                                 } }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            });

            if (!base.Visit(node))
            {
                return(false);
            }

            Result = new CProgram
            {
                Functions = _functions,
                Globals   = _globalScole,
                Includes  = _includes,
                Structs   = _structs,
                Typedefs  = _typedefs
            };

            return(true);
        }
Esempio n. 8
0
 public ASTCILNode VisitProgram(ASTProgramNode Program)
 {
     return(new ASTCILProgramNode
            (
                Program.Clases.Select(x => (ASTCILTypeNode)x.Accept(this))
                .Append(new ASTCILTypeNode(compilationUnit.TypeEnvironment.Int,
                                           compilationUnit.MethodEnvironment.GetVirtualTable(compilationUnit.TypeEnvironment.Int),
                                           new ASTCILFuncNode[]
     {
         new ASTCILFuncNode(labelIlGenerator.GenerateInit(compilationUnit.TypeEnvironment.Int.Name), compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.Int, Functions.Init),
                            new[] { new ASTCILSelfNode() })          //TODO: assign the value attribute for the boxed int
     }))
                .Append(new ASTCILTypeNode(compilationUnit.TypeEnvironment.Bool,
                                           compilationUnit.MethodEnvironment.GetVirtualTable(compilationUnit.TypeEnvironment.Bool),
                                           new ASTCILFuncNode[] {
         new ASTCILFuncNode(labelIlGenerator.GenerateInit(compilationUnit.TypeEnvironment.Bool.Name), compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.Bool, Functions.Init),
                            new[] { new ASTCILSelfNode() })          //TODO: assign the value attribute for the boxed int
     }))
                .Append(new ASTCILTypeNode(compilationUnit.TypeEnvironment.IO,
                                           compilationUnit.MethodEnvironment.GetVirtualTable(compilationUnit.TypeEnvironment.IO),
                                           new ASTCILFuncNode[]
     {
         new ASTCILIOInIntNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.IO, Functions.InInt), labelIlGenerator),
         new ASTCILIOInStringNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.IO, Functions.InString), labelIlGenerator),
         new ASTCILIOOutIntNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.IO, Functions.OutInt), labelIlGenerator),
         new ASTCILIOOutStringNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.IO, Functions.OutString), labelIlGenerator),
         new ASTCILFuncNode(labelIlGenerator.GenerateInit(compilationUnit.TypeEnvironment.IO.Name), compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.IO, Functions.Init),
                            new[] { new ASTCILSelfNode() })
     }))
                .Append(new ASTCILTypeNode(compilationUnit.TypeEnvironment.Object,
                                           compilationUnit.MethodEnvironment.GetVirtualTable(compilationUnit.TypeEnvironment.Object),
                                           new[]
     {
         //Abort function
         new ASTCILFuncNode(labelIlGenerator.GenerateFunc(Types.Object, Functions.Abort),
                            compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.Object, Functions.Abort),
                            new[] { new ASTCILRuntimeErrorNode(RuntimeErrors.ObjectAbort) }),
         new ASTCILObjectTypeNameNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.Object, Functions.Type_Name), labelIlGenerator),
         new ASTCILObjectCopyNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.Object, Functions.Copy), labelIlGenerator),
         new ASTCILFuncNode(labelIlGenerator.GenerateInit(compilationUnit.TypeEnvironment.Object.Name),
                            compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.Object, Functions.Init),
                            new[] { new ASTCILSelfNode() })
     }))
                .Append(new ASTCILTypeNode(compilationUnit.TypeEnvironment.String,
                                           compilationUnit.MethodEnvironment.GetVirtualTable(compilationUnit.TypeEnvironment.String),
                                           new []
     {
         //Length function
         new ASTCILFuncNode(labelIlGenerator.GenerateFunc(Types.String, Functions.Length),
                            compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.String, Functions.Length),
                            new[]
         {
             new ASTCILGetAttrNode(compilationUnit.TypeEnvironment.String.SymbolTable.GetObject(Attributes.StringLength))
         }),
         new ASTCILStringConcatNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.String, Functions.Concat), labelIlGenerator),
         new ASTCILStringSubStrNode(compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.String, Functions.Substr), labelIlGenerator),
         new ASTCILFuncNode(labelIlGenerator.GenerateInit(compilationUnit.TypeEnvironment.String.Name),
                            compilationUnit.MethodEnvironment.GetMethod(compilationUnit.TypeEnvironment.String, Functions.Init),
                            new[] { new ASTCILSelfNode() })
     }))));
 }
Esempio n. 9
0
 protected virtual bool Visit(ASTProgramNode node) => Visit(node.Files);