parser/parser.yy
author Markus Bröker <mbroeker@largo.dyndns.tv>
Thu, 16 Apr 2009 12:49:04 +0200
changeset 30 d037c433ec3e
parent 9 c3fecc82ade6
permissions -rw-r--r--
kleiner auffschrischungskurs compilerbau... committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * 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;
}