新しいプログラミング言語の作成-Filex&Bisonチュートリアル-(3)-より実用的な小さな計算機
2749 ワード
この節で文法ツリーの勉強に入って、どうやってアセンブリに変換するか、本当に本当のコンパイラになりたいと思っていました.
でもね...今週は事務が多くて、週末になってから本当に暇なので、文法ツリーを使わない簡単なアプリケーションを簡単に紹介します.次の更新は週末まで待つかもしれません.
また、私もエラー処理やヒントなどについて時間を見つけて話したいので、このチュートリアルにはまだ長い道のりがあります.
変数と簡単な判断をサポートする計算機
前節では非常に簡単な計算機を実現しましたが、実用的に言えば、まだいくつかの機能がありません.
私たちは参加する予定です.
簡単な変数、set変数名=...の文法
簡単な判断、c言語のaを真似て、私たちはtest 3 yyを設計し始めました.y
ここでは,主式に2つの非空の状況を設定したが,計算か変数付与かのどちらかである.
変数の面では、図の便利さのために変数を1文字しか設定できないので、読者が興味があればもっと高級なものにすることができます.
ans機能をサポートするためにlast変数を用いて最後に計算した値を保存した.
他には何も言うことはありませんtest 3 llを見てみましょうl
ここでは、必要な2つのシンボルsetとansを返します.
前節の方法でコンパイルすると、完璧に動作していることがわかります.
(3)-より実用的な小型計算機の終了
でもね...今週は事務が多くて、週末になってから本当に暇なので、文法ツリーを使わない簡単なアプリケーションを簡単に紹介します.次の更新は週末まで待つかもしれません.
また、私もエラー処理やヒントなどについて時間を見つけて話したいので、このチュートリアルにはまだ長い道のりがあります.
変数と簡単な判断をサポートする計算機
前節では非常に簡単な計算機を実現しましたが、実用的に言えば、まだいくつかの機能がありません.
私たちは参加する予定です.
簡単な変数、set変数名=...の文法
簡単な判断、c言語のaを真似て、私たちはtest 3 yyを設計し始めました.y
%{
#include
int yylex();
int yyerror(char *);
using namespace std;
float vars[128]={0};
float last=0;
%}
%token CHAR
%token SET ANS
%token Number
%type exp
%type cond
%union
{
char iv;
float fv;
char cv;
}
%left '' '='
%left '+' '-'
%left '*' '/'
%left '?' ':'
%right '(' ')'
%%
program:
program exp '
' { cout << "Result: " << $2 << endl; last = $2; }
| program stat '
'
|
;
stat :
SET CHAR '=' exp { vars[$2] = $4; }
cond :
exp '' exp { $1>$3?$$=1:$$=0; }
| exp '' '=' exp { $1>=$4?$$=1:$$=0; }
| exp '=' exp { $1==$3?$$=1:$$=0; }
exp :
Number { $$ = $1; }
| ANS { $$ = last; }
| CHAR { $$ = vars[$1]; }
| exp '+' exp { $$ = $1 + $3; }
| exp '-' exp { $$ = $1 - $3; }
| '(' exp ')' { $$ = $2; }
| exp '*' exp { $$ = $1 * $3; }
| exp '/' exp { $$ = $1 / $3; }
| cond '?' exp ':' exp { $1?$$=$3:$$=$5; }
;
%%
int yyerror(char *s)
{
cout<
ここでは,主式に2つの非空の状況を設定したが,計算か変数付与かのどちらかである.
変数の面では、図の便利さのために変数を1文字しか設定できないので、読者が興味があればもっと高級なものにすることができます.
ans機能をサポートするためにlast変数を用いて最後に計算した値を保存した.
他には何も言うことはありませんtest 3 llを見てみましょうl
%{
#include
#include "test3yy.h"
int yyerror(char *);
%}
%%
[0-9]+ {
yylval.fv = strtod(yytext,0);
return Number;
}
[0-9]+\.[0-9]+ {
yylval.fv = strtod(yytext,0);
return Number;
}
[-+()?:<>=/*
] { return *yytext; }
[ \t] ;
[a-zA-Z] { yylval.cv = *yytext;
return CHAR;
}
"set" { return SET; }
"ans" { return ANS; }
%%
int yywrap()
{
return 1;
}
ここでは、必要な2つのシンボルsetとansを返します.
前節の方法でコンパイルすると、完璧に動作していることがわかります.
(3)-より実用的な小型計算機の終了