] Lex & YACC 2
前回の続き
%{ #include <stdio.h> #include "sample4.tab.h" void yyerror(const char *str) { fprintf(stderr,"error: %s\n",str); } int yywrap(void) { return 1; } %} %% [[:digit:]]+ yylval=atoi(yytext); return NUMBER; heat return TOKHEAT; on|off yylval=!strcmp(yytext,"on"); return STATE; target return TOKTARGET; temperature return TOKTEMPERATURE; \n /* 改行は無視 */; [:blank:]+ /* ホワイトスペースは無視 */; %%
%{ #include <stdio.h> #include <stdlib.h> %} %token NUMBER %token TOKHEAT %token STATE %token TOKTARGET %token TOKTEMPERATURE %% commands : | commands command ; command : heat_switch | target_set ; heat_switch : TOKHEAT STATE { if($2){ printf("\tHeat turned on\n"); } else{ printf("\tHeat turned off\n"); } } ; target_set : TOKTARGET TOKTEMPERATURE NUMBER { printf("\tTemperature set to %d\n",$3); } ; %% int main(void) { if(yyparse() != 0){ fprintf(stderr, "yyparse() error\n"); } return 0; }
これでON/OFFと数値の取得、つまり複数のトークンで種類が同じ場合の切り分け?が出来るようになった。
.yの$2とかは各コマンドheat_switchの場合、「TOKHEAT STATE」の2番めつまりSTATEを表す。
ここから先は本当にif文やfor文等の実際に使う構文に移っていく。