コード例 #1
0
ファイル: Compiler.cs プロジェクト: Nxun/Naive-Tiger
        public bool Compile()
        {
            try
            {
                ANTLRStringStream stream = new ANTLRStringStream(_source);
                TigerLexer lexer = new TigerLexer(stream);
                CommonTokenStream tokens = new CommonTokenStream(lexer);
                TigerParser parser = new TigerParser(tokens);

                AbstractSyntax.Expression result = parser.program();

                if (ErrorList.Count > 0)
                    return false;

                Mips.MipsFrame frame = new Mips.MipsFrame();

                FindEscape.FindEscape escape = new FindEscape.FindEscape();
                try
                {
                    escape.Find(result);
                }
                catch
                { }

                Semantics.Semantics semantics = new Semantics.Semantics(frame);
                Translate.Frag frag = semantics.TranslateProgram(result);

                if (ErrorList.Count > 0)
                    return false;

                using (_writer = File.CreateText(_output))
                {

                    for (Translate.Frag f = frag; f != null; f = f.Next)
                    {
                        if (f is Translate.ProcFrag)
                        {
                            EmitProcess(f as Translate.ProcFrag);
                        }
                        else
                        {
                            _writer.WriteLine((f as Translate.DataFrag).Data);
                        }
                    }

                    if (File.Exists(_runtime))
                    {
                        _writer.WriteLine(File.ReadAllText(_runtime));
                    }
                    else
                    {
                        throw new FatalError("mips runtime library not found");
                    }

                }
            }
            catch
            {
                return false;
            }
            if (ErrorList.Count > 0)
                return false;
            else
                return true;
        }
コード例 #2
0
        public bool Compile()
        {
            try
            {
                ANTLRStringStream stream = new ANTLRStringStream(_source);
                TigerLexer        lexer  = new TigerLexer(stream);
                CommonTokenStream tokens = new CommonTokenStream(lexer);
                TigerParser       parser = new TigerParser(tokens);

                AbstractSyntax.Expression result = parser.program();

                if (ErrorList.Count > 0)
                {
                    return(false);
                }

                Mips.MipsFrame frame = new Mips.MipsFrame();

                FindEscape.FindEscape escape = new FindEscape.FindEscape();
                try
                {
                    escape.Find(result);
                }
                catch
                { }

                Semantics.Semantics semantics = new Semantics.Semantics(frame);
                Translate.Frag      frag      = semantics.TranslateProgram(result);

                if (ErrorList.Count > 0)
                {
                    return(false);
                }

                using (_writer = File.CreateText(_output))
                {
                    for (Translate.Frag f = frag; f != null; f = f.Next)
                    {
                        if (f is Translate.ProcFrag)
                        {
                            EmitProcess(f as Translate.ProcFrag);
                        }
                        else
                        {
                            _writer.WriteLine((f as Translate.DataFrag).Data);
                        }
                    }

                    if (File.Exists(_runtime))
                    {
                        _writer.WriteLine(File.ReadAllText(_runtime));
                    }
                    else
                    {
                        throw new FatalError("mips runtime library not found");
                    }
                }
            }
            catch
            {
                return(false);
            }
            if (ErrorList.Count > 0)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }