//============================================================ //------------------------------------------------------------ // シンボルツリーのエラーを表示する。 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(); }
//------------------------------------------------------------ // 実行関数。 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(); } }
//------------------------------------------------------------ // コンストラクタ。 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; }