俺言語をC++言語に変換し、既存のC++コンパイラを使って実行ファイルを作成するという方式を考えています。
これなら1年以内に実現できそうです。
というわけで、その第一歩としてまずはbisonという構文解析プログラム作成ツールを使ってみました。
これは、BNFに似た言語を使って構文を定義すると、その構文に従って構文解析を行うCのコードを生成してくれるツールです。
今回は逆ポーランド記法の式を演算するものを作成してみました。
「BNFに似た言語」のコードがこちら
%{
#include
#include
#include
#define YYSTYPE double
int yylex(void);
void yyerror(const char* s);
%}
%token NUM
%%
input : /* empty */
| input line
;
line : '\n'
| expr '\n'
{ printf("\t%.10g\n", $1); }
;
expr : NUM
| expr expr '+'
{ $$ = $1 + $2; }
| expr expr '-'
{ $$ = $1 - $2; }
| expr expr '*'
{ $$ = $1 * $2; }
| expr expr '/'
{ $$ = $1 / $2; }
| expr expr '^'
{ $$ = pow($1, $2); }
| expr 'n'
{ $$ = -$1; }
;
%%
/* トークン解析関数 */
int yylex(void)
{
int c;
/* 空白、タブは飛ばす */
while((c = getchar()) == ' ' || c == '\t')
;
/* 数値を切り出す */
if(c == '.' || isdigit(c))
{
ungetc(c, stdin);
scanf("%lf", &yylval);
return NUM;
}
/* EOF を返す */
if(c == EOF)
return 0;
/* 文字を返す */
return c;
}
/* エラー表示関数 */
void yyerror(const char* s)
{
fprintf(stderr, "error: %s\n", s);
}
int main(void)
{
/* 構文解析関数 yyparse */
return yyparse();
}
まあ、今回はとりあえずbisonを'使ってみる'ということで。
このコードはコンソール画面で入力を受け付けて処理するものだったので、次回はファイルから受け付けてファイルに出力するものを作ってみます。
それでは、楽しいプログラミングライフを!