author | Markus Bröker <mbroeker@largo.dyndns.tv> |
Thu, 14 May 2009 17:31:45 +0200 | |
changeset 92 | 0bc2646daa82 |
parent 39 | 46d7ec9d63bd |
permissions | -rw-r--r-- |
/** * test/demos/parser/parser.yy * Copyright (C) 2008 Markus Broeker */ %{ #include <stdio.h> #include <ctype.h> 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; }