とりあえず、前回の予告通り動作確認です。
…と思ったのですが生成されたCソースのコンパイルが通らないではありませんか。
なんということでしょう。
とりあえずVSでおなじみのC4996エラーを潰してみましたが、それでもなお「未定義の外部シンボル_yywrapが参照されました」というエラーが出るではありませんか!
調べてみると、_yywrapではありませんが、yywrapは常に1を返す関数だそうです。
とりあえずそれを定義すればよいのでは?と思い一番下に
► スポイラーを表示
CODE:
int yywrap(void)
{
return 1;
}
と追加。
コンパイル通るじゃありませんか。
これはflex.exeさんが仕事し忘れているのでは?
まあいいでしょう。この際それは気にしないことにします。
というわけでやっと動作テストです。

はい、こちらの期待通りに動いているようですね。
次回はbisonで文法チェックです!
数日間bisonやflexを経験してみて、一つ思うことがあります。
それは、コンパイルする時にいちいちコマンドを打つのが面倒だということです。
そこで、コンパイル対象ファイルをドラッグ&ドロップするだけでコマンドライン付きでflex.exeを実行してくれるプログラムをつくることにしました。
► スポイラーを表示
CODE:
#include
#include
#ifndef FW_STD_DEF_
#define FW_STD_DEF_
#endif
#include
std::string anothextend(const char * str, const char * newext)
{
std::string newstr(str);
uint index = newstr.find_last_of('.');
return newstr = newstr.substr(0, index) + newext;
}
int main(int argnum, char * args[])
{
if (argnum < 2)
{
printf("コンパイル対象をドラッグ&ドロップして実行してください\n");
getchar();
return 0;
}
fw::exeexe exer;
exer.exepath("flex.exe");
for (int i = 1; i < argnum; ++i)
{
printf("compiling ' %s ' ...\n", args[i]);
exer.argus(fw::cnct() << "-o " << anothextend(args[i], ".cpp") << " -d " < args[i]);
exer.begin();
while (exer.working())
{
// Nothing
}
printf("finished!\n");
printf("result: ");
if (exer.result() == std::string(""))
{
printf("succeeded!\n\n");
}
else
{
printf("failed\n%s\n\n", exer.result());
}
}
printf("All Files Compiled!!\n");
getchar();
return 0;
}
FantomWaves.h
は自作ライブラリのメインヘッダです。今のところ公開されていません。
しかし、コンパイルは常に失敗し、「~.cが開けない」と言われてしまいます。
今のところ原因が思いつきません。
これも次回の課題ですね。
それでは、良いプログラミングライフを!