Exemplo n.º 1
0
 public void BeginFunction(string name, string returntype, SymbolList paramlist)
 {
     InFunction = new FunctionInfo {
         name = name, returntype = returntype, locals = paramlist
     };
 }
Exemplo n.º 2
0
        public static void Main(string[] args)
        {
            if (CommandLine.Parser.Default.ParseArguments(args, Options.Current))
            {
                foreach (var file in Options.Current.sourcefiles)
                {
                    CurrentProgram      = new Parser();
                    CurrentProgram.Name = file.Split('\\', '/').Last().ToUpper();
                    CurrentProgram.ReadMachineDesc();

                    CurrentProgram.ParseFile(file);


                    foreach (var ext in CurrentProgram.Externs)
                    {
                        Console.WriteLine(ext.progname);
                        foreach (var func in ext.Functions)
                        {
                            Console.WriteLine("  {0}:{1}", func.name, func.returntype);
                        }

                        foreach (var symbol in ext.Symbols)
                        {
                            Console.WriteLine("  {0}", symbol);
                        }
                    }


                    if (Options.Current.func)
                    {
                        Console.WriteLine("Functions:");
                    }
                    foreach (var func in CurrentProgram.Functions.Values)
                    {
                        CurrentFunction = func;
                        if (Options.Current.func)
                        {
                            Console.WriteLine("{0}:{1}", func.name, func.returntype);
                        }
                        func.AllocateLocals();

                        foreach (var field in func.localints)
                        {
                            if (Options.Current.func)
                            {
                                Console.WriteLine("  {0}:{1}", field.Key, field.Value);
                            }
                        }
                        foreach (var symbol in func.locals)
                        {
                            if (Options.Current.func)
                            {
                                Console.WriteLine("  " + symbol);
                            }
                        }
                        if (Options.Current.funcbody)
                        {
                            func.body.Print("| ");
                        }
                        var build = func.BuildFunction();
                        if (Options.Current.funcbodyraw)
                        {
                            foreach (var item in build)
                            {
                                Console.WriteLine("  {0}", item);
                            }
                        }

                        if (func.localints.Count > 0)
                        {
                            CurrentProgram.Types.Add("__li" + func.name, func.localints);
                        }

                        CurrentProgram.Symbols.Add(new Symbol
                        {
                            name     = func.name,
                            type     = SymbolType.Function,
                            frame    = PointerIndex.ProgConst,
                            datatype = "opcode",
                            data     = build.ConvertAll(inst => (Table)inst)
                        });

                        if (Options.Current.func)
                        {
                            Console.WriteLine();
                        }
                    }
                    CurrentFunction = null;

                    CurrentProgram.AllocateTypes();

                    if (Options.Current.typeinfo)
                    {
                        foreach (var typedata in CurrentProgram.Types)
                        {
                            Console.WriteLine("Type: {0}", typedata.Key);
                            if (typedata.Value.hasString)
                            {
                                Console.WriteLine("  _string_");
                            }
                            foreach (var field in typedata.Value)
                            {
                                Console.WriteLine("  {0}:{1}", field.Key, field.Value);
                            }
                        }
                    }

                    CurrentProgram.AllocateSymbols();

                    if (Options.Current.symtable)
                    {
                        Console.WriteLine();
                        Console.WriteLine("Symbols:");
                        foreach (var symbol in CurrentProgram.Symbols)
                        {
                            Console.WriteLine(symbol);
                        }
                    }

                    if (Options.Current.dumprom)
                    {
                        Console.WriteLine("Rom Data:");
                        foreach (var element in CurrentProgram.romdata)
                        {
                            Console.WriteLine(element.Evaluate());
                        }
                    }

                    CurrentProgram.MakeROM();
                }

                Console.ReadLine();
            }
        }