!!!MINIC用コンパイラの構文解析 !!ソースコード %{ #include %} %union {char *s; int n;} %token NAME NUMBER %destructor { free($$); } NAME NUMBER %token IF WHILE DO %type if0 num %token AND OR EQ GE GOTO ELSE INT IN OUT HALT %left OR %left AND %left '|' %left '^' %left '&' %left EQ NE %left GE LE '<' '>' %left SHL SHR %left '+' '-' %left '*' %right '!' '~' NEG %% statements : statement | statements statement ; statement : label | intdef | goto | if | while | do | halt | out | assign ; label : NAME ':' {printf("%s:\n",$1);} ; intdef: INT intlist ';' ; intlist: integer | intlist ',' integer ; integer: NAME {printf("%s:\t0\n",$1);} | NAME '=' num {printf("%s:\t%d\n",$1,$3);} | NAME '=' {printf("%s:",$1);} '{' numlist '}' ; num: NUMBER {$$=atoi($1);} | '-' NUMBER { $$=-atoi($2); } ; numlist: nums | numlist ',' nums ; nums : num {printf("\t%d\n",$1);} | num '[' NUMBER ']' {int i; for(i=0;i' expr {printf("\tGT\n");} | '(' expr ')' ; %% int yyerror(char *s){ printf("%s\n",s); } int main(){ yyparse(); }