예제 #1
0
        //============================================================

        //------------------------------------------------------------
        // シンボルツリーのエラーを表示する。
        static void dumpSymbolTreeErrorInfo(SymbolTree aSymbolTree)
        {
            System.Console.Error.Write(
                "###########################################################" + System.Environment.NewLine
                + "# SymbolTreeError:" + aSymbolTree.GetErrorInfo().Kind.ToString() + System.Environment.NewLine
                + "#   line: " + aSymbolTree.GetErrorInfo().Token.posLine + System.Environment.NewLine
                + "#    col: " + aSymbolTree.GetErrorInfo().Token.posColumn + System.Environment.NewLine
                + "###########################################################" + System.Environment.NewLine
                );
            Assert.NotReachHere();
        }
예제 #2
0
        //------------------------------------------------------------
        // 実行関数。
        static public void Execute()
        {
            // テストケースを集める
            List <TestRecipe> testCaseList = new List <TestRecipe>();

            testCaseList.Add(testAdd());

            // テストを実行
            foreach (var entry in testCaseList)
            {
                // シンボル作成
                SymbolTree symbolTree = new SymbolTree();

                // モジュールを追加
                foreach (var code in entry.CodeRepos)
                {
                    // Lexer
                    var lexer = new Lexer(code);
                    if (lexer.IsError())
                    {
                        System.Console.Error.Write(
                            "###########################################################" + System.Environment.NewLine
                            + "# LexerError:" + lexer.GetErrorInfo().ErrorKind.ToString() + System.Environment.NewLine
                            + "#   line: " + lexer.GetErrorInfo().Line + System.Environment.NewLine
                            + "#    col: " + lexer.GetErrorInfo().Column + System.Environment.NewLine
                            + "###########################################################" + System.Environment.NewLine
                            );
                        Assert.NotReachHere();
                    }

                    // Parser
                    var parser = new Parser(lexer);
                    if (parser.GetErrorKind() != Parser.ErrorKind.NONE)
                    {
                        System.Console.Error.Write(
                            "###########################################################" + System.Environment.NewLine
                            + "# ParserError:" + parser.GetErrorKind().ToString() + System.Environment.NewLine
                            + "#   line: " + parser.GetErrorToken().posLine + System.Environment.NewLine
                            + "#    col: " + parser.GetErrorToken().posColumn + System.Environment.NewLine
                            + "###########################################################" + System.Environment.NewLine
                            );
                        Assert.NotReachHere();
                    }

                    // Add
                    if (!symbolTree.Add(parser.ModuleContext))
                    {
                        dumpSymbolTreeErrorInfo(symbolTree);
                    }
                }

                // 展開
                if (!symbolTree.Expand())
                {
                    dumpSymbolTreeErrorInfo(symbolTree);
                }
                Assert.Check(symbolTree.GetErrorInfo().Kind == SymbolTree.ErrorKind.NONE);

                // 各モジュールをダンプ
                symbolTree.XDataDump();
            }
        }
예제 #3
0
        //------------------------------------------------------------
        // コンストラクタ。
        Compiler(string aSrcListFilePath, string aOutputDirPath)
        {
            // 初期化
            mErrorList = new List <CompileError>();
            mIsSuccess = false;

            // ソースファイルリストをオープン
            string[] srcFilePathList = null;
            try
            {
                srcFilePathList = System.IO.File.ReadAllLines(aSrcListFilePath);
            }
            catch (Exception)
            {
                System.Console.Error.WriteLine("'" + aSrcListFilePath + "'を読み込めませんでした。");
                return;
            }

            // シンボルツリーを作成
            SymbolTree symbolTree = new SymbolTree();

            // 各ソースファイルのRead,Lexer,Parserを実行
            // todo: マルチスレッド対応。
            List <SrcFile> srcFiles = new List <SrcFile>();

            foreach (var srcFilePath in srcFilePathList)
            {
                // SrcFile作成
                SrcFile srcFile = null;
                {
                    string srcFileText = null;
                    try
                    {
                        srcFileText = System.IO.File.ReadAllText(srcFilePath);
                    }
                    catch (Exception)
                    {
                        // コンパイルエラー情報を作成
                        mErrorList.Add(new CompileError(
                                           CompileErrorKind.SYSTEM_CANT_OPEN_SRC_FILE
                                           , "'" + srcFilePath + "'を読み込めませんでした。"
                                           ));

                        // 次のソースへ
                        continue;
                    }
                    srcFile = new SrcFile(srcFilePath, srcFileText);
                }

                // Lexer
                var lexer = new Lexer(srcFile.Text);
                if (lexer.IsError())
                {
                    // todo:
                    // コンパイルエラー情報を作成

                    // 次のソースへ。
                    continue;
                }

                // Parser
                var parser = new Parser(lexer);
                if (parser.GetErrorKind() != Parser.ErrorKind.NONE)
                {
                    // todo:
                    // コンパイルエラー情報を作成

                    // 次のソースへ。
                    continue;
                }

                // Add to SymbolTree
                if (!symbolTree.Add(parser.ModuleContext))
                {
                    // todo:
                    // コンパイルエラー情報を作成

                    // 次のソースへ
                    continue;
                }
            }

            // エラーが発生していたら出力して中断
            if (mErrorList.Count != 0)
            {
                dumpError();
                return;
            }

            // 展開
            // todo: マルチスレッド対応
            if (!symbolTree.Expand())
            {
                // todo:
                // コンパイルエラー情報を作成

                // 終了
                return;
            }

            // ファイル出力
            symbolTree.WriteToXML(aOutputDirPath);

            // 問題なく終了
            mIsSuccess = true;
        }