%% -*- mode: latex; TeX-master: "compilerbau.tex"; -*-

\begin{slide}{Parser-Generator bison}

\kopf{$ $Id: taschenrechner.tex,v 1.1 2011-10-16 14:06:17 waldmann Exp $ $}

typischen Kombination:
\begin{itemize}
\item
  lexikalische Analyse (Scanner) mit lex (flex)
\item
  syntaktische Analyse (Parser) mit yacc (bison)
\end{itemize}

\verb|parser.y| enthält erweiterte Grammatik
(Regeln mit semantischen Aktionen).

\verb|bison -d| erzeugt daraus:
\begin{itemize}
\item
  \verb|parser.tab.c| (Parser)
\item
  \verb|parser.tab.h| (Token-Definitionen, für \verb|scanner.l|)
\end{itemize}

Beispiel: \url{http://www.imn.htwk-leipzig.de/~waldmann/ws03/compilerbau/programme/taschenrechner/}


\end{slide}

\begin{slide}{Flex-Bison-Beispiel}

\begin{minipage}{0.55\textwidth}
\verb|parser.y|:
\begin{small}
\begin{verbatim}
%token NUM
%left '-' '+'
%%
input : | input line ;
line  : exp '\n' 
  { printf ("%d\n", $1); }
exp   : NUM  { $$ = $1; }
   | exp '+' exp   
       { $$ = $1 + $3; }
   | exp '-' exp   
       { $$ = $1 - $3; }
   ;
%%
\end{verbatim}
\end{small}
\end{minipage}
\rule[-5cm]{1pt}{10cm}
\begin{minipage}{0.4\textwidth}
\verb|scanner.l|:
\begin{small}
\begin{verbatim}
%{
#include "parser.tab.h"
%}
%%
[0-9]+ { 
  yylval = atoi (yytext); 
  return NUM; }
[-+*/^()] { 
  return yytext[0]; } 
\end{verbatim}
\end{small}
\end{minipage}
\hrule
\verb|interpreter.c|:
\begin{small}
\begin{verbatim}
int main (int argc, char ** argv) { yyparse (); }
\end{verbatim}
\end{small}
\end{slide}
