diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/syntax |
Initial commit
Diffstat (limited to 'macros/latex/contrib/syntax')
-rw-r--r-- | macros/latex/contrib/syntax/README | 66 | ||||
-rw-r--r-- | macros/latex/contrib/syntax/syntax.tex | 482 | ||||
-rw-r--r-- | macros/latex/contrib/syntax/syntaxintro.pdf | bin | 0 -> 89355 bytes | |||
-rw-r--r-- | macros/latex/contrib/syntax/syntaxintro.tex | 424 | ||||
-rw-r--r-- | macros/latex/contrib/syntax/syntaxtest.tex | 77 |
5 files changed, 1049 insertions, 0 deletions
diff --git a/macros/latex/contrib/syntax/README b/macros/latex/contrib/syntax/README new file mode 100644 index 0000000000..78c6841719 --- /dev/null +++ b/macros/latex/contrib/syntax/README @@ -0,0 +1,66 @@ +------------ syntax.tex -------------- + +Einfaches Erzeugen von Syntaxdiagrammen mit LaTeX. + +Die enthaltenen Dateien sind im Fruehjahr/Sommer 1997 entstanden, +um das Setzen eines Vorlesungsscripts zur Programmiersprache Pascal +zu vereinfachen. Auch wenn es sich nicht um ein Paket im LaTeX Sinne +handelt, ist die Erweiterung doch evtl. fuer den Einen oder Anderen +nuetzlich: + +Die Syntaxdiagramme werden durch eine spezielle Umgebung und +zugehoerige Befehle erzeugt, wobei die genaue Positionierung +automatisch erfolgt. + + +-------------------------------------------------------------- +README - diese Datei +syntax.tex - alles Wichtige +syntaxintro.tex - die Dokumentation +syntaxtest.tex - einige Beispieldiagramme + +-------------------------------------------------------------- +Verwendung in eigenem Dokument: + + \usepackage{fancybox} + \input{syntax.tex} + +-------------------------------------------------------------- +Beispiel eines Diagramms mit den wesentlichen Elementen: + + \begin{Syntaxdiagramm}% + \Wiederholung{% + \Alternative{% + \Stapel{\TerSym{Setzen}}% + {\TerSym{Sie}}% + }{\begin{Alternativen}% + {\TerSym{Das}}% + {\TerSym{Hand}}% + \SynVarR{einmal}\\ + \SynVarR{von}\\ + \end{Alternativen}% + }% + }{\SynVar{!!!!}% + } + \end{Syntaxdiagramm} + + +-------------------------------------------------------------- + Die LaTeX Ergaenzung syntax.tex unterliegt der + + GNU GENERAL PUBLIC LICENSE +-------------------------------------------------------------- + + + + +Kritik, Anregungen und eigene Erweiterungen bitte an: + + + -------------------------------------- + Bernd Worsch Doberaner Strasse 99 + 18057 Rostock + bernd.worsch@web.de + email preferred + --------------------------biichi-ji--- + diff --git a/macros/latex/contrib/syntax/syntax.tex b/macros/latex/contrib/syntax/syntax.tex new file mode 100644 index 0000000000..0c2ef8e621 --- /dev/null +++ b/macros/latex/contrib/syntax/syntax.tex @@ -0,0 +1,482 @@ +% Dieses File ist dazu gedacht, im Vorspann von LaTeX Dokumenten vermittels +% \include{syntax.tex} eingebunden zu werden. Es stellt dann die Umgebung +% syntaxdiagramm zur Verfuegung, mit deren Hilfe Syntaxdiagramme fuer +% z.B. Pascal erzeugt werden koennen. +% +% syntax.tex benoetigt nur noch folgendes LaTeX Paket: +% - fancybox.sty +% (Es muss im Vorspann des aufrufenden Dokumentes eingebunden werden.) +% +% Beispiele zur Verwendung siehe: syntaxtest.tex +% zur naeheren Dokumentation siehe: syntaxintro.tex +% zur Entwicklung des Codes siehe: syntaxdevel.tex +% +% Bernd Worsch 29.6.97 +% +% 05.07.97 \Leer als vertikale Stuetze +% groessere Abstaende in Alternativen-Umgebung +% +% to-do-list: +% -- Oval fuer SynVar ueber picture erzeugen -> fancybox unnoetig +% -- Alternativen-Parameter automatisch bestimmen +% -- Dokumentation (syntaxuse.tex) +% -- Kommentare im Quelltext +% -- Als sty-File implementieren + + + +\typeout{Verwende: 'syntax.tex' v0.02 von Bernd Worsch} + + + +%%%% Anlegen der benoetigten Laengen und Boxen + +\newlength{\breite} +\newlength{\hoehe} +\newlength{\tiefe} +\newlength{\gesamthoehe} +\newlength{\tmpLength} + +\newsavebox{\Messbox} + +\newlength{\LineLengStan} +\newlength{\LineThikStan} +\setlength{\LineLengStan}{4mm} +\setlength{\LineThikStan}{\fboxrule} + +\newsavebox{\Centerbox} +\newlength{\Centercor} + +\newlength{\VertSkipStan} +\setlength{\VertSkipStan}{3mm} + +\newsavebox{\upperbox} +\newsavebox{\lowerbox} +\newsavebox{\togetherbox} +\newlength{\VertLineLength} +\newlength{\VertSkip} + +\newlength{\upperVertLineLength} +\newlength{\lowerVertLineLength} + +\newlength{\tabulcor} + +%%%%% Beginn Syntaxdiagramm Befehle und Umgebungen + +\newenvironment{Syntaxdiagramm}[1][\PfeilR]% + {% +% +%%%% Befehl zum Vermessen von TeX-Strukturen +% +%\newcommand{\Messe}[1] +% { +% \sbox{\Messbox}{##1} +% +% \setlength{\breite}{\wd\Messbox} +% \setlength{\hoehe}{\ht\Messbox} +% \setlength{\tiefe}{\dp\Messbox} +% \setlength{\gesamthoehe}{\hoehe} +% \addtolength{\gesamthoehe}{\tiefe} +% \setlength{\tmpLength}{\hoehe} +% \addtolength{\tmpLength}{-\tiefe} +% \setlength{\tmpLength}{-0.5\tmpLength} +% +% \fbox +% { +% \begin{tabular}{ll} +% Breite: & \the\breite \\ +% Hoehe: & \the\hoehe \\ +% Tiefe: & \the\tiefe \\ +% Gesamthoehe: & \the\gesamthoehe \\ +% CenterCor: & \the\tmpLength +% \end{tabular} +% +% \usebox{\Messbox} +% } +% } +% +%%%% Befehl zum Justieren von Boxen +% +\newcommand{\CenterToBaseLine}[1] + {% + \sbox{\Centerbox}{##1}% + \setlength{\Centercor}{\ht\Centerbox}% + \addtolength{\Centercor}{-\dp\Centerbox}% + \setlength{\Centercor}{-0.5\Centercor}% + \addtolength{\Centercor}{0.5\LineThikStan}% + \raisebox{\Centercor}{\usebox{\Centerbox}}% + }% +% +%%%% Grundelemente eines Syntaxdiagramms +% +\newcommand{\Leer}% + {\rule[-1.3ex]{0pt}{2.5ex}}% +% +\newcommand{\Linie}% + {\rule{\LineLengStan}{\LineThikStan}}% +% +\newcommand{\KurzeLinie}% + {\rule{0.5\LineLengStan}{\LineThikStan}}% +% +\newcommand{\Tri} + {% + \CenterToBaseLine + {% + \setlength{\unitlength}{1pt}% + \begin{picture}(0,0)% + \put(0,0){\vector(0,1){0}}% + \end{picture}% + }% + }% +% +\newcommand{\TriR} + {% + \CenterToBaseLine + {% + \setlength{\unitlength}{1pt}% + \begin{picture}(0,0)% + \put(0,0){\vector(1,0){0}}% + \end{picture}% + }% + }% +% +\newcommand{\TriD} + {% + \CenterToBaseLine + {% + \setlength{\unitlength}{1pt}% + \begin{picture}(0,0)% + \put(0,0){\vector(0,-1){0}}% + \end{picture}% + }% + }% +% +\newcommand{\TriL} + {% + \CenterToBaseLine + {% + \setlength{\unitlength}{1pt}% + \begin{picture}(0,0)% + \put(0,0){\vector(-1,0){0}}% + \end{picture}% + }% + }% +% +\newcommand{\Dots} + {% + \CenterToBaseLine + {% + ...% + }% + }% +% +\newcommand{\SynVar}[1]% + {% + \CenterToBaseLine% + {% + \fbox% + {% + \rule{0.1em}{0pt}% + \rule[-0.3ex]{0pt}{2ex}% + ##1% + \rule{0.1em}{0pt}% + }% + }% + }% +% +\newcommand{\TerSym}[1]% + {% + \CenterToBaseLine% + {% + \ovalbox% + {% + \rule{0.2em}{0pt}% + \rule[-0.2ex]{0pt}{1.8ex}% + ##1% + \rule{0.2em}{0pt}% + }% + }% + }% +% +%%%% Kombinierte Grafische Elemente +% +\newcommand{\Ellipse}% + {% + \Linie\ \Dots\ \Linie% + }% +% +\newcommand{\PfeilR}% + {% + \Linie\TriR% + }% +% +\newcommand{\PfeilL}% + {% + \TriL\Linie% + }% +% +\newcommand{\SynVarR}[1]% + {% + \PfeilR\SynVar{##1}\Linie% + }% +% +\newcommand{\SynVarL}[1]% + {% + \Linie\SynVar{##1}\PfeilL% + }% +% +\newcommand{\TerSymR}[1]% + {% + \PfeilR\TerSym{##1}\Linie% + }% +% +\newcommand{\TerSymL}[1]% + {% + \Linie\TerSym{##1}\PfeilL% + }% +% +%%%% Vertikale grafische Elemente +% +\newcommand{\LinieO}[1]% + {% + \CenterToBaseLine% + {% + \raisebox{0pt}[0pt][0pt]% + {% + \makebox[0mm][c]{\rule{\LineThikStan}{##1}}% + }% + }% + }% +% +\newcommand{\LinieU}[1]% + {% + \CenterToBaseLine% + {% + \raisebox{0pt}[0pt][0pt]% + {% + \makebox[0mm][c]{\rule[-##1]{\LineThikStan}{##1}}% + }% + }% + }% +% +\newcommand{\PfeilO}[1]% + {% + \CenterToBaseLine% + {% + \raisebox{0pt}[0pt][0pt]% + {% + \makebox[0mm][c]{\TriD}% + \makebox[0mm][c]{\rule{\LineThikStan}{##1}}% + }% + }% + }% +% +\newcommand{\PfeilU}[1]% + {% + \CenterToBaseLine% + {% + \raisebox{0pt}[0pt][0pt]% + {% + \makebox[0mm][c]{\Tri}% + \makebox[0mm][c]{\rule[-##1]{\LineThikStan}{##1}}% + }% + }% + }% +% +%%%% Strukturen +% +%%% Wiederholung +% +\newcommand{\Wiederholung}[2]% + {% + \sbox{\upperbox}{##1}% + \sbox{\lowerbox}{##2}% + \setlength{\VertLineLength}{\dp\upperbox}% + \addtolength{\VertLineLength}{\ht\lowerbox}% + \addtolength{\VertLineLength}{\VertSkipStan}% + \addtolength{\VertLineLength}{0.5\LineThikStan}% + \setlength{\VertSkip}{\VertSkipStan}% + \addtolength{\VertSkip}{\dp\upperbox}% +% + \Linie% + \PfeilU{\VertLineLength}% +% + \renewcommand{\arraystretch}{0}% + \begin{tabular}[t]% % Zwei Eintraege + {% + @{\hrulefill}% % Verbindungslinie 1 + c% % Eintraege Zentrieren + @{\hrulefill}% % Verbindungslinie 2 + }% + \PfeilR\usebox{\upperbox}\Linie\\[\VertSkip] % Dies wiederholen + \Linie\usebox{\lowerbox}\PfeilL% % Dies in Gegenrichtung + \end{tabular}% +% + \LinieU{\VertLineLength}% + \Linie% + }% +% +%%% Alternative +% +\newcommand{\Alternative}[2]% + {% + \sbox{\upperbox}{##1}% + \sbox{\lowerbox}{##2}% +% + \setlength{\upperVertLineLength}{\dp\upperbox}% + \addtolength{\upperVertLineLength}{0.5\VertSkipStan}% + \addtolength{\upperVertLineLength}{0.5\LineThikStan}% +% + \setlength{\lowerVertLineLength}{\ht\lowerbox}% + \addtolength{\lowerVertLineLength}{0.5\VertSkipStan}% + \addtolength{\lowerVertLineLength}{0.5\LineThikStan}% +% + \setlength{\VertSkip}{\VertSkipStan}% + \addtolength{\VertSkip}{\dp\upperbox}% +% + \Linie% + \LinieO{\upperVertLineLength}% + \LinieU{\lowerVertLineLength}% +% + \renewcommand{\arraystretch}{0}% + \addtolength{\upperVertLineLength}{-0.5\LineThikStan}% + \raisebox{\upperVertLineLength}% + {% + \begin{tabular}[t]% % Zwei Eintraege + {% + @{\hrulefill}% % Verbindungslinie 1 + c% % Eintraege Zentrieren + @{\hrulefill}% % Verbindungslinie 2 + }% + \PfeilR\usebox{\upperbox}\Linie\\[\VertSkip] % Weg1 + \PfeilR\usebox{\lowerbox}\Linie% % Weg2 + \end{tabular}% + }% + \renewcommand{\arraystretch}{1}% + \addtolength{\upperVertLineLength}{0.5\LineThikStan}% +% + \LinieO{\upperVertLineLength}% + \LinieU{\lowerVertLineLength}% + \Linie% + }% +% +%%% Stapel +% +\newcommand{\Stapel}[2]% + {% + \sbox{\upperbox}{##1}% + \sbox{\lowerbox}{##2}% +% + \setlength{\upperVertLineLength}{\dp\upperbox}% + \addtolength{\upperVertLineLength}{0.5\VertSkipStan}% + \addtolength{\upperVertLineLength}{0.5\LineThikStan}% +% + \setlength{\lowerVertLineLength}{\ht\lowerbox}% + \addtolength{\lowerVertLineLength}{0.5\VertSkipStan}% + \addtolength{\lowerVertLineLength}{0.5\LineThikStan}% +% + \setlength{\VertSkip}{0.5\VertSkipStan}% + \addtolength{\VertSkip}{\dp\upperbox}% + \addtolength{\VertSkip}{-1\LineThikStan}% +% + \Linie% + \LinieO{\upperVertLineLength}% + \addtolength{\lowerVertLineLength}{-0.5\LineThikStan}% + \raisebox{\upperVertLineLength}{\KurzeLinie}% + \addtolength{\lowerVertLineLength}{0.5\LineThikStan}% + \LinieU{\lowerVertLineLength}% +% + \renewcommand{\arraystretch}{0}% + \addtolength{\upperVertLineLength}{-0.5\LineThikStan}% + \raisebox{\upperVertLineLength}% + {% + \addtolength{\upperVertLineLength}{0.5\LineThikStan}% + \begin{tabular}[t]% % Zwei Eintraege + {% + @{\hrulefill}% % Verbindungslinie 1 + c% % Eintraege Zentrieren + @{\hrulefill}% % Verbindungslinie 2 + }% + \PfeilR\usebox{\upperbox}\Linie\\[\VertSkip] % oberer Eintrag + \PfeilL\\[0.5\VertSkipStan]% + \PfeilR\usebox{\lowerbox}\Linie% % unterer Eintrag + \end{tabular}% + }% + \renewcommand{\arraystretch}{1}% + \addtolength{\upperVertLineLength}{0.5\LineThikStan}% +% + \LinieO{\upperVertLineLength}% + \addtolength{\lowerVertLineLength}{-0.5\LineThikStan}% + \raisebox{-\lowerVertLineLength}{\KurzeLinie}% + \addtolength{\lowerVertLineLength}{0.5\LineThikStan}% + \LinieU{\lowerVertLineLength}% + \Linie% + }% +% +%%%% Die Alternativen-Umgebung +% +\newenvironment{Alternativen}[2]% + {% + \renewcommand{\arraystretch}{2}% + \setlength{\tabulcor}{9.3pt}% + \sbox{\upperbox}{##1}% + \sbox{\lowerbox}{##2}% +% + \begin{lrbox}{\togetherbox}% + \begin{tabular}[t]% % Zwei Eintraege + {% + @{\hrulefill}% % Verbindungslinie 1 + c% % Eintraege Zentrieren + @{\hrulefill}% % Verbindungslinie 2 + }% + \PfeilR\usebox{\upperbox}\Linie\\ % erster Weg + }% +% % weitere Wege + {% + \PfeilR\usebox{\lowerbox}\Linie% % letzter Weg + \end{tabular}% + \end{lrbox}% +% + \setlength{\upperVertLineLength}{0.5\dp\togetherbox}% + \addtolength{\upperVertLineLength}{0.5\ht\togetherbox}% + \addtolength{\upperVertLineLength}{-\ht\upperbox}% + \addtolength{\upperVertLineLength}{0.5\LineThikStan}% + \addtolength{\upperVertLineLength}{-\tabulcor}% +% + \setlength{\lowerVertLineLength}{0.5\dp\togetherbox}% + \addtolength{\lowerVertLineLength}{0.5\ht\togetherbox}% + \addtolength{\lowerVertLineLength}{-\dp\lowerbox}% +% + \Linie% + \LinieO{\upperVertLineLength}% + \LinieU{\lowerVertLineLength}% +% + \CenterToBaseLine{\usebox{\togetherbox}}% +% + \LinieO{\upperVertLineLength}% + \LinieU{\lowerVertLineLength}% + \Linie% + }% +% +%%%%% Ende Syntaxdiagramm Befehle und Umgebungen +% + \providecommand{\ContSym}{#1} + \renewcommand{\ContSym}{#1} + \begin{lrbox}{\Messbox}% + }% + {% + \end{lrbox}% + \setlength{\hoehe}{\ht\Messbox}% + \addtolength{\hoehe}{\VertSkipStan}% + \setlength{\tiefe}{\dp\Messbox}% + \addtolength{\tiefe}{\VertSkipStan}% + \raisebox{0pt}[\hoehe][\tiefe]% + {% + \Linie% + \usebox{\Messbox}% + \ContSym% + }% + }% +% +%%%%% --Und Schluss-- + diff --git a/macros/latex/contrib/syntax/syntaxintro.pdf b/macros/latex/contrib/syntax/syntaxintro.pdf Binary files differnew file mode 100644 index 0000000000..8940d18d63 --- /dev/null +++ b/macros/latex/contrib/syntax/syntaxintro.pdf diff --git a/macros/latex/contrib/syntax/syntaxintro.tex b/macros/latex/contrib/syntax/syntaxintro.tex new file mode 100644 index 0000000000..d787497070 --- /dev/null +++ b/macros/latex/contrib/syntax/syntaxintro.tex @@ -0,0 +1,424 @@ +% Eine kurze Einfuehrung in die Verwendung von syntax.tex! +% +% syntax.tex ermoeglicht das automatische Setzen von Syntaxdiagrammen fuer +% Progammiersprachen durch spezielle Befehle in LaTeX-Dokumenten +% +% Bernd Worsch 7.7.97 / 27.1.00 +% +% + +\documentclass{article} +\usepackage{german} +\usepackage{fancybox} + +% Einbinden von syntax.tex +\include{syntax} +%Rundung fuer ovalbox einstellen +\cornersize{1} + +\title{\syn \\Eine "Ubersicht} +\author{Bernd Worsch} +\date{7. Juli 1997} + +\newcommand{\syn}{syntax.tex} +\newcommand{\vers}{0.02} +\newcommand{\dx}{\rule{2mm}{0pt}} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{Einleitung} +Zur Beschreibung von Zusammenh"angen in formal sprachlichen Systemen, +findet h"aufig die sogenannte Bachus--Naur--Form kurz BNF Verwendung. +Von dieser (textlichen) Darstellung ausgehend wird gerade im Zusammenhang +mit h"oheren Programmiersprachen gerne eine grafische Beschreibung zur +Verdeutlichung herangezogen. +Solche \emph{Syntaxdiagramme} sind intuitiv verst"andlich und verdeutlichen +auf anschauliche Weise den formalen Aufbau der jeweiligen Programmiersprache. + +Das File \syn\ erm"oglicht das einfache Erstellen solcher Diagramme in +\LaTeX -Dokumenten. +Statt mit geometrischen Objekten (Linien, Kreise, etc.) zu arbeiten, +nutzt der Anwender dazu Befehle, die schon im Quelldokument die zu +illustrierenden Kontrollstrukturen wiederspiegeln. + +\section{Bevor es funktioniert \dots} +Um die M"oglichkeiten von \syn\ nutzen zu k"onnen mu"s die Datei vor dem +ersten zu setzenden Syntaxdiagramm durch +\verb+\input{syntax.tex}+ +in das eigene Dokument eingef"ugt werden. Da es in der vorliegenden +Version \vers\ noch auf einen Befehl des Pakets fancybox.sty +zur"uckgreift, mu"s dieses am Anfang der eigenen Datei aktiviert werden. +Wie f"ur alle Pakete geschieht dies durch den Befehl: +\verb+\usepackage{fancybox}+. + +\section{Grundelemente von \syn} +Abgesehen von Hilfskonstrukten, insbesondere Linien und Pfeilen, +bestehen Syntaxdiagramme aus Terminalsymbolen, den elementaren +Grundbausteinen einer Programmiersprache, und Syntaxvariablen. +Letztere stehen als Platzhalter f"ur syntaktische Konstruktionen. + +Beide Grundelemente stehen innerhalb der Umgebung \verb+Syntaxdiagramm+ +mit den Befehlen \verb+\TerSym+ und \verb+\SynVar+ zur Verf"ugung. + +Die Umgebung \verb+Syntaxdiagramm+ erzeugt zun"achst ein leeres +Syntaxdiagramm, also einen von links nach rechts verlaufenden Pfeil. +An inneren Befehlen stehen unter anderem +elementare Teilstrukturen von Syntaxdiagrammen bereit. Einige haben +keine Parameter und erzeugen beispielsweise Linien oder Pfeile, +\verb+\TerSym+ und \verb+\SynVar+ hingegen erhalten als Parameter +einen Text. +Da diese Befehle stets innerhalb des umgebenden Pfeils auftreten, +wurden in der folgenden "Ubersicht die inneren Elemente durch +Leerzeichen von der "au"seren +Umgebung abgegrenzt. Diese Zwischenr"aume sind im endg"ultigen +Diagramm unerw"unscht. +Befehle und Umgebungen in Syntaxdiagrammen sollten daher mit einem +Kommentarzeichen (\verb+%+) +beendet werden , falls Zeilenumbr"uche im Eingabetext vorgenommen werden. +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & \begin{Syntaxdiagramm}\end{Syntaxdiagramm} \\ + \hline + \verb+\Linie+ & \begin{Syntaxdiagramm}\dx\Linie\dx\end{Syntaxdiagramm}\\ + \verb+\PfeilR+ & \begin{Syntaxdiagramm}\dx\PfeilR\dx\end{Syntaxdiagramm}\\ + \verb+\PfeilL+ & \begin{Syntaxdiagramm}\dx\PfeilL\dx\end{Syntaxdiagramm}\\ + \verb+\Ellipse+ & \begin{Syntaxdiagramm}\dx\Ellipse\dx\end{Syntaxdiagramm}\\ + \verb+\Leer+ & \begin{Syntaxdiagramm}\dx\Leer\dx\end{Syntaxdiagramm}\\ + \hline + \verb+\TerSym{xxxx}+ & + \begin{Syntaxdiagramm}\dx\TerSym{xxxx}\dx\end{Syntaxdiagramm} \\ + \verb+\SynVar{xxxx}+ & + \begin{Syntaxdiagramm}\dx\SynVar{xxxx}\dx\end{Syntaxdiagramm} +\end{tabular} +\medskip + +Aus obigen Grundelementen und vertikalen Linien werden alle Syntaxdiagramme +aufgebaut. Die vertikalen Linien und Pfeile sind prinzipiell unter den +Namen +\verb+\LinieO{x}+,\verb+\LinieU{x}+,\verb+\PfeilO{x}+ und \verb+\PfeilU{x}+ +ansprechbar, wobei \verb+x+ die jeweilige L"ange festlegt, sie sind +jedoch nur intern notwendig. +Um die \LaTeX --Beschreibung eines Syntaxdiagramms kompakt zu halten +existieren schlie"slich noch vier abk"urzende Schreibweisen. Es sind +die zusammengesetzten Grundelemente: +\medskip + +\begin{tabular}{l|c} + \verb+\TerSymR{xxxx}+ & + \begin{Syntaxdiagramm}\dx\TerSymR{xxxx}\dx\end{Syntaxdiagramm} \\ + \verb+\TerSymL{xxxx}+ & + \begin{Syntaxdiagramm}\dx\TerSymL{xxxx}\dx\end{Syntaxdiagramm} \\ + \verb+\SynVarR{xxxx}+ & + \begin{Syntaxdiagramm}\dx\SynVarR{xxxx}\dx\end{Syntaxdiagramm} \\ + \verb+\SynVarL{xxxx}+ & + \begin{Syntaxdiagramm}\dx\SynVarL{xxxx}\dx\end{Syntaxdiagramm} \\ +\end{tabular} +\medskip + +\section{Strukturelemente von \syn} +Aus den Grundelementen allein lassen sich noch keine (bzw. sehr wenige) +Syntaxdiagramme aufbauen, es fehlt die M"oglichkeit diese Elemente zu +verbinden. Zu diesem Zweck stellt \syn\ Alternativen und Wiederholungen +bereit. +F"ur beide Strukturen existieren zun"achst Befehle, die je +zwei Parameter "ubernehmen. Im Fall des Befehls +\verb+\Alternative{x1}{x2}+ steht \verb+x1+ f"ur den Teil des +Strukturdiagramms der auf dem ersten Pfad, \verb+x2+ +f"ur den Teil der auf dem zweiten Pfad durchlaufen wird. +Bei \verb+\Wiederholung{x1}{x2}+ entspricht \verb+x1+ dem wiederholten +Teil und \verb+x2+ allem, was im zur"ucklaufenden Pfad auftritt. +Die erzeugten Bilder wieder in einer Tabelle: +\medskip + +\begin{tabular}{l|c} + \verb+\Alternative{x1}{x2}+ & + \begin{Syntaxdiagramm}\dx\Alternative{x1}{x2}\dx\end{Syntaxdiagramm} \\ + \verb+\Wiederholung{x1}{x2}+ & + \begin{Syntaxdiagramm}\dx\Wiederholung{x1}{x2}\dx\end{Syntaxdiagramm} +\end{tabular} +\medskip + +F"ur Wiederholungen ist diese Konstruktion ausreichend, bei Alternativen +sollten jedoch mehr als zwei Pfade m"oglich sein, dies wird durch die +Umgebung \verb+Alternativen+ realisiert. Sie "ubernimmt "ahnlich obigen +Befehlen zwei Parameter. \verb+x1+ enth"alt wie gehabt den ersten Pfad, +\verb+x2+ hingegen den letzten der m"oglichen Pfade. +Alle weiteren Pfade werden +innerhalb der Umgebung getrennt durch \verb+\\+ angegeben, also wie in +einer einspaltigen \verb+\tabular+--Umgebung, wobei auch auf die letzte +Zeile ein abschlie"sendes \verb+\\+ folgt. +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Alternativen}+\\ + \verb+ {x1}{x2}+\\ + \verb+ x3\\+\\ + \verb+\end{Alternativen}+ + \end{tabular} & + \begin{Syntaxdiagramm}\dx + \begin{Alternativen} + {x1}{x2} + x3 \\ + \end{Alternativen} + \dx\end{Syntaxdiagramm} +\end{tabular} +\medskip + +\section{Setzen von Syntaxdiagrammen} +Praktisch geht man nun so vor, da"s innerhalb der "au"seren Umgebung +im einfachsten Fall eine Folge von +Syntax--Variablen und Terminal--Symbolen aufgelistet wird. Hierzu +verwendet man die nach rechts gerichteten Varianten. + +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \TerSymR{xx}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \TerSymR{xx}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \SynVarR{xx}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \SynVarR{xx}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \TerSymR{xx}%+\\ + \verb+ \SynVarR{xx}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \TerSymR{xx}% + \SynVarR{xx}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +Etwas anspruchsvoller k"onnen Syntax--Variablen und Terminal--Symbole in +Strukturen auftreten. In diesem Fall sorgt die umgebende Struktur f"ur die +notwendigen Pfeile, man verwendet also die ungerichteten Befehle +\verb+\TerSym{}+ und \verb+\SynVar{}+: +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \Wiederholung%+\\ + \verb+ {\TerSym{x1}}%+\\ + \verb+ {\SynVar{x2}}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \Wiederholung% + {\TerSym{x1}}% + {\SynVar{x2}}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \Alternative%+\\ + \verb+ {\TerSym{x1}}%+\\ + \verb+ {\SynVar{x2}}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \Alternative% + {\TerSym{x1}}% + {\SynVar{x2}}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +In der \verb+Alternativen+--Umgebung m"u"sen die inneren Pfade selbst f"ur +ihre Pfeile sorgen (hier: Terminal--Symbol x3). +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \begin{Alternativen}%+\\ + \verb+ {\TerSym{x1}}%+\\ + \verb+ {\SynVar{x2}}%+\\ + \verb+ \TerSymR{x3}\\%+\\ + \verb+ \end{Alternativen}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \begin{Alternativen}% + {\TerSym{x1}}% + {\SynVar{x2}}% + \TerSymR{x3}\\% + \end{Alternativen}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +Schlie"slich k"onnen auch Strukturen beliebig kombiniert und +verschachtelt werden: +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \Alternative%+\\ + \verb+ {\Wiederholung%+\\ + \verb+ {\TerSym{x1}}%+\\ + \verb+ {\TerSym{x1}}}%+\\ + \verb+ {\SynVar{x2}}%+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \Alternative% + {\Wiederholung% + {\TerSym{x1}}% + {\TerSym{x1}}}% + {\SynVar{x2}}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +Die vielen Kommentarzeichen (\%) in der Eingabe sind nicht an allen Stellen +notwendig. Es ist aber in jedem Fall einfacher alle Zeilen mit einem \% zu +beenden, als jeweils zu "uberlegen, ob es eventuell weggelassen werden +k"onnte. +Sollte ein notwendiges \%-Zeichen vergessen werden, so erscheint an +entsprechender Stelle im Diagramm ein Leerzeichen. Umgekehrt weisen solche +Br"uche im Diagramm auf vergessene Kommentarzeichen hin. +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \TerSymR{xx}+\\ + \verb+ \TerSymR{xx}+\\ + \verb+\end{Syntaxdiagramm}+ + \end{tabular} & + \begin{Syntaxdiagramm}% + \TerSymR{xx} + \TerSymR{xx} + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +Sollte ein Syntaxdiagramm zu lang f"ur eine einzelne Zeile werden, so +kann ein Teildiagramm zu einer Syntax-Variable zusammengezogen +werden und diese in einem weiteren Diagramm aufgeschl"usselt werden. + +Ist dies nicht erw"unscht, so kann die \verb+Syntaxdiagramm+-Umgebung +mit einem optionalen Parameter aufgerufen werden. Der Inhalt des +Parameters ersetzt dann als Ende--Symbol den abschlie"senden Pfeil. +Verwendet man den Befehl \verb+\Dots+ so kann man das Diagramm mit +einem weiteren in der n"achsten Zeile fortsetzen. Dieses kann durch +eine voranstehendes \verb+\quad+ etwas einger"uckt werden. +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}[\Dots]%+\\ + \verb+ \TerSymR{x1}+\\ + \verb+\end{Syntaxdiagramm} +\\ + \verb+\quad+\\ + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \TerSymR{x2}+\\ + \verb+\end{Syntaxdiagramm} + + \end{tabular} & + \begin{tabular}{l} + \begin{Syntaxdiagramm}[\Dots]% + \TerSymR{x1}% + \end{Syntaxdiagramm} \\ + \quad + \begin{Syntaxdiagramm}% + \TerSymR{x2}% + \end{Syntaxdiagramm} + \end{tabular} +\end{tabular} +\medskip + +Schlie"slich gibt es den Stapel Befehl der zwei Teile eines Diagramms +untereinander setzt und sie durch einen r"ucklaufenden Pfeil verkn"upft. +Oft ist das Aufteilen ohne r"ucklaufenden Pfeil allerdings sowohl +einfacher als auch "ubersichtlicher. +\medskip + +\begin{tabular}{l|c} + \begin{tabular}{l} + \verb+\begin{Syntaxdiagramm}%+\\ + \verb+ \Stapel{\TerSym{x1}}%+\\ + \verb+ {\TerSym{x2}}%+\\ + \verb+\end{Syntaxdiagramm} +\\ + \end{tabular} & + \begin{Syntaxdiagramm}% + \Stapel{\TerSym{x1}}% + {\TerSym{x2}}% + \end{Syntaxdiagramm} +\end{tabular} +\medskip + +\section{Weitere Hinweise} + +\begin{itemize} +\item +Einige Konstruktionen erzeugen nur dann Verbindungslinien korrekter L"ange, +wenn auf den Pfaden Eintr"age mit der richtigen H"ohe bzw. Tiefe auftreten. +Im ersten Beispiel zur Umgebung \verb+Alternativen + ist dies nicht der Fall. +\item +In der Datei syntax.tex sind einige Anmerkungen und eine kleine Liste +m"oglicher Erweiterungen. Wer Zeit und Lust hat darf sich gerne austoben +und das eine oder andere erledigen. +\item +Kritik, Anregungen und eigene Beitr"age sind in jedem Fall erw"unscht. +Vielleicht finde ich bei ausreichendem Interesse sogar die Zeit noch ein +wenig an diesem Paket zu basteln. +\end{itemize} + +\section{Kontakt} + +\begin{verbatim} + + -------------------------------------- + Bernd Worsch + Doberanerstrasse 99 + 18057 Rostock + bernd.worsch@stud.uni-rostock.de + email preferred + --------------------------biichi-ji--- + +\end{verbatim} + +\end{document} + + + + + + + + diff --git a/macros/latex/contrib/syntax/syntaxtest.tex b/macros/latex/contrib/syntax/syntaxtest.tex new file mode 100644 index 0000000000..7bd833fdc7 --- /dev/null +++ b/macros/latex/contrib/syntax/syntaxtest.tex @@ -0,0 +1,77 @@ +% Dokument zum Test und zur Entwicklung von syntax.tex! +% +% Bernd Worsch 26.6.97 +% +% + +\documentclass{article} +\usepackage{german} +\usepackage{fancybox} + +% Einbinden von syntax.tex +\include{syntax} + +\begin{document} + +\title{Syntaxdiagramme fuer \TeX} +\author{Bernd Worsch} +\date{12. Mai 1997} + +\maketitle + +\begin{Syntaxdiagramm}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \TerSymR{xxx}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \SynVarR{xxx}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \Stapel{\TerSym{xxx}}{\SynVar{xxx}}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \Wiederholung{\TerSym{xxx}}{\SynVar{xxx}}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \Alternative{\TerSym{xxx}}{\SynVar{xxx}}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \begin{Alternativen}{\TerSym{xxx}}{\TerSym{xxx}}% + \SynVarR{xxx}\\ + \SynVarR{xxx}\\ + \end{Alternativen}% +\end{Syntaxdiagramm} + +\begin{Syntaxdiagramm}% + \Wiederholung{% + \Alternative{% + \Stapel{\TerSym{Setzen}}% + {\TerSym{Sie}}% + }{\begin{Alternativen}% + {\TerSym{Das}}% + {\TerSym{Hand}}% + \SynVarR{einmal}\\ + \SynVarR{von}\\ + \end{Alternativen}% + }% + }{\SynVar{!!!!}% + } +\end{Syntaxdiagramm} + + +\end{document} + + + + + + + + |