Stmt ParseStmt() { Modifier modifier = ParseModifier(); IList <string> name1 = ParseName(); // Type of Variable IList <string> name2 = ParseName(); // Variable string symb = GetSymbol(); if (name1.Count > 0 && name2.Count > 0 && symb == "(") { FuncDefinition result = new FuncDefinition(); result.Modifier = modifier; result.Type = new AType(); result.Type.Name = name1; result.Name = name2[0]; result.Args = ParseArguments(); Skip(":"); result.Body = ParseCompoundStmt(); return(result); } else if (name1.Count > 0 && name2.Count > 0 && symb == "=") { VarDeclaration var = new VarDeclaration(); var.Type = new AType(); var.Type.Name = name1; var.Name = name2[0]; var.Expr = ParseExpr(); Skip(";"); return(var); } else if (name1.Count > 0 && name2.Count == 0 && symb == "=") { VarDeclaration result = new VarDeclaration(); return(result); } else if (name1.Count > 0 && name2.Count == 0 && symb == "(") {// Ex. hello.Print(str); ExprStmt stmt = new ExprStmt(); stmt.Expr = ParseFuncCall(false, name1); return(stmt); } else { ExprStmt stmt = new ExprStmt(); stmt.Expr = ParseExpr(); return(stmt); } }
public void AddFuncDefinition(FuncDefinition definition) { funcDefinitions.Add(definition); }
public CodeGenerator(IList <Class> classes, string moduleName) { AssemblyName name = new AssemblyName(moduleName); AssemblyBuilder asmb = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Save); ModuleBuilder moduleBuilder = asmb.DefineDynamicModule(moduleName + ".exe"); typeTable = new Dictionary <string, TypeBuilder>(); ctorTable = new Dictionary <string, ConstructorBuilder>(); funcTable = new Dictionary <string, MethodBuilder>(); foreach (Class cls in classes) { TypeBuilder typeBuilder = moduleBuilder.DefineType(cls.Name, TypeAttributes.Class); ConstructorBuilder ctorBuilder = typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); typeTable[cls.Name] = typeBuilder; ctorTable[cls.Name] = ctorBuilder; foreach (Stmt stmt in cls.Stmts) { if (stmt is VarDeclaration) { Console.WriteLine("VarDecl: todo"); } else if (stmt is FuncDefinition) { symbolTable = new Dictionary <string, object>(); FuncDefinition func = (FuncDefinition)stmt; MethodAttributes attr = func.Modifier.Access == Access.PUBLIC ? MethodAttributes.Public : MethodAttributes.Private; if (func.Modifier.fStatic) { attr |= MethodAttributes.Static; } fStaticFunc = func.Modifier.fStatic; IList <Argument> args = func.Args; Type[] types = new Type[args.Count]; for (int n = 0; n < args.Count; n++) { types[n] = args[n].Type.GetAType(); symbolTable[args[n].Name] = n; } MethodBuilder funcBuilder = typeBuilder.DefineMethod(func.Name, attr, func.Type.GetAType(), types); //funcTable[cls.Name + "::" + func.Name] = funcBuilder; funcTable[func.Name] = funcBuilder; ILGenerator il = funcBuilder.GetILGenerator(); foreach (Stmt stmt1 in func.Body) { GenStmt(stmt1, il, types); } il.Emit(OpCodes.Ret); if (func.Name == "Main") { asmb.SetEntryPoint(funcBuilder); } } else { throw new System.Exception("CodeGenerator: stmt is " + stmt); } } typeBuilder.CreateType(); } moduleBuilder.CreateGlobalFunctions(); asmb.Save(moduleName + ".exe"); }
Stmt ParseStmt() { Modifier modifier = ParseModifier(); IList<string> name1 = ParseName(); // Type of Variable IList<string> name2 = ParseName(); // Variable string symb = GetSymbol(); if (name1.Count > 0 && name2.Count > 0 && symb == "(") { FuncDefinition result = new FuncDefinition(); result.Modifier = modifier; result.Type = new AType(); result.Type.Name = name1; result.Name = name2[0]; result.Args = ParseArguments(); Skip(":"); result.Body = ParseCompoundStmt(); return result; } else if (name1.Count > 0 && name2.Count > 0 && symb == "=") { VarDeclaration var = new VarDeclaration(); var.Type = new AType(); var.Type.Name = name1; var.Name = name2[0]; var.Expr = ParseExpr(); Skip(";"); return var; } else if (name1.Count > 0 && name2.Count == 0 && symb == "=") { VarDeclaration result = new VarDeclaration(); return result; } else if (name1.Count > 0 && name2.Count == 0 && symb == "(") {// Ex. hello.Print(str); ExprStmt stmt = new ExprStmt(); stmt.Expr = ParseFuncCall(false, name1); return stmt; } else { ExprStmt stmt = new ExprStmt(); stmt.Expr = ParseExpr(); return stmt; } }