コード例 #1
0
ファイル: Program.cs プロジェクト: bencz/Zinnia-lang
    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);
        }
    }
コード例 #2
0
 public void AddFuncDefinition(FuncDefinition definition)
 {
     funcDefinitions.Add(definition);
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: bencz/Zinnia-lang
    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");
    }
コード例 #4
0
ファイル: Program.cs プロジェクト: bencz/Zinnia-lang
 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;
     }
 }