13-01.構造の修正

 この項では、前項で作成した計算機の構造を変え、CLangProjectプロジェクト側から、FlexBisonを呼ぶような形にします。
 oreProjectにおける、03-01.プログラム入力インターフェイスの作成と同じような処理です。
 また、この項からは図版はあまり用意しませんので、注意してください。

 まず、ソリューションエクスプローラのCLangProjectプロジェクトを右クリックし追加-新しいフィルタスクリプトファイルを作成します。
 続いてそのフィルタを右クリックして新しい項目を追加します。
 C++ファイルを選び、ファイル名をindex.cとして、CLangProjectのプロジェクトディレクトリ内に追加します。
 追加したら、そのファイルのプロパティを開いてビルドから除外はいにしておきます。そうしないと、VisualStdioが、コンパイルしようとしてしまいます。
 プロパティの設定が終わったら、その中に
10 + 3
10 * 3
 と記述し、保存(Ctrl+S)しておきます。
 続いてCLangProject-ソースファイルを右クリックし、追加-新しい項目main.cppを追加します。
 続いてCLangProject.yファイルに記述されているmain()関数main.cppに移動します。CLangProject.y内のmain()関数は、コメントにするか削除しておきます。
 そしてmain.cppに以下を記述します。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;


class InputParser {
    vector <string> tokens;
public:
    InputParser(int& argc, char** argv) {
        for (int i = 1; i < argc; ++i) {
            tokens.push_back(string(argv[i]));
        }
    }
    const string& getCmdOption(const string& option) const {
        vector<string>::const_iterator itr;
        itr = find(tokens.begin(), tokens.end(), option);
        if (itr != tokens.end() && ++itr != tokens.end()) {
            return *itr;
        }
        static const string empty_string("");
        return empty_string;
    }
    bool cmdOptionExists(const string& option) const {
        return find(tokens.begin(), tokens.end(), option)
            != tokens.end();
    }
};


int main(int argc, char** argv) {
    InputParser input(argc, argv);
    const string& filename = input.getCmdOption("-f");
    if (filename.empty()) {
        cerr << "ファイルを指定してください" << endl;
        return 1;
    }
    extern int yyparse(void);
    extern FILE* yyin;
    if ((yyin = fopen(filename.c_str(), "r")) == NULL) {
        cerr << "ファイル読み込みに失敗しました" << std::endl;
        return 1;
    }
    if (yyparse()) {
        cout << "プログラム終了" << endl;
    }
    return 0;
}
 CLangProjectプロジェクトののプロパティを選択します。
 デバッグメニューのコマンド引数の項目に
-f index.c
 と記述して保存します。

コンパイルと実行

 コンパイルして実行してみましょう。
>>13.000000
>>30.000000

...\CLangProject\Debug\CLangProject.exe (プロセス 10480) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...
 のように出力したら、成功です。以下、現在のソリューションエクスプローラの内容です。

 

図130101

 

解説

 今回の修正でコマンドラインからパラメータを取得して、-fオプションで指定されるスクリプトファイルを読み込み、そこに記載されている命令文(前項で実装したもの)を同様に実行し、出力することができるようになりました。
 これはmain関数CLangProject.yからmain.cppに移動することで、修正します。
 その際main.cppに新しく記載されるmain関数に手を加えます。
 すなわち、コマンドラインの-fオプションで指定されるスクリプトファイルを読み込んで、その内容を実行します。
 記載されているのは前項に実装された計算の入力に対する結果の出力です。
 コンソールで受け付けていた入力スクリプトファイルから入力に変更します。
 こうすることでスクリプトファイルでの計算式の記載入力になるので、コンソールには計算結果が出力されます。

 この修正は、単にコンソール入力ファイルからの入力に切り替えただけのものです。ですので、計算はその都度行います。
 次項では、スクリプトファイルの内容をコンパイル、実行という2つのステップに分けます。
 そうすることで、C言語を作ろうの目的であるスタックマシンで実装するというテーマが実装されます。