(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);
}


yacc

%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();
}