diff --git a/parser/parser.yy b/parser/parser.yy new file mode 100644 --- /dev/null +++ b/parser/parser.yy @@ -0,0 +1,84 @@ +/* + * $Id$ + * $URL$ + */ + +%{ + #include + #include + + int regs[26]; + int base; + + int yyerror(); + int yylex(); +%} + +%start list +%token DIGIT LETTER +%left MINUS PLUS MUL DIV +%left UMINUS +%% + +list : /* empty */ + | list stat '\n' + | list error '\n' { yyerrok; }; + +stat : + expr { (void) printf( "RESULT: %d\n", $1 ); } + | LETTER '=' expr { regs[$1] = $3; } + ; + + expr : '(' expr ')' + { + $$ = $2; + } + | expr PLUS expr + { + $$ = $1 + $3; + } + | expr MINUS expr + { + $$ = $1 - $3; + } + | expr MUL expr + { + $$ = $1 * $3; + } + | expr DIV expr + { + $$ = $1 / $3; + } + | MINUS expr %prec UMINUS + { + $$ = -$2; + } + | LETTER + { + $$ = regs[$1]; + } + | number + ; + + number : DIGIT + { + $$ = $1; base = ($1==0) ? 8 : 10; + } + | number DIGIT + { + $$ = base * $1 + $2; + } + ; + +%% + +int yyerror() +{ + printf("ERROR\n"); + return 0; +} + +int yywrap() +{ + return 1; +}