Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Errata corrige 1.0.0 - Fixing more typos #119

Open
wants to merge 92 commits into
base: errata-corrige-1.0.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
52cd3d3
typo e due punti
mgiacopu Dec 7, 2021
8b8d0e2
typo: constato -> constatato
mgiacopu Dec 7, 2021
3f9e6ee
maiuscola ad inizio frase
mgiacopu Dec 7, 2021
d05c20d
typo: cont -> conto
mgiacopu Dec 7, 2021
0a63775
typo: giraffe -> graffe (anche se faceva un sacco ridere)
mgiacopu Dec 7, 2021
2e72fdc
Merge branch 'filippodaniotti:errata-corrige-1.0.0' into errata-corri…
mgiacopu Dec 7, 2021
8c3e7ea
intendevo questa B -> b whoops
mgiacopu Dec 7, 2021
55ff1a1
Fix di qualche typos
fcucino Dec 13, 2021
85c5b41
cap7 typos
fcucino Dec 26, 2021
67ae2c2
cap8 typos
fcucino Dec 27, 2021
4965b9f
cap8 again
fcucino Dec 30, 2021
98bd332
cap9 start
fcucino Dec 30, 2021
6449a3d
cap9 es 1.2.1
fcucino Jan 6, 2022
723a1ce
cap10 typos
fcucino Jan 7, 2022
08d59fa
cap10 typos
fcucino Jan 8, 2022
0b8a6e6
cap11 typos
fcucino Jan 8, 2022
16943e8
cap12 typos
fcucino Jan 8, 2022
f2ddc87
appendixA typos and es num
fcucino Jan 8, 2022
2c92606
Fix filippodaniotti/Appunti-LFC#114
fcucino Jan 8, 2022
ebd9e25
cap4 typo
fcucino Jan 8, 2022
a713a3e
Linugaggi?
fcucino Jan 8, 2022
e5b312b
typos
fcucino Jan 8, 2022
3079a8d
Fix es2 cap 5.2.2
fcucino Jan 9, 2022
bdce924
typos
fcucino Jan 9, 2022
37af3a7
Descrizione specifica per il linguaggio (a^n b^n)
fcucino Jan 19, 2022
d9c7142
typos
fcucino Jan 19, 2022
c4b12bb
Shift e goto mancante tab 10.1 LALR fix filippodaniotti/Appunti-LFC#120
fcucino Jan 19, 2022
bd4a3e8
Linee verticali per alcune tabelle
fcucino Jan 19, 2022
509b6e0
Automa ora nativo closes filippodaniotti/Appunti-LFC#84
fcucino Jan 23, 2022
7d73559
automa lalr espressioni aritmetiche nativo
mgiacopu Jan 24, 2022
7846f75
cap10: parse-tree-int-float nativo
mgiacopu Jan 24, 2022
49e00a1
cap03: passata typo con spell-checker
mgiacopu Jan 28, 2022
e75d356
cap04: passata typo con spell-checker
mgiacopu Jan 28, 2022
16bac42
cap05: passata typo con spell-checker
mgiacopu Jan 28, 2022
a94ee3f
cap08: passata typo con spell-checker
mgiacopu Jan 28, 2022
7d8c596
cap09: passata typo con spell-checker
mgiacopu Jan 28, 2022
6c3a7d9
cap10: passata typo con spell-checker
mgiacopu Jan 28, 2022
076a2bf
cap11: passata typo con spell-checker
mgiacopu Jan 28, 2022
750e175
cap12: passata typo con spell-checker
mgiacopu Jan 28, 2022
08b07a2
appA: passata typo con spell-checker
mgiacopu Jan 28, 2022
6fb2b03
cambiato carattere U+2019 con U+0027 (apostrofo)
mgiacopu Jan 28, 2022
c5c845a
cap12: final-example-parsing-tree nativo
mgiacopu Jan 28, 2022
07b5d91
apostrofi anche in appendice A
mgiacopu Jan 28, 2022
b920190
cap10: second-ex-dependency-graph-part nativo
mgiacopu Jan 31, 2022
81ce8d7
cap10: second-ex-dependency-graph-part nativo pt.2
mgiacopu Jan 31, 2022
731e8d2
cap10: second-ex-parse-tree-part nativo
mgiacopu Jan 31, 2022
dd6a600
cap10: second-ex-dependency-graph-part-1 nativo
mgiacopu Jan 31, 2022
32c715b
cap10: second-ex-dependency-graph-part-2 nativo
mgiacopu Jan 31, 2022
af373d7
cap10: first-ex_sdd nativo
mgiacopu Jan 31, 2022
55d687c
cap10: first-ex_noted-parse-tree nativo
mgiacopu Jan 31, 2022
3abc9c2
cap10: first-ex_SDD-resolution-step-1 nativo
mgiacopu Jan 31, 2022
3081b90
cap10: first-ex_SDD-resolution-step-2 nativo
mgiacopu Jan 31, 2022
5b64ad6
cap10: first-ex_SDD-resolution-step-3 nativo
mgiacopu Jan 31, 2022
d15bd25
cap10: first-ex_SDD-resolution-step-3 nativo pt.2
mgiacopu Jan 31, 2022
89bc66c
cap10: first-ex_SDD-resolution-step-4 nativo
mgiacopu Jan 31, 2022
580f42d
cap10: first-ex_SDD-resolution-step-5 nativo
mgiacopu Jan 31, 2022
568cfe3
cap10: first-ex_sdd-dependency-graph nativo
mgiacopu Jan 31, 2022
7c43e8d
cap10: dependence-conflict nativo
mgiacopu Jan 31, 2022
5832865
cap10: fix second-ex
mgiacopu Jan 31, 2022
c57cc29
cap10: parse-tree-ae nativo
mgiacopu Jan 31, 2022
a00dfbb
cap10: dependency-graph-ae nativo
mgiacopu Jan 31, 2022
7416760
cap10: dependency-graph-ae fix
mgiacopu Jan 31, 2022
fa9222e
cap10: dependency-graph-ae-evaluation-order nativo
mgiacopu Jan 31, 2022
01fa8d5
cap10: ast-first-example nativo
mgiacopu Jan 31, 2022
66f73aa
cap06: nfa-for-grammar-regex nativo
mgiacopu Jan 31, 2022
2f8d68d
cap11: if-else-trans e if-then-abstract nativi
mgiacopu Feb 1, 2022
62dbc47
cap12: final-example-semantic-output nativo
mgiacopu Feb 1, 2022
25402a2
cap12: final-example-target-code nativo
mgiacopu Feb 1, 2022
b5f7b56
cap12: fix parentesi angolari
mgiacopu Feb 1, 2022
8691559
cap12: fix modulus operator
mgiacopu Feb 1, 2022
b2ca5f5
cap12: fix altezza parentesi
mgiacopu Feb 1, 2022
a2199e0
cap12: fix newline di troppo
mgiacopu Feb 1, 2022
0160f0b
cap11: allineati i due blocchi di codice
mgiacopu Feb 1, 2022
d67ac75
cap10: fix newline di troppo
mgiacopu Feb 1, 2022
0412e1f
cap10: ex-ast-creation nativo
mgiacopu Feb 1, 2022
b5d304c
cap10: fix tikz image scale
mgiacopu Feb 1, 2022
5b54b51
cap4 typo
fcucino Feb 1, 2022
8758410
Fix label transizione confusionaria
fcucino Feb 1, 2022
a4754bc
Merge remote-tracking branch 'origin/errata-corrige-1.0.0' into errat…
fcucino Feb 1, 2022
24c2456
cap10: abstract-syntax-tree-ae nativo
mgiacopu Feb 1, 2022
7514e3a
Merge branch 'errata-corrige-1.0.0' of github.com:mgiacopu/Appunti-LF…
mgiacopu Feb 1, 2022
36dac83
cap10: postorder-visit nativo
mgiacopu Feb 1, 2022
5b1d9b5
cap3 precisazione e cap9 formattato es automa simb e fix LA 9.3.4
fcucino Feb 2, 2022
e1b2397
appA tabea A.1 divisori verticali
fcucino Feb 2, 2022
91ad36c
cap09: fix newline di troppo
mgiacopu Feb 2, 2022
afa7ce5
cap09: fix newline di troppo pt2
mgiacopu Feb 2, 2022
f0a68ff
Fix allineamento di certe immagini compilando da main.tex
fcucino Feb 2, 2022
d48662d
cap09: ex-automa-simbolico-kernel nativo
mgiacopu Feb 2, 2022
88e5daa
cap04: thompson nativo
mgiacopu Feb 2, 2022
7854676
cap03: pl-proof nativo
mgiacopu Feb 2, 2022
7d5ea00
cap02: dangling-else nativo
mgiacopu Feb 2, 2022
1fe22e5
roba dello stile che serve altrimenti esplode
mgiacopu Feb 2, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
- [La squadra](#la-squadra)

## Il progetto
Questo testo è una dispensa di appunti scritta da studenti; lo scopo è quello di raccogliere i contenuti del corso di Linugaggi Formali e Compilatori e organizzarli secondo un'esposizione quanto più completa, efficace ed intuitiva possibile, tanto per lo studente desideroso di ottenere un'ottima padronanza degli argomenti, quanto anche per lo studente pigro in cerca di risorse per "portare a casa" l'esame.
Questo testo è una dispensa di appunti scritta da studenti; lo scopo è quello di raccogliere i contenuti del corso di Linguaggi Formali e Compilatori e organizzarli secondo un'esposizione quanto più completa, efficace ed intuitiva possibile, tanto per lo studente desideroso di ottenere un'ottima padronanza degli argomenti, quanto anche per lo studente pigro in cerca di risorse per "portare a casa" l'esame.

Gli appunti sono stati presi durante il corso di Linguaggi Formali e Compilatori tenuto dalla professoressa Paola Quaglia per il Corso di Laurea in Informatica, DISI, Università degli studi di Trento, anno accademico 2020-2021. I contenuti provengono quindi primariamente dalle lezioni della professoressa, mentre invece ordine ed esposizione sono in gran parte originali. Allo stesso modo, la maggior parte degli assets (figure, grafi, tabelle, pseudocodici) sono contenutisticamente tratti dal materiale della professoressa, ma ricreati e molto spesso manipolati dagli autori; inoltre, per ottenere il risultato appena citato, è stato molto spesso necessario abbandonare quasi del tutto l'esposizione della professoressa e usarla, appunto, come canovaccio per svilupparne una originale.

Expand Down
30 changes: 15 additions & 15 deletions src/chapters/01/chapter01.tex
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ \chapter{Introduzione}
\section{Il compilatore}
\subsection{Cos'è un compilatore}
Il compilatore, generalizzando, è un meccanismo che trasforma il codice sorgente in codice eseguibile.
Una caratteristica del codice eseguibile è l'essere machine dependent, difatti noi studieremo i principi generali di questa traduzione ma dobbiamo tenere bene a mente il fatto che ogni tipo di macchina ha il suo proprio linguaggio macchina che deve essere utilizzato per scrivere gli eseguibili da essa utilizzabili. Durante il corso, useremo spesso come punto di riferimento il compilatore gcc: tale progetto è in sviluppo da 20 anni e consta di ben più di due milioni di righe di codice!
Una caratteristica del codice eseguibile è l'essere machine dependent, difatti noi studieremo i principi generali di questa traduzione ma dobbiamo tenere bene a mente il fatto che ogni tipo di macchina ha il suo proprio linguaggio macchina che deve essere utilizzato per scrivere gli eseguibili da essa utilizzabili. Durante il corso, useremo spesso come punto di riferimento il compilatore gcc: tale progetto è in sviluppo da 20 anni e conta ben più di due milioni di righe di codice!

\paragraph{A cosa serve}
Lesempio classico di utilizzo di un compilatore è la traduzione da codice \texttt{c} in assembly.
L'esempio classico di utilizzo di un compilatore è la traduzione da codice \texttt{c} in assembly.
Un codice in assembly, tuttavia non è ancora eseguibile. Manca il passaggio di conversione da assembly a codice binario; tuttavia, questo passaggio non è così complesso dato che assembly ha una corrispondenza quasi 1:1 con il binario.
Ma questultima traduzione non è lunico passaggio mancante: rimane ancora da affrontare la fase di linking.
Ma quest'ultima traduzione non è l'unico passaggio mancante: rimane ancora da affrontare la fase di linking.

\subsection{Le fasi del processo di compilazione}
In questa sezione presentiamo le fasi del processo di compilazione come se fossero in pipeline, ma sappi che per ragioni di efficienza vengono spesso sovrapposte. Due punti fondamentali di questo processo sono i seguenti:
\begin{itemize}
\item se scriviamo il programma in un certo linguaggio, lo dovremo compilare con il compilatore dedicato esattamente a quel linguaggio;
\item quando scrivo codice per un certo compilatore devo rispettare la grammatica del linguaggio per cui il compilatore lavora.
\end{itemize}
La grammatica di un linguaggio definisce la struttura legale delle varie operazioni possibili in quel linguaggio; ad esempio, può definire questa forma per unoperazione di assegnamento:
La grammatica di un linguaggio definisce la struttura legale delle varie operazioni possibili in quel linguaggio; ad esempio, può definire questa forma per un'operazione di assegnamento:
\begin{equation*}
\textrm{\texttt{Identifier Assign Expression Semicolon}}
\end{equation*}
Expand All @@ -36,29 +36,29 @@ \subsection{Le fasi del processo di compilazione}
Avendo chiarito il punto di partenza, possiamo procedere con una descrizione delle fasi della compilazione.

\subsubsection{Analisi lessicale}
Il primo passaggio che compie il compilatore è lanalisi lessicale: questa traduce un flusso di caratteri in un flusso di \emph{tokens}, vale a dire che risolve ogni statement, riconoscendo il ruolo degli elementi che lo compongono e ritornandone una nuova stringa processata. Per esempio, traduce questa linea:
Il primo passaggio che compie il compilatore è l'analisi lessicale: questa traduce un flusso di caratteri in un flusso di \emph{tokens}, vale a dire che risolve ogni statement, riconoscendo il ruolo degli elementi che lo compongono e ritornandone una nuova stringa processata. Per esempio, traduce questa linea:
\begin{equation*}
\textrm{\texttt{pippo = 2*3;}}
\end{equation*}
In una nuova linea che descrive la funzione dei vari elementi, qualcosa di simile a:
\begin{equation*}
\textrm{\texttt{<ID, pippo> ASS <NUM,2 > MUL <NUM,3> SEMCOL}}
\end{equation*}
In questa fase è sufficiente dire che i token che otteniamo contengono le informazioni sul tipo di dato o comando che ogni singola stringa identifica. Nota che non vengono perse informazioni, non si tratta di una traduzione in cui la stringa dellID viene eliminata: si tiene la stringa \texttt{pippo} e vi si assegna il ruolo di identificatore (ID).
In questa fase è sufficiente dire che i token che otteniamo contengono le informazioni sul tipo di dato o comando che ogni singola stringa identifica. Nota che non vengono perse informazioni, non si tratta di una traduzione in cui la stringa dell'ID viene eliminata: si tiene la stringa \texttt{pippo} e vi si assegna il ruolo di identificatore (ID).

\subsubsection{Analisi sintattica}
Dopo lanalisi lessicale arriva lanalisi sintattica: questa analisi verifica che la sequenza di token sia aderente alla grammatica del linguaggio che stiamo utilizzando, ed è la fase in cui compaiono i temuti syntax error.
Dopo l'analisi lessicale arriva l'analisi sintattica: questa analisi verifica che la sequenza di token sia aderente alla grammatica del linguaggio che stiamo utilizzando, ed è la fase in cui compaiono i temuti syntax error.

Se rispettiamo le regole della grammatica il flusso di token viene tradotto in un parse tree (o meglio ancora, dipendentemente dal compilatore, in un albero di sintassi astratta). Ecco il parse tree che si può ricavare dal nostro esempio:
\begin{figure}[H]
\centering
\subimport{assets/figures/}{parse-tree.tex}
\caption{Esempio di parse tree}
\end{figure}
La struttura del parse tree è derivata dalla grammatica del linguaggio. Ad esempio, \texttt{<NUM,2> MUL <NUM,3>} sono sottoalberi di \texttt{ASS} poiché la grammatica del linguaggio prevede che lassegnazione abbia questa forma.
La struttura del parse tree è derivata dalla grammatica del linguaggio. Ad esempio, \texttt{<NUM,2> MUL <NUM,3>} sono sottoalberi di \texttt{ASS} poiché la grammatica del linguaggio prevede che l'assegnazione abbia questa forma.

\paragraph{}
Più la struttura del parse tree è minimale più le fasi successive sono efficienti; qui che entra in gioco lAST, che semplifica ancora lo schema: lalbero di sintassi astratta (abstract syntax tree, AST) è ottenuto dal parse tree compattando delle parti che non saranno utili nelle fasi seguenti della compilazione.
Più la struttura del parse tree è minimale più le fasi successive sono efficienti; qui che entra in gioco l'AST, che semplifica ancora lo schema: l'albero di sintassi astratta (abstract syntax tree, AST) è ottenuto dal parse tree compattando delle parti che non saranno utili nelle fasi seguenti della compilazione.
\begin{figure}[H]
\centering
\subimport{assets/figures/}{abstract-syntax-tree.tex}
Expand All @@ -69,25 +69,25 @@ \subsubsection{Analisi sintattica}
\paragraph*{}
Non è facile scrivere una grammatica che possa essere analizzata con efficienza da un compilatore e che, al tempo stesso, generi parse tree più semplici possibili; ma di questo discuteremo in futuro. È da notare che esistono svariate forme di compilatori, noi ne stiamo vedendo una presentazione generale, ma, in molti casi, fasi come creazione di parse tree e AST vengono spesso parallelizzate.
\paragraph{}
Loutput dellanalisi sintattica è chiamato \emph{tree}, ma non necessariamente è un albero: spesso può essere un grafo. Ad esempio in unoperazione del tipo:
L'output dell'analisi sintattica è chiamato \emph{tree}, ma non necessariamente è un albero: spesso può essere un grafo. Ad esempio in un'operazione del tipo:
\texttt{pippo = pippo * 2}
il nodo pippo sarebbe collegato sia alla radice che alloperatore \texttt{ASS}, creando quindi un grafo.
il nodo pippo sarebbe collegato sia alla radice che all'operatore \texttt{ASS}, creando quindi un grafo.
\begin{figure}[H]
\centering
\subimport{assets/figures/}{pippo-tree.tex}
\caption{Abstract syntax tree che diventa un grafo quando la variabile a cui si assegna il valore fa parte dell'espressione alla destra dell'assegnamento.}
\end{figure}

\subsubsection{Analisi semantica}
Ora è la fase dellanalisi semantica. Un esempio di operazione di analisi semantica è quello di capire se stiamo utilizzando il giusto operatore di moltiplicazione per loperazione che vogliamo effettuare. Stiamo chiaramente riferendoci a quei linguaggi in cui esistono diversi significati per uno stesso operatore, come nel caso in cui l'operatore \texttt{MUL} può significare moltiplicazione sia tra interi sia tra float. Quindi si può dire che in questo caso lanalisi semantica chiarisce quale significato ha loperatore \texttt{MUL}: nellesempio riportato in \ref{esempioAST} \texttt{MUL} = moltiplicazione tra due variabili di tipo \texttt{NUM}.
Ora è la fase dell'analisi semantica. Un esempio di operazione di analisi semantica è quello di capire se stiamo utilizzando il giusto operatore di moltiplicazione per l'operazione che vogliamo effettuare. Stiamo chiaramente riferendoci a quei linguaggi in cui esistono diversi significati per uno stesso operatore, come nel caso in cui l'operatore \texttt{MUL} può significare moltiplicazione sia tra interi sia tra float. Quindi si può dire che in questo caso l'analisi semantica chiarisce quale significato ha l'operatore \texttt{MUL}: nell'esempio riportato in \ref{esempioAST} \texttt{MUL} = moltiplicazione tra due variabili di tipo \texttt{NUM}.
\begin{figure}[H]
\centering
\subimport{assets/figures/}{semantica-mul.tex}
\caption{La semantica di \texttt{MUL} deve essere specificata}
\end{figure}

\subsubsection{Generazione del codice intermedio}
È il momento della generazione del codice intermedio: in questa fase viene generato un codice testuale traducendo il parse tree. Queste istruzioni sono leggibili dalluomo ma non è né assembly né codice effettivo, daltronde si chiama intermedio, no? Nell'esempio in \ref{codice_intermedio} abbiamo sulla sinistra il parse tree e sulla destra abbiamo un esempio del codice intermedio generato.
È il momento della generazione del codice intermedio: in questa fase viene generato un codice testuale traducendo il parse tree. Queste istruzioni sono leggibili dall'uomo ma non è né assembly né codice effettivo, d'altronde si chiama intermedio, no? Nell'esempio in \ref{codice_intermedio} abbiamo sulla sinistra il parse tree e sulla destra abbiamo un esempio del codice intermedio generato.
\begin{figure}[H]
\begin{minipage}{.5\textwidth}
\raggedleft
Expand All @@ -107,7 +107,7 @@ \subsubsection{Generazione del codice intermedio}
\end{figure}

\subsubsection{Generazione del target code}
Questa fase consiste nella traduzione del codice intermedio nellassembly della specifica macchina. Il codice binario non è necessariamente il target code della compilazione: ad esempio, potremmo essere su una VM e quindi generare una sorta di bytecode, o magari potremmo avere come obiettivo quello di tradurre in \texttt{c} per poi usare il gcc che sappiamo essere super-efficiente.
Questa fase consiste nella traduzione del codice intermedio nell'assembly della specifica macchina. Il codice binario non è necessariamente il target code della compilazione: ad esempio, potremmo essere su una VM e quindi generare una sorta di bytecode, o magari potremmo avere come obiettivo quello di tradurre in \texttt{c} per poi usare il gcc che sappiamo essere super-efficiente.

\section{Riassumendo le fasi della compilazione}
Riassumendo i passaggi necessari per la compilazione sono:
Expand All @@ -120,7 +120,7 @@ \section{Riassumendo le fasi della compilazione}
\end{enumerate}
Possiamo dividere questi passaggi in due gruppi:
\begin{itemize}[]
\item \emph{Front-end}: dallanalisi lessicale fino al codice intermedio.
\item \emph{Front-end}: dall'analisi lessicale fino al codice intermedio.
\item \emph{Back-end}: tutto il resto.
\end{itemize}
Ma perché passiamo dalla fase del codice intermedio? Per ragioni di modularità:
Expand Down
47 changes: 25 additions & 22 deletions src/chapters/02/assets/figures/dangling_else_1.tex
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
\documentclass[varwidth]{standalone}
\usepackage[T1]{fontenc}
\documentclass[convert = false, tikz]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[english, italian]{babel}
\usepackage{tikz}
\usetikzlibrary{automata, positioning, arrows, shapes.geometric, decorations.pathmorphing}

\usepackage{forest}
\usepackage{../../../../style_tree}
\usepackage{../../../../style_automata}

% arara: pdflatex
% arara: latexmk: { clean: partial }
\begin{document}
\begin{forest}
% derivation tree
[S
[if]
[b]
[then]
[S
[if]
[b]
[then]
[other]
[else]
[other]
]
]
\end{forest}
\end{document}
\tikzset{
node distance=2cm, % specifies the minimum distance between two nodes.
}
\begin{tikzpicture}

% Apex angle 60 degrees
\node[](S1){\textbf{S}};

\draw[] ([yshift=-1cm, xshift=1cm]S1.south) node[] (S2) {\textbf{S}};

\draw[] (S2.south) node[isosceles triangle, rotate=90, isosceles triangle apex angle=110, draw, minimum size=1.5cm, anchor=apex, fill=violet!20] (T) {};

\draw[] ([yshift=-3cm, xshift=0.15cm]S1.south) node[] (text) {\textbf{if b then if b then other else other}};

\draw [] (S1.south) -- (S2.north);
\draw [] (S1.south) -- ([xshift=-1.9cm]text.north);
\draw [] (S1.south) -- ([xshift=-2.5cm]text.north);
\draw [] (S1.south) -- ([xshift=-2.9cm]text.north);


\end{tikzpicture}
\end{document}
49 changes: 27 additions & 22 deletions src/chapters/02/assets/figures/dangling_else_2.tex
Original file line number Diff line number Diff line change
@@ -1,29 +1,34 @@
\documentclass[varwidth]{standalone}
\usepackage[T1]{fontenc}
\documentclass[convert = false, tikz]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[english, italian]{babel}
\usepackage{tikz}
\usetikzlibrary{automata, positioning, arrows, shapes.geometric, decorations.pathmorphing}

\usepackage{forest}
\usepackage{../../../../style_tree}
\usepackage{../../../../style_automata}

% arara: pdflatex
% arara: latexmk: { clean: partial }
\begin{document}
\begin{forest}
% derivation tree
[S
[if]
[b]
[then]
[S
[if]
[b]
[then]
[other]
]
[else]
[other]
]
\end{forest}
\end{document}
\tikzset{
node distance=2cm, % specifies the minimum distance between two nodes.
}
\begin{tikzpicture}

% Apex angle 60 degrees
\node[](S1){\textbf{S}};

\draw[] ([yshift=-1cm]S1.south) node[] (S2) {\textbf{S}};

\draw[] (S2.south) node[isosceles triangle, rotate=90, isosceles triangle apex angle=80, draw, minimum size=1.5cm, anchor=apex, fill=violet!20] (T) {};

\draw[] ([yshift=-3cm, xshift=0.1cm]S1.south) node[] (text) {\textbf{if b then if b then other else other}};

\draw [] (S1.south) -- (S2.north);
\draw [] (S1.south) -- ([xshift=1.65cm]text.north);
\draw [] (S1.south) -- ([xshift=2.55cm]text.north);
\draw [] (S1.south) -- ([xshift=-1.9cm]text.north);
\draw [] (S1.south) -- ([xshift=-2.5cm]text.north);
\draw [] (S1.south) -- ([xshift=-2.9cm]text.north);


\end{tikzpicture}
\end{document}
Loading