%{ void yyerror(char*); #define YY_SKIP_YYWRAP int yywrap(void) { return 1; } #define YYSTYPE char* /* トークンの属性の型を宣言 --- このプログラムでは文字列型 */ #include "tinierParser.h" /* tinierParser.h は bison が生成するファイル */ %} ws [ \t\r\n]+ num [0-9]+ var [a-e] %% {ws} { /* ここでは何もしない */ } {num} { /* NUM という終端記号の種類を返す。 その値(``属性'')は yylval という大域変数に代入する。 */ yylval = yytext; return NUM; } {var} { /* VAR という終端記号の種類を返す。 属性(yylval)は変数に対応する数字を返す。 */ switch (yytext[0]) { case 'a': yylval = "1"; break; case 'b': yylval = "2"; break; case 'c': yylval = "3"; break; case 'd': yylval = "4"; break; case 'e': yylval = "5"; break; } return VAR; } [+\-*/%()=<>;{}] { /* + - * / ( ) = … の場合は、マッチした文字をそのまま返す。*/ /* マッチした文字は一般に yytext[0] 〜 yytext[yyleng-1] に入っている。*/ return yytext[0]; } "==" { return EQ; } "!=" { return NE; } "<=" { return LE; } ">=" { return GE; } "print" { return PRINT; } "println" { return PRINTLN; } "if" { return IF; } "else" { return ELSE; } . { fprintf(stderr, "不正な文字 (%c)です。", yytext[0]); return 0; } %% /* なにもなし */