図120103
VisualC++の空のプロジェクトを作成します。
図120204
基本プロジェクトができたら、もう一つプロジェクトを作成します。
図120205
こちらも空のプロジェクトとし、名前はFlexBisonとします。
図120206
2つのプロジェクトを作成したら、構成マネージャを開きます。
図120207
まずアクティブソリューションプラットフォームの編集を選択します。
図020208
x64を削除します。今回は32ビットアプリケーションとして作成するので、間違ってx64が選択されないようにします。
図120209
続いて中段のCLangProjectのプラットフォームも編集します。
図020210
x64を削除します。
図120211
続いてFlexBisonも編集します。
図120212
x64を削除します。
図120213
先ほどダウンロードしたwinflexbison3-latest.zipを解凍しwinflexbisonとディレクトリ名を変更して、以下の様な構造でFlexBisonプロジェクト内にコピーします。
図020214
FlexBisonプロジェクトのビルドのカスタマイズを選択します。
図120215
カスタマイズの画面で既存ファイルの検索を選びます。
図120216
ローカルのディレクトリから、FlexBisonプロジェクト内の、先ほどコピーしたwinflexbison内のcustom_build_rules内のwin_flex_bisonを選択し、win_flex_bison_custom_build.targetsを選択します。
図120217
このまま設定するかどうか警告が出ますがはいで設定します。すると、以下のようにチェックできるように表示されますので、チェックし、OKをクリックします。
図120218
続いてFlexBisonプロジェクトのプロパティを選択します。
図120219
VC++ディレクトリの実行可能ファイルディレクトリの編集を選びます。
図120220
そこで$(ProjectDir)winflexbisonと記述しOKを選びます。
図120221
FlexBisonプロジェクトのソースファイルに新しい項目を追加します。
図120222
C++ファイルを選んで。CLangProject.l(拡張子はエルです)というファイルを追加します。
図120223
コードの編集画面が出たら、以下を記述します。
%{
#include <stdio.h>
#include "CLangProject.tab.h"
#define YY_SKIP_YYWRAP 1
int
yywrap(void)
{
return 1;
}
%}
%%
"+" return ADD;
"-" return SUB;
"*" return MUL;
"/" return DIV;
"\n" return CR;
[1-9][0-9]* {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.double_value = temp;
return DOUBLE_LITERAL;
}
[0-9]*\.[0-9]* {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.double_value = temp;
return DOUBLE_LITERAL;
}
[ \t] ;
%%
図120224
ファイルを作成したら、以下を記述します。
%{
#include <stdio.h>
#include <stdlib.h>
#define YYDEBUG 1
extern int yylex(void);
int
yyerror(char const *str)
{
extern char *yytext;
fprintf(stderr, "parser error near %s\n", yytext);
return 0;
}
%}
%union {
int int_value;
double double_value;
}
%token <double_value> DOUBLE_LITERAL
%token ADD SUB MUL DIV CR
%type <double_value> expression term primary_expression
%%
line_list
: line
| line_list line
;
line
: expression CR
{
printf(">>%lf\n", $1);
}
expression
: term
| expression ADD term
{
$$ = $1 + $3;
}
| expression SUB term
{
$$ = $1 - $3;
}
;
term
: primary_expression
| term MUL primary_expression
{
$$ = $1 * $3;
}
| term DIV primary_expression
{
$$ = $1 / $3;
}
;
primary_expression
: DOUBLE_LITERAL
;
%%
int main(void)
{
extern int yyparse(void);
extern FILE *yyin;
yyin = stdin;
if (yyparse()) {
fprintf(stderr, "Error ! Error ! Error !\n");
exit(1);
}
}
図020225
また、FlexBisonプロジェクト内を見てみましょう。以下のようにCLangProject.tab.h、CLangProject.tab.cpp、CLangProject.flex.cppができていればOKです。
図120226
続いて、メインのプロジェクトであるCLangProjectにソースファイルを追加します。既存の項目で追加してください。
図120227
FlexBisonプロジェクト内のCLangProject.tab.cpp、CLangProject.flex.cppを追加します。
図120228
ヘッダーファイルも既存の項目を追加します。
図120229
FlexBisonプロジェクト内のCLangProject.tab.hを追加します。
図120230
メインのプロジェクトCLangProjectのプロパティを開きます。
図120231
詳細設定で指定の警告を無効にするを選び編集します。
図120232
4996と数字を記述します。これはセキュリティに問題がある関数scanfなどをビルドできないようになっている設定をなくすものです。
図120233
続いてoreProjectのプロパティでリンカ-システムのサブシステムにコンソールの設定をします。
図120234
1ソリューションのプロパティも設定します。
図120235
CLangProjectの依存関係をFlexBisonにチェックします。
図120236
さあ、すべてが整いました。ビルド-ソリューションのリビルドを行います。
図120237
CLangProject.exeが作成されすべてリビルド: 2 正常終了と出力されれば成功です。
図020238
10 + 35
10 + 35 >>45.000000
10 + 35 >>45.000000 34 * 23 >>782.000000 67 / 23 >>2.913043 984 - 34.5 >>949.500000
10 + 35 >>45.000000 34 * 23 >>782.000000 67 / 23 >>2.913043 984 - 34.5 >>949.500000 parser error near Error ! Error ! Error ! ....\CLangProject\Debug\CLangProject.exe (プロセス 9480) は、コード 1 を伴って終了しました。 このウィンドウを閉じるには、任意のキーを押してください . . .
このウィンドウを閉じるには、任意のキーを押してください . . .