] 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文等の実際に使う構文に移っていく。