簡単なサンプル
コマンドラインから数式を入力して、結果を表示させるだけのプログラムの例です。~
例を簡単にするために、プラスだけを残しています。~
Flexファイル
%{
void yyerror(char*);
#define YY_SKIP_YYWRAP
int yywrap(void) { return 1; }
#include "code0002.tab.h" /* parser.hは bisonが生成するファイル */
%}
delim [ \t]
ws {delim}+
number [1-9][0-9]*
%%
{ws} { /* ここでは何もしない */ }
{number} { sscanf(yytext, "%lf", &yylval); return NUMBER; }
/* NUMBERという終端記号の種類を返す。その値(“属性”)は
yylvalという大域変数に代入する。 */
[+\(\)] { return yytext[0]; }
/* + - * / ( )の場合は、マッチした文字をそのまま返す。*/
/* マッチした文字は一般に yytext[0] ~ yytext[yyleng-1]。*/
"\n" { return EOL; }
. { yyerror("不正な文字です。"); return EOL; }
%%
/* なにもなし */
Bisonファイル
%{
#define YYSTYPE double /* トークンの属性の型を宣言 */
#include <stdio.h>
#include <stdlib.h> /* exit関数を使うため */
void yyerror(char* s) {
printf("%s\n", s);
}
int yylex(void); /* yylexのプロトタイプ宣言 */
%}
%token NUMBER
%token EOL
%left '+'
%%
input : /* 空 */
| input line {}
;
line : EOL { exit (0); } /* 空行だったら終了 */
| expr EOL { printf ("\t%g\n", $1); }
;
expr : NUMBER { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; }
| '(' expr ')' { $$ = $2; }
;
%%
int main(void) {
printf("Ctrl-cで終了します。\n");
yyparse();
return 0;
}
解説
このプログラムを実行すると、数式を入力するように求めてきます。
3+3などのような、単純な足し算を実行することができます。
また、'('と')'を使える。
最終更新:2009年01月10日 20:13