% slides.tex                    20 Jul 95
%------------------------------------------------------------

%
% These are the slides for the presentation on pretzel made on 21-7-95
% in Darmstadt. The code requires the seminar style for Latex (at least
% the files sem-page.sty and seminar.sty).
%
% [LaTeX 2.09]




\documentstyle[a4-9,german,portrait,pretzel,pretzel-latex]{seminar}

\slidesmag{3}


\begin{document}

\slideframe{none}

\def\sheader#1{
  \begin{center}\Large\bf #1 \end{center}}

% ------------------------------------------------------


\begin{slide*}

  \begin{center}
     \vbox{
  \begin{quote}
    \begin{flushleft}
      \Large
      \leftskip20pt
      {\bf building a}\\
      \qquad{language independent}\\
      \qquad{\bf prettyprinter}
    \end{flushleft}
  \end{quote}
  }

\bigskip
{\small\sl Felix G"artner}

  \end{center}

  \bigskip

  "Uberblick:

  \begin{enumerate}
  \item Theorie:
    \begin{itemize}
    \item Was ist ein Prettyprinter?
    \item Wie funktioniert ein Prettyprinter?
    \item Wie funktioniert ein Pretzel-Prettyprinter?
    \end{itemize}
  \item Technik:
    \begin{itemize}
    \item Entwurf/Konzepte von Pretzel
    \item Blick ins Innere von Pretzel
    \end{itemize}
  \item Praxis:
    \begin{itemize}
    \item Der generierte Prettprinter
    \item Benutzung von Pretzel
    \item Beispiele\dots
    \end{itemize}
  \end{enumerate}

\end{slide*}


% ------------------------------------------------------
% Theorie 1: Prettyprinting

\begin{slide*}

  \sheader{Theorie 1: Prettyprinting R"uckblick}

  \begin{quote}
``Rearrangement of source code to illuminate it's logical structure and
thus enhance readability.''
\end{quote}

  Was macht Prettyprinting (genau)?
  \begin{itemize}
  \item Einr"uckung und Umbruch von Code-Zeilen \\
    (globale Formatierung)
  \item lokale Formatierung (z.B.~von Ausdr"ucken)
  \item zus"atzliche typographische Raffinesse (Fonts, etc.)
  \end{itemize}

  % was ein prettyprinter ist, sollte am ANfang klar sein

  \medskip

  Wie arbeiten Prettyprinter?

  \begin{itemize}
  \item fr"uhe Systeme: reservierte Worte l"osen Formatierungsaktion aus
  \item moderne Systeme: Parsen des Codes und Abbildung von Teilb"aumen in
    Formatierung
  \end{itemize}

  \medskip
  Problem: Sprachabh"angigkeit

\end{slide*}


% ------------------------------------------------------

\begin{slide*}

  \sheader{Theorie 2: Prettyprinting heute}

    Hearn and Norman (1979): ``A one-pass prettyprinter'':

    \begin{itemize}
    \item sprachunabh"angiger Ansatz (``separation of concerns'')
    \item 2 ``Prozesse'', die sich die Arbeit teilen
    \end{itemize}

    \medskip
    \begin{description}
    \item[Parser] liest Sourcecode und f"ugt spezielle Markierungen ein.
    \item[Formatierer] bekommt Daten des Parsers und "ubernimmt das
      tats"achliche Layout
    \end{description}

    \begin{figure}[h]
      \begin{center}
        \leavevmode
        \input{../figures/pp-concept.latex}
      \end{center}
    \end{figure}

    Formatierungskommandos

    Unterschiedliche Befehlsvorr"ate

\end{slide*}


% ------------------------------------------------------

\begin{slide*}

  \sheader{Theorie 3: Prettyprinting -- Beispiel}

  \bigskip
  Pretzel benutzt Befehlsvorrat von Knuth/Levy aus \CWEAVE

  \medskip
  {\large\bf Beispiel: Steuerung der Einr"uckungstiefe}

  Input:
  \begin{inp}
    while (i<size) do begin i:=i+1; end;
  \end{inp}

  Einf"ugen von Formatierungskommandos:

  \begin{inp}
    while (i<size) do \fmt{indent} begin i:=i+1; end; \fmt{outdent}
  \end{inp}

  Ausgabe:

  \begin{outp}
    \res{while} $(\id{i} < \id{size})$ \res{do} \res{begin}
$\id{i} \ass{} \id{i} + 1; $ \res{end};
  \end{outp}

  Wollen eigentlich:

  \begin{outp}
\res{while} $(\id{i} < \id{size})$ \res{do} \myindent\myforce
\res{begin} $\id{i} \ass{} \id{i} + 1; $ \res{end}; \myoutdent
\end{outp}

  Einr"uckung erst nach Zeilenumbruch. Deshalb:

\begin{inp}
while (i<size) do \fmt{indent} \fmt{force} begin i:=i+1; end;
\fmt{outdent}
\end{inp}


\end{slide*}


% ------------------------------------------------------

\begin{slide*}

\sheader{Theorie 4: Prettyprinting -- Beispiel}

\bigskip
{\large\bf Beispiel: Steuerung der Zeilenumbr"uche}

\medskip

Eingabe:
\begin{inp}
begin str_buffer[str_buffer_pointer]:=c;
str_buffer_pointer:=str_buffer_pointer + 1; end;
\end{inp}

Ausgabe (wenn man Pech hat):

\begin{outp}
\res{begin}
$\id{str\_buffer}[\id{str\_buffer\_pointer}]\ass\id{c};
\id{str\_buffer\_poin-}$\myforce
$\id{ter}\ass\id{str\_buffer\_pointer} + 1;$
\res{end};
\end{outp}

Wollen aber:

\begin{outp}
\res{begin}
$\id{str\_buffer}[\id{str\_buffer\_pointer}]\ass\id{c};$
\myforce
$\id{str\_buffer\_pointer}\ass\id{str\_buffer\_pointer} +
1;$\myforce
\res{end};
\end{outp}

Modifizierte Eingabe:

\begin{inp}
begin str_buffer[str_buffer_pointer]:=c; \fmt{break\_space}
str_buffer_pointer:=str_buffer_pointer + 1; end;
\end{inp}


\end{slide*}


% ------------------------------------------------------

\begin{slide*}

  \sheader{Theorie 5: Abschlu"s}

  \bigskip
Wie kommen die Formatierungskommandos in den Text?

\begin{itemize}
\item Einbauen der Kommandos in die Grammatik
\end{itemize}

\bigskip

\begin{inp}
WHILE expr DO stmt $\longrightarrow$ stmt
\end{inp}

wird zu:

\begin{inp}
WHILE expr DO \fmt{indent} stmt \fmt{outdent} \fmt{force}
$\longrightarrow$ stmt
\end{inp}

\medskip
$\Longrightarrow$ Formatierte Grammatik

\bigskip

{\Large\bf Fazit:}

Formatierte Grammatik
\begin{itemize}
\item dr"uckt einen Prettyprinting-Stil aus.
\item ist Spezifikation der Arbeitsweise eines parsenden Prettyprinters.
\item kann als Eingabe f"ur Pretzel benutzt werden.
\end{itemize}
\end{slide*}


% ------------------------------------------------------

\begin{slide*}

\sheader{Technik 1: Parsender Prettyprinter}

\bigskip
{\large\bf Wie sieht ein Pretzel-Prettyprinter intern aus?}

\medskip
Idee: abgeschaut von \WEAVE\ (Knuth)

\medskip
Formatierte Grammatik ist eine attributierte Grammatik:
\begin{itemize}
\item Syntax-Baum und
\item ``"Ubersetzung'' (Text mit Formatierungskommandos)
\end{itemize}

\medskip
Modellierung der "Ubersetzung:

$\Longrightarrow$ {\it Attribute} Klasse

\medskip
Ausgabe und Interpretation des Baumes:

\begin{itemize}
\item Traversierung in pre-order.
\item Vorbehandlung des Baumes (z.B.~\fmt{force} + \fmt{force} = \fmt{force}).
\item Umwandlung in Markup und Ausgabe.
\end{itemize}

$\Longrightarrow$ {\it Output} Klasse

\end{slide*}


% ------------------------------------------------------

\begin{slide*}

  \sheader{Technik 2: Bauen des Prettyprinters}

  \bigskip
  {\large\bf Idee:}

  \begin{itemize}
  \item Bauen einen Parser f"ur unsere Sprache (\C, \PASCAL, etc.).
  \item Benutzt formatierte Grammatik zum Parsen.
  \end{itemize}

  $\Longrightarrow$ Benutzen Parser-Generatoren

  \medskip
  \begin{description}
  \item[flex] baut einen Scanner fuer unsere Sprache und liefert
    formatierte Token.
  \item[Bison] baut einen Parser, der die Tokens gem"a"s der formatierten Grammatik zusammenbaut.
  \end{description}

  \medskip
  Brauchen zwei Eingabedateien:

  \begin{enumerate}
  \item Datei mit Token-Definitionen (regul"are Ausdr"ucke)
  \item Datei mit kontextfreier Grammatik
  \end{enumerate}

  \medskip
  Beide Dateien sind leicht modifiziert, d.h.~enthalten Informationen "uber die
  Formatierung

\end{slide*}


% ------------------------------------------------------

\begin{slide*}

  \sheader{Technik 3: Inside Pretzel}

  \bigskip
{\large\bf Ziel:}

  \begin{figure}[h]
    \begin{center}
      \leavevmode
      \input{../figures/generator-funs.latex}
    \end{center}
  \end{figure}

  \medskip
\begin{itemize}
\item Modifizierte Dateien umwandeln in flex- und Bison-Source.
\item Entstehender Parser benutzt {\it Attribute} Klasse zum
  parsen.
\item Entstehender Parser benutzt {\it Output}, um den Attribut-Baum
  auszugeben.
\end{itemize}

\medskip
{\large\bf Vereinfacht:}

\begin{center}
\begin{tabular}{rl}
  & flex-Source \\
+ & Bison-Source \\
+ & Tricks ({\it Attribute}, {\it Output})\\
\hline
= & parsender Prettyprinter \\
\end{tabular}
\end{center}

\end{slide*}


% ------------------------------------------------------

\begin{slide*}

\sheader{Praxis 1: Der generierte Parser}

\bigskip
Wiederholung: Das Konzept

\begin{figure}
\begin{center}

\setlength{\unitlength}{0.012500in}%

\begin{picture}(203,87)(8,744)
\put( 90,789){\makebox(0,0)[b]{pretzel}}
\thinlines
\put( 54,744){\framebox(72,18){}}
\put( 87,777){\vector( 0,-1){  9}}
\thicklines
\put( 30,753){\vector( 1, 0){ 18}}
\put(129,753){\vector( 1, 0){ 24}}
\thinlines
\put( 66,783){\framebox(45,18){}}
\put( 87,819){\vector( 0,-1){ 12}}
\put( 90,822){\makebox(0,0)[b]{formal description}}
\put( 90,750){\makebox(0,0)[b]{prettyprinter}}
\put( 18,750){\makebox(0,0)[b]{Text}}
\put(183,759){\makebox(0,0)[b]{prettyprinted}}
\put(177,744){\makebox(0,0)[b]{text}}
\end{picture}
\end{center}
\end{figure}


Eingabe:

\begin{itemize}
\item modifizierte Token-Datei: {\em formatted token file}
\item modifizierte Grammatik: {\em formatted grammar file}
\end{itemize}

\medskip
Generierte Funktion:

\begin{outp}
\res{void} \id{pparse} (\id{istream}$\ast$, \id{ostream}$\ast$);
\end{outp}

\medskip
Simples Hauptprogramm:

\begin{verbatim}
    #include <iostream>
    #include "pparse.h"

    int main () {
        pparse(&cin,&cout);
        return(0);
    }
\end{verbatim}

\end{slide*}


% ------------------------------------------------------

\begin{slide*}


  \sheader{Praxis 2: Benutzung von Pretzel}

  Bauen eines Prettyprinters ist einfach:

  \begin{itemize}
  \item Eingabedateien basteln
  \item pretzeln
  \item flex und Bison anwenden
  \item compilieren
  \item in minimales Hauptprogramm einbinden
  \end{itemize}

  Shellskript {\tt pretzel-it}:

\begin{inp}
    pretzel-it $\langle${\it language}$\rangle$  $\langle${\it ppmain}$\rangle$
\end{inp}

\bigskip
Environment-Variablen:

\begin{itemize}
\item {\tt PRETZEL\_LIBDIR}
\item {\tt PRETZEL\_INCLUDE}
\end{itemize}


\end{slide*}


% ------------------------------------------------------

\begin{slide*}

  \sheader{Praxis 3: Beispiel}

\bigskip
\begin{verbatim}
    2697 Jul 20 15:55 pascal.fg
    2694 Jul 20 15:55 pascal.ft
spock $ pretzel-it pascal pascalpp
running pretzel...
running flex and Bison...
pascal.y contains 21 shift/reduce conflicts.
compiling scanner...
compiling parser...
linking prettyprinter pascalpp...
done.
spock $ ll
    2697 Jul 20 15:55 pascal.fg
    2694 Jul 20 15:55 pascal.ft
   45611 Jul 20 15:55 pascal.lex.c
   32380 Jul 20 15:55 pascal.tab.c
  253719 Jul 20 15:55 pascalpp
     362 Jul 20 15:55 ptokdefs.h
spock $
\end{verbatim}


\end{slide*}






% ------------------------------------------------------

\begin{slide*}

\sheader{Praxis 4: Beispiel}

\bigskip
{\large Quellcode:}

\begin{verbatim}
    program 'Hello';
    begin writeln('Hello Pretzel!');
    end.
\end{verbatim}

\medskip
{\large Nach dem Parsen:}

\begin{verbatim}
    \documenstyle[pretzel-latex]{article}
    \begin{document}
    \begin{ppcode}
      \pretzelbigforce\pretzelbackup{\bf program}
      {\tt 'Hello'};\pretzelforce {\bf begin}
      \pretzelindent\pretzelforce{\bf writeln}
      ({\tt 'Hello Pretzel!'});\pretzeloutdent
      \pretzelforce{\bf end}.
    \end{ppcode}
    \end{document}
\end{verbatim}

\medskip
{\large \LaTeX-Output:}

\begin{quote}
\begin{ppcode}
  \pretzelbigforce\pretzelbackup{\bf program} {\tt 'Hello'};\pretzelforce
{\bf begin}\pretzelindent\pretzelforce{\bf writeln}({\tt 'Hello Pretzel!'});\pretzeloutdent\pretzelforce{\bf end}.
\end{ppcode}
\end{quote}



\end{slide*}


% --------------------------------------------------

\begin{slide*}
    \begin{center}
     \vbox{
  \begin{quote}
    \begin{flushleft}
      \Large
      \leftskip20pt
      {\bf building a}\\
      \qquad{language independent}\\
      \qquad{\bf prettyprinter}
    \end{flushleft}
  \end{quote}
  }

  \end{center}

\bigskip
{\Large Zusammenfassung:}

\begin{itemize}
\item Was ist Prettyprinting?
\item Was sind Formatierungskommandos?
\item Formatierte Grammatik
\item 2 Eingaben $\rightarrow$ Pretzel $\rightarrow$ Prettyprinter
\item Ausgabe in \LaTeX
\end{itemize}

\bigskip
{\Large Anwendungen}

\medskip
{\Large Probleme}

\medskip
{\Large Ausblick}

\end{slide*}

\end{document}
