% Created 2021-09-02 Thu 18:45
% Intended LaTeX compiler: pdflatex
\documentclass[12pt,a4paper,ngerman,parskip=full]{scrartcl}
\usepackage{christex}
\author{Christoph Urlacher}
\date{\today}
\title{DynLang Projekt Dokumentation}
\hypersetup{
 pdfauthor={Christoph Urlacher},
 pdftitle={DynLang Projekt Dokumentation},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 28.0.50 (Org mode 9.5)}, 
 pdflang={English}}
\begin{document}

\maketitle

\section{Sytaktischer Zucker}
\label{sec:org90f987c}
Es waren keine Anpassungen des Interpreters notwendig, nur eine Erweiterung des Lexings/Parsings.

\subsection{Lexing}
\label{sec:org8349833}
Es wurden neue Token definiert für

\begin{itemize}
\item Arithmetische Operatoren (+, -, *, /, \%, \ldots{})
\item Arithmetische Operatoren mit Assignment (+=, -=, \ldots{})
\item Vergleiche (<, <=, ==, \ldots{})
\item Logische Operatoren (\&\&, ||, !)
\end{itemize}

\subsection{Parsing}
\label{sec:orga2826bd}
Arithmetische, Vergleichs- und Logische Operatoren werden im Parser zu Methodenaufrufen der Builtin-Methoden übersetzt.
Das Programm ist lauffähig, falls die Traits der entsprechenden Typen diese Methoden Implementieren.

Für Inplace-Operationen wird zusätzlich zum Builtin-Aufruf ein Assignment-Knoten im AST erzeugt.

Klammern von Ausdrücken ist ebenfalls möglich, dafür wird beim Parsing der geklammerte Ausdruck eine Ebene tiefer in den AST eingefügt.

Die Grammatik ist mehrdeutig, Präzedenz wird durch den Parsergenerator behandelt.

\section{Primitive Datentypen}
\label{sec:org550fd12}
Es wurden die Typen Double, String und Boolean hinzugefügt.

\subsection{Lexing}
\label{sec:org1181424}
Es wurden neue Token definiert für

\begin{itemize}
\item String Literale (``Hallo'')
\item Boolean Literale (``true'', ``false'')
\item Double Literale (1.2, 1., .1, -.1, \ldots{})
\end{itemize}

\subsection{Parsing}
\label{sec:org9a5fe03}
Der AST wurde um Expression-Knoten für Double-, String- und Boolean-Literale erweitert (analog zum IntLiteral-Knoten).
In der Grammatik können Double/String/Boolean Nichtterminale bei einer basicexpression auftreten.

\subsection{Objectmodel}
\label{sec:org00b3848}
Die Boolean/String/Double/Int Objekte erben vom neuen PrimitiveObject, welches den zugehörigen Trait, die Parents, die Slots und den Wahrheitsgehalt bestimmt.

Der Objectspace bekommt Methoden zum Erzeugen eines neuen Boolean/String/Double.

Für jeden Datentyp wurde ein neuer Builtin-Trait hinzugefügt mit Methoden zum Vergleich/zur Conversion etc (mit den entprechenden Primitives).

\subsection{Compiler/Interpreter}
\label{sec:orgff4dad7}
Es wurden neue Bytecodes für Literale hinzugefügt.
Diese sind größtenteils identisch zum IntLiteral-Bytecode, nur der StringLiteral- und DoubleLiteral-Bytecode speichert den Inhalt in der Symboltabelle.

Die Bytecodes werden analog zu IntLiteral interpretiert, nur bei StringLiteral und DoubleLiteral wird aus der Symboltabelle geladen.

\section{Garbage Collection}
\label{sec:org52b32d1}
Es wurde Mark \& Sweep verwendet.

\subsection{Implementierung}
\label{sec:orgf803db4}
Im Objectmodel wurde der AbstractObject Klasse ein GC-Flag ``mark'' gegeben.

Im Objectspace werden alle existierenden Objekte in einer Liste gehalten.

Ablauf:
\begin{itemize}
\item Alle Markierungen entfernen
\item Markieren (rekursiv ausgehend von der Lobby, diese wird also immer markiert)
\item Entfernen (aus der Liste im Objectspace)
\end{itemize}

\subsection{Aufruf aus Simple}
\label{sec:org9a2afd8}
Es wurde die ``gc'' Anweisung hinzugefügt: AST-Knoten (GCStatement) und Bytecode (GC)

Der Interpreter ruft im Objectspace die ``gc()'' auf und legt ``true'' auf den Stack, da ein Rückgabewert nötig ist.
\end{document}
