1
This commit is contained in:
Christoph
2021-09-02 18:46:46 +02:00
parent 81e2dd0745
commit 9c3a870992
3 changed files with 169 additions and 0 deletions

68
doc.org Normal file
View File

@ -0,0 +1,68 @@
#+TITLE: DynLang Projekt Dokumentation
#+OPTIONS: toc:nil
* Sytaktischer Zucker
Es waren keine Anpassungen des Interpreters notwendig, nur eine Erweiterung des Lexings/Parsings.
** Lexing
Es wurden neue Token definiert für
- Arithmetische Operatoren (+, -, *, /, %, ...)
- Arithmetische Operatoren mit Assignment (+=, -=, ...)
- Vergleiche (<, <=, ==, ...)
- Logische Operatoren (&&, ||, !)
** Parsing
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.
* Primitive Datentypen
Es wurden die Typen Double, String und Boolean hinzugefügt.
** Lexing
Es wurden neue Token definiert für
- String Literale ("Hallo")
- Boolean Literale ("true", "false")
- Double Literale (1.2, 1., .1, -.1, ...)
** Parsing
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.
** Objectmodel
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).
** Compiler/Interpreter
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.
* Garbage Collection
Es wurde Mark & Sweep verwendet.
** Implementierung
Im Objectmodel wurde der AbstractObject Klasse ein GC-Flag "mark" gegeben.
Im Objectspace werden alle existierenden Objekte in einer Liste gehalten.
Ablauf:
- Alle Markierungen entfernen
- Markieren (rekursiv ausgehend von der Lobby, diese wird also immer markiert)
- Entfernen (aus der Liste im Objectspace)
** Aufruf aus Simple
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.

BIN
doc.pdf Normal file

Binary file not shown.

101
doc.tex Normal file
View File

@ -0,0 +1,101 @@
% 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}