コード例 #1
0
        private void PassExpr(String stop_chars = ";")
        {
            Token t        = new Token();
            int   count_br = 0;

            do
            {
                try
                {
                    t = scan.Read();
                    if (t.type == Token.Type.LBRACE)
                    {
                        count_br++;
                    }
                    else if (t.type == Token.Type.RBRACE)
                    {
                        count_br--;
                    }
                }
                catch (Scaner.Exception e)
                {
                    scan.Pass();
                    logger.Add(e);
                }
            }while (!(t.type == Token.Type.EOF ||
                      (t.GetStrVal().IndexOf(stop_chars) != -1 && !this.parse_args_declaraton) ||
                      (this.parse_block && (t.type == Token.Type.RBRACE || count_br <= 0)) ||
                      (this.parse_args_declaraton && (t.type == Token.Type.COMMA || scan.Peek().type == Token.Type.RPAREN))
                      ));
        }
コード例 #2
0
ファイル: main.cs プロジェクト: khomyakov42/Compiler
        static void Main(string[] args)
        {
            StreamReader istr = new StreamReader(Console.OpenStandardInput(), Console.InputEncoding);
            StreamWriter ostr = new StreamWriter(System.Console.OpenStandardOutput(), Console.OutputEncoding);

            if (args.Count() < 2)
            {
                Help();
                return;
            }

            bool low_opt = false, hight_opt = false;
            int index_in = 2, index_out = 3;

            switch (args[1])
            {
                case "-low":
                    low_opt = true;
                    break;
                case "-hight":
                    hight_opt = true;
                    break;
                case "-low-hight":
                    low_opt = hight_opt = true;
                    break;
                default:
                    index_in = 1;
                    index_out = 2;
                    break;
            }

            istr = new StreamReader(args[index_in]);
            if (index_out < args.Count())
            {
                ostr = new StreamWriter(args[index_out]);
            }

            Scaner scaner = null;
            Parser parser = null;
            Fasm.CodeGen codegen = null;
            switch (args[0])
            {
                case "-l":
                    scaner = new Scaner(istr);
                    Token t = null;
                    while (t == null || t.type != Token.Type.EOF)
                    {
                        try
                        {
                            t = scaner.Read();
                            Console.WriteLine(t.ToString());
                        }
                        catch (Scaner.Exception e)
                        {
                            ostr.WriteLine(e.Message);
                        }
                    }
                    break;
                case "-p":
                    parser = new Parser(new Scaner(istr));
                    parser.Parse();
                    parser.PrintTree(ostr);
                    ostr.WriteLine(parser.logger.ToString());
                    break;
                case "-c":
                    parser = new Parser(new Scaner(istr));
                    parser.Parse();
                    if (!parser.logger.isEmpty())
                    {
                        ostr.WriteLine(parser.logger.ToString());
                        break;
                    }
                    codegen = new Fasm.CodeGen(parser.tstack);
                    codegen.Generate(ostr);
                    break;
                case "-cexe":
                    parser = new Parser(new Scaner(istr));
                    parser.Parse();
                    if (!parser.logger.isEmpty())
                    {
                        ostr.WriteLine(parser.logger.ToString());
                        break;
                    }
                    codegen = new Fasm.CodeGen(parser.tstack);
                    codegen.Generate(ostr);
                    ostr.Flush();
                    ostr.Close();
                    if (index_out < args.Count())
                    {
                        Process.Start(new ProcessStartInfo
                        {
                            FileName = "C:/fasm/fasm.exe",
                            WindowStyle = ProcessWindowStyle.Hidden,
                            Arguments = string.Format("{0} {1}", args[index_out], args[index_out])
                        });
                    }
                    break;
                default:
                    Help();
                    return;
            }

            istr.Close();
            ostr.Close();
        }
コード例 #3
0
ファイル: main.cs プロジェクト: ALVirtualTech/MyCompiler
        public static bool Compile(string[] args)
        {
            StreamReader istr = new StreamReader(Console.OpenStandardInput(), Console.InputEncoding);
            StreamWriter ostr = new StreamWriter(System.Console.OpenStandardOutput(), Console.OutputEncoding);

            if (args.Count() < 2)
            {
                return(false);
            }


            int index_in = 1, index_out = 2;

            istr = new StreamReader(args[index_in]);
            if (index_out < args.Count())
            {
                ostr = new StreamWriter(args[index_out]);
            }

            Scaner scaner = null;
            Parser parser = null;

            Fasm.CodeGen codegen = null;
            switch (args[0])
            {
            case "-l":
                scaner = new Scaner(istr);
                Token t = null;
                while (t == null || t.type != Token.Type.EOF)
                {
                    try
                    {
                        t = scaner.Read();
                        Console.WriteLine(t.ToString());
                    }
                    catch (Scaner.Exception e)
                    {
                        ostr.WriteLine(e.Message);
                    }
                }
                break;

            case "-p":
                parser = new Parser(new Scaner(istr));
                parser.Parse();
                parser.PrintTree(ostr);
                ostr.WriteLine(parser.logger.ToString());
                break;

            case "-c":
                parser = new Parser(new Scaner(istr));
                parser.Parse();
                if (!parser.logger.isEmpty())
                {
                    ostr.WriteLine(parser.logger.ToString());
                    break;
                }
                codegen = new Fasm.CodeGen(parser.tstack);
                codegen.Generate(ostr);
                break;

            case "-cexe":
                parser = new Parser(new Scaner(istr));
                parser.Parse();
                if (!parser.logger.isEmpty())
                {
                    ostr.WriteLine(parser.logger.ToString());
                    break;
                }
                codegen = new Fasm.CodeGen(parser.tstack);
                codegen.Generate(ostr);
                ostr.Flush();
                ostr.Close();
                if (index_out < args.Count())
                {
                    Process.Start(new ProcessStartInfo
                    {
                        FileName    = "C:/fasm/fasm.exe",
                        WindowStyle = ProcessWindowStyle.Hidden,
                        Arguments   = string.Format("{0} {1}", args[index_out], args[index_out])
                    });
                }
                break;

            default:
                return(false);
            }

            istr.Close();
            ostr.Close();
            return(true);
        }