%{ /* C 宣言部 ─ 動作記述の中で用いる関数の定義や宣言 */ #define YYSTYPE double /* トークンの属性の型を宣言 */ #include #include /* exit 関数を使うため */ void yyerror(char* s) { printf("%s\n", s); } int yylex(void); /* yylex のプロトタイプ宣言 */ %} %token NUMBER %token FOO /* tokenの優先順位 */ %left '+' '-' FOO %left '*' '/' %% input : /* 空 */ | input line {} ; line : '\n' { exit (0); } /* 空行だったら終了 */ | expr '\n' { printf ("\t%g\n", $1); } ; expr : NUMBER { $$ = $1; } | expr FOO expr { $$ = $1 * 256 + $3; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } ; %% /* yylex 関数は Flex が作成する。 */ int main(void) { printf("Ctrl-c で終了します。\n"); yyparse(); return 0; }