/** GUI setup */ spqrMainWindow::spqrMainWindow(int argc, char *argv[], QWidget *parent) : QMainWindow(parent), MruHelper("spqr") { statusBar()->showMessage(tr("spqr Setup")); lqPreferences p; p.loadGeometry(this); con = new ConsoleEdit(argc, argv); connect(con, SIGNAL(engine_ready()), this, SLOT(engineReady())); make_tabs(); QMenu *m = menuBar()->addMenu(tr("&File")); m->setStatusTip(tr("Show File operations")); m->addAction(tr("&New..."), this, SLOT(newFile()), QKeySequence::New)->setStatusTip(tr("Create a new file")); m->addAction(tr("&Open..."), this, SLOT(openFile()), QKeySequence::Open)->setStatusTip(tr("Open an existing file")); m->addMenu(mruMenu = new QMenu(tr("Recent &Files...")))->setStatusTip(tr("List recently opened files")); loadMru(p, this); m->addSeparator(); m->addAction(tr("&Save"), this, SLOT(saveFile()), QKeySequence::Save)->setStatusTip(tr("Save the document to disk")); m->addAction(tr("Save &As..."), this, SLOT(saveFileAs()), QKeySequence::SaveAs)->setStatusTip(tr("Save the document under a new name")); m->addSeparator(); m->addAction(tr("&Quit"), qApp, SLOT(quit()), QKeySequence::Quit)->setStatusTip(tr("Exit the application")); // detach the background processor to avoid a random GPF exiting the program connect(qApp, &QApplication::aboutToQuit, []() { SwiPrologEngine::quit_request(); }); menuBar()->addSeparator(); menuBar()->addAction("&Exec", this, SLOT(execSource()))->setStatusTip(tr("Run Prolog Source code")); menuBar()->addAction("&Source", this, SLOT(viewSource()))->setStatusTip(tr("Show the Prolog source window")); menuBar()->addAction("&Console", this, SLOT(viewConsole()))->setStatusTip(tr("Show the SWI-Prolog console")); menuBar()->addAction("&Help", this, SLOT(viewHelp()))->setStatusTip(tr("Show SWI-Prolog helpDoc")); lastDir = p.value("lastDir").toString(); QString currFile = p.value("fileSource").toString(); if (argc >= 2) currFile = argv[1]; if (currFile.length()) openSourceFile(currFile); }
int main(int argc, char *argv[]){ char preprocess_file_name[FILE_PATH]; char output_file_name[FILE_PATH]; FILE *target_source_file, *output; TYPEDEF_TABLE_LIST *typedef_table_list_zen, *typedef_table_list; STRUCT_TABLE_LIST *struct_table_list; VARIABLE_TABLE_LIST *variable_table_list_zen, *variable_table_list; ValidateVariableList *varidate_variable_list; ValidateStatementList *validate_statement_list; INCLUDE_LIST *include_list; ForInformationList *for_information_list; FUNCTION_INFORMATION_LIST *function_information_list; EXPR_SLICING_LIST *expr_slicing_list; AST *pre_programAST, *programAST; //フラグデータベースの設定 int flag_database = getFlagDatabase(argc, argv); //ヘルプモードが含まれていたらヘルプだけ表示させる if(isHelpMode(flag_database)){ viewHelp(); } //そうでなければ、検証式付加処理に進める else{ int i; //フラグを飛ばす for(i = 1;i < argc && strlen(argv[i]) >= 2 && ( argv[i][0] == '-' && argv[i][1] == '-' ); i++); if(i == argc){ fprintf(stderr, "開くファイル名が存在しません!\n"); exit(1); } if(argc >= ENABLE_ARGUMENT){ //ファイル名を設定する(これは他のエラー処理などでファイル名を表示させるようにするために必要) setFileName(argv[i]); //前処理に成功した場合 if(preProcesser(argv[i])){ //プリプロセス後のファイル名の設定 snprintf(preprocess_file_name, FILE_PATH, "%s_out.c_pre.c", argv[i]); //インクルードファイルリストを取得 include_list = INCLUDE_LIST_new(); readIncludeDataFromFile(preprocess_file_name, include_list); target_source_file = fopen(preprocess_file_name, "r"); if(target_source_file != NULL){ //ここから変数宣言の分割処理 pre_programAST = parserANSIC(target_source_file, &typedef_table_list_zen); //ASTノードに、返却の型名・ブロックレベル・ブロックIDを付加する。 setASTReturnType(pre_programAST); setASTBlocklevelAndId(pre_programAST); //AST木から変数テーブルを生成 variable_table_list_zen = VARIABLE_TABLE_LIST_new(); getVARIABLE_TABLE_LIST(variable_table_list_zen, pre_programAST); printVARIABLE_TABLE_LIST(variable_table_list_zen); fclose(target_source_file); //分割後を出力させるために同じファイルに上書きさせる output = fopen(preprocess_file_name, "w"); OutputSourceAfterDivitionDeclarator(output, pre_programAST, variable_table_list_zen); fclose(output); //ここまで変数宣言の分割処理 //ソースファイルを開ける(ここは確実に開けるので、チェック機構はなしにする) target_source_file = fopen(preprocess_file_name, "r"); programAST = parserANSIC(target_source_file, &typedef_table_list); //ASTノードに、返却の型名・ブロックレベル・ブロックIDを付加する。 setASTReturnType(programAST); setASTBlocklevelAndId(programAST); //XMLモードである場合 if(isXmlMode(flag_database)){ //AST木全体をXMLとして出力する traverseASTwithXML(programAST, 0); printTargetASTNode(programAST, "array_access", 1, 1); printTargetASTNode(programAST, "direct_ref", 1, 1); printTargetASTNode(programAST, "expression_statement", 1, 1); printTargetASTNode(programAST, "function_definition", 1, 1); printTargetASTNode(programAST, "if_statement",1, 1); }else{ //AST木全体を出力する //traverseAST(programAST, 0); //AST木からプログラムを出力する //int tmp = 1; //printDataFromAST(programAST, &tmp); //AST木から生成したTYPEDEFテーブルを表示 //printTYPEDEF_TABLE_LIST(typedef_table_list); //AST木から構造体テーブルを生成して出力 struct_table_list = STRUCT_TABLE_LIST_new(); getSTRUCT_TABLE_DATA(struct_table_list, programAST); //printSTRUCT_TABLE_LIST(struct_table_list); //AST木から変数テーブルを生成して出力 variable_table_list = VARIABLE_TABLE_LIST_new(); getVARIABLE_TABLE_LIST(variable_table_list, programAST); getParameterVARIABLE_TABLE_LIST(variable_table_list, programAST); //変数テーブルから検証用変数テーブルを生成して出力 varidate_variable_list = ValidateVariableList_new(); getValidate_Variable(variable_table_list, varidate_variable_list); //printVALIDATE_VARIABLE_LIST(varidate_variable_list); //関数に関するリストを生成して出力 function_information_list = FUNCTION_INFORMATION_LIST_new(); getFunctionInformation(function_information_list, programAST); getFunctionInformationFromFile(function_information_list, "./Standard_library.ini"); printFUNCTION_INFORMATION_LIST(function_information_list); //(実験)指定されたASTの情報を出力 //printTargetASTNode(programAST, "call_function", 0, 0); //printTargetASTNode(programAST, "direct_ref", 0, 0); //printTargetASTNode(programAST, "assignment_expression", 0, 0); //printTargetASTNode(programAST, "expression_statement", 0, 0); //変数一覧表の初期化 initializeVariableOfStatementList(); //検証式の生成 validate_statement_list = ValidateStatementList_new(); for_information_list = ForInformationList_new(); createValidateStatementFromArrayDefine(varidate_variable_list, validate_statement_list, variable_table_list, function_information_list); createVaridateStatementFromPointerDefine(validate_statement_list, variable_table_list, function_information_list); createValidateStatement(programAST, function_information_list, variable_table_list, varidate_variable_list, validate_statement_list, for_information_list, isUndefineControlCheckMode(flag_database), isZeroDivitionCheckMode(flag_database), isArrayUnboundCheckMode(flag_database), isFreeViolationCheckMode(flag_database)); if(isProgramSlicingMode(flag_database)){ //検証式リストをASTノードごとにソートする validateStatementListSort(validate_statement_list); //プログラムスライシングリストに関する情報を生成 expr_slicing_list = EXPR_SLICING_LIST_new(); createStatementNodeList(programAST, expr_slicing_list, NULL, variable_table_list, function_information_list); //関数内で使用されているグローバル変数を抽出し、プログラムスライシングの関数呼び出しの対象の変数に設定する setGlobalVariable(expr_slicing_list, expr_slicing_list); //プログラムスライシングの対象の変数および依存関係に対して、データ依存関係を追加する createDD_listAll(expr_slicing_list, function_information_list, expr_slicing_list); //プログラムスライシングに関する情報を出力させる print_EXPR_SLICING_LIST(expr_slicing_list); print_tree_EXPR_SLICING_LIST(expr_slicing_list, 0); //プログラムスライシング情報をもとに、検証式を出力させる createValidateStatementAdderFileEachCheck(expr_slicing_list, validate_statement_list, varidate_variable_list, for_information_list, include_list); }else{ //出力ファイルに検証式付きのプログラムを出力させる snprintf(output_file_name, FILE_PATH, "%s_output.c", preprocess_file_name); output = fopen(output_file_name, "w"); //printProgramDataWithValidateStatement(programAST, varidate_variable_list, validate_statement_list, for_information_list); fprintProgramDataWithValidateStatement(output, programAST, varidate_variable_list, validate_statement_list, for_information_list, function_information_list, variable_table_list); //入力ファイルおよび出力ファイルを閉じる fclose(target_source_file); fclose(output); //インクルードリストからインクルードを付加する addIncludeDataFromFile(output_file_name, include_list); } } }else{ printf("PreProcesser is failed!! Please Check your source file!!\n"); } } } } return 0; }