private static void ValidateEntryPoint(CodeGenerator generator, RppOptions options, Diagnostic diagnostic) { if (options.Library == false && !generator.HasMain()) { diagnostic.Error(101, "Program doesn't contain a valid entry point"); } }
public override IRppNode Analyze(SymbolTable scope, Diagnostic diagnostic) { if (InitExpr is RppEmptyExpr && IsLocalSemantic) { diagnostic.Error(102, "local variable must be initialized"); return this; } // Don't capture variables declared inside closure CanBeCaptured = scope.GetEnclosingType()?.Name != RppClosure.TempClosureTypeName; // We have 2 cases when type is omited, so we need to get it from initializing expression // and when type is specified so we need to resolve it and if there is a closure, propagate that // to init expression if (Type.IsDefined()) { Type.Resolve(scope); InitExpr = TypeInference.ReplaceUndefinedClosureTypesIfNeeded(InitExpr, Type, new List<RType>()); InitExpr = (IRppExpr) InitExpr.Analyze(scope, diagnostic); } else { InitExpr = (IRppExpr) InitExpr.Analyze(scope, diagnostic); Type = InitExpr.Type; } if (IsLocalSemantic) { scope.AddLocalVar(Name, Type.Value, this); } if (!(InitExpr is RppEmptyExpr)) { if (ImplicitCast.CanCast(InitExpr.Type.Value, Type.Value)) { InitExpr = ImplicitCast.CastIfNeeded(InitExpr, Type.Value); } else { throw SemanticExceptionFactory.TypeMismatch(Token, Type.Value.Name, InitExpr.Type.Value.Name); } } return this; }
public static CodeGenerator Compile(Action<RppProgram> parseFactory, Diagnostic diagnostic, [CanBeNull] Assembly stdlibAssembly, string fileName = "<buffer>") { RppProgram program = new RppProgram(); SymbolTable runtimeScope = new SymbolTable(); RppTypeSystem.PopulateBuiltinTypes(runtimeScope); WireRuntime(runtimeScope); if (stdlibAssembly != null) { WireAssembly(runtimeScope, stdlibAssembly); } try { parseFactory(program); CodeGenerator generator = new CodeGenerator(program, fileName); Type2Creator typeCreator = new Type2Creator(); program.Accept(typeCreator); program.PreAnalyze(runtimeScope); InheritanceConfigurator2 configurator = new InheritanceConfigurator2(); program.Accept(configurator); CreateRType createRType = new CreateRType(diagnostic); program.Accept(createRType); SemanticAnalyzerStage1 semanticStage1 = new SemanticAnalyzerStage1(diagnostic); program.Accept(semanticStage1); program.Analyze(runtimeScope, null); SemanticAnalyzer semantic = new SemanticAnalyzer(diagnostic); program.Accept(semantic); InitializeNativeTypes initializeNativeTypes = new InitializeNativeTypes(generator.Module); program.Accept(initializeNativeTypes); CreateNativeTypes createNativeTypes = new CreateNativeTypes(); program.Accept(createNativeTypes); generator.Generate(); return generator; } catch (SemanticException e) { diagnostic.Error(e.Code, e.Message); return null; } catch (ParserException e) { diagnostic.Error(e.Code, e.Message); return null; } }