簡単なサンプル

コマンドラインから数式を入力して、結果を表示させるだけのプログラムの例です。~
例を簡単にするために、プラスだけを残しています。~

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