(5)の答え
一応載せておきます。
でも、きっともっとスマートなやり方があるのだろうね・・・・
続きを読むでlexとyaccのコードを見られます。
lex
%{ #include <stdio.h> #include "y.tab.h" extern int yylval; %} %% [0-9]+ { yylval = atoi(yytext); return NUMBER; } [ \t] @ { return 0; } . { return yytext[0]; } %% yyerror(char *errmsg) { fprintf(stderr,"ERROR: %s at %s\n", errmsg, yytext); }
%token NUMBER %left UMINUS %% statement_list: statement | statement_list statement'\n' ; statement: expression { printf("\t= %d\n", $$); } ; expression: '[' num num '+' ']' { $$ = $2 + $3;} | '[' num num '-' ']' { $$ = $2 - $3;} | '[' num num '*' ']' { $$ = $2 * $3;} | '[' num num '/' ']' { $$ = $2 / $3;} | '[' num num '%' ']' { $$ = $2 % $3;} | '[' num num '>' ']' { $$ = ($2 > $3)?1:0;} | '[' num num '<' ']' { $$ = ($2 < $3)?1:0;} | '[' num num '>''=' ']' { $$ = ($2 >= $3)?1:0;} | '[' num num '<''=' ']' { $$ = ($2 <= $3)?1:0;} | '[' num num '=''=' ']' { $$ = ($2 == $3)?1:0;} | '[' expression expression '+' ']' { $$ = $2 + $3;} | '[' expression expression '-' ']' { $$ = $2 - $3;} | '[' expression expression '*' ']' { $$ = $2 * $3;} | '[' expression expression '/' ']' { $$ = $2 / $3;} | '[' expression expression '%' ']' { $$ = $2 % $3;} | '[' expression expression '>' ']' { $$ = ($2 > $3)?1:0;} | '[' expression expression '<' ']' { $$ = ($2 < $3)?1:0;} | '[' expression expression '>''=' ']'{ $$ = ($2 >= $3)?1:0;} | '[' expression expression '<''=' ']'{ $$ = ($2 <= $3)?1:0;} | '[' expression expression '=''=' ']'{ $$ = ($2 == $3)?1:0;} ; num: NUMBER { $$ = $1; } | '-' NUMBER %prec UMINUS { $$ = -$2;} %% int main() { yyparse(); }