13-01.構造の修正
この項では、前項で作成した
計算機の構造を変え、
CLangProjectプロジェクト側から、
FlexBisonを呼ぶような形にします。
oreProjectにおける、
03-01.プログラム入力インターフェイスの作成と同じような処理です。
また、この項からは図版はあまり用意しませんので、注意してください。
まず、ソリューションエクスプローラの
CLangProjectプロジェクトを右クリックし
追加-新しいフィルタで
スクリプトファイルを作成します。
続いてそのフィルタを右クリックして
新しい項目を追加します。
C++ファイルを選び、ファイル名を
index.cとして、CLangProjectのプロジェクトディレクトリ内に追加します。
追加したら、そのファイルのプロパティを開いて
ビルドから除外を
はいにしておきます。そうしないと、VisualStdioが、コンパイルしようとしてしまいます。
プロパティの設定が終わったら、その中に
と記述し、保存(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プロジェクトののプロパティを選択します。
デバッグメニューの
コマンド引数の項目に
と記述して保存します。
コンパイルと実行
コンパイルして実行してみましょう。
>>13.000000
>>30.000000
...\CLangProject\Debug\CLangProject.exe (プロセス 10480) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...
のように出力したら、成功です。以下、現在のソリューションエクスプローラの内容です。
図130101
解説
今回の修正で
コマンドラインからパラメータを取得して、
-fオプションで指定される
スクリプトファイルを読み込み、そこに記載されている命令文(前項で実装したもの)を同様に実行し、出力することができるようになりました。
これは
main関数を
CLangProject.yから
main.cppに移動することで、修正します。
その際
main.cppに新しく記載される
main関数に手を加えます。
すなわち、
コマンドラインの-fオプションで指定される
スクリプトファイルを読み込んで、その内容を実行します。
記載されているのは前項に実装された
計算の入力に対する
結果の出力です。
コンソールで受け付けていた入力を
スクリプトファイルから入力に変更します。
こうすることで
スクリプトファイルでの
計算式の記載が
入力になるので、コンソールには
計算結果が出力されます。
この修正は、単に
コンソール入力を
ファイルからの入力に切り替えただけのものです。ですので、計算はその都度行います。
次項では、
スクリプトファイルの内容を
コンパイル、実行という2つのステップに分けます。
そうすることで、
C言語を作ろうの目的である
スタックマシンで実装するというテーマが実装されます。