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); }
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); }
public bool ParseProgram() { var files = new List <ASTFileNode>(); if (!ParserLoop(files)) { return(false); } Tree = new ASTProgramNode { Files = files }; return(true); }
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); }
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); }
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() }) })))); }
protected virtual bool Visit(ASTProgramNode node) => Visit(node.Files);