Pl0.Core API – Detaillierte Referenz
Überblick
Das Modul Pl0.Core bildet das Herzstück des TinyPl0-Compilers. Es implementiert die klassischen Compiler-Phasen:
- Lexikalische Analyse (Lexer): Umsetzung von Quelltext in Token
- Syntaxanalyse (Parser): Strukturanalyse und Symboltabellen-Verwaltung
- Codegenerierung: Erzeugung von P-Code-Instruktionen
Hauptkomponenten
Pl0Compiler – Der zentrale Einstiegspunkt
Pl0Compiler ist die Haupt-API für Benutzer des Core-Moduls. Die Klasse orchestriert den gesamten Kompilierungsprozess:
- Methode
Compile(): Übernimmt den Quellcode und gibt einCompilationResultzurück. - Eigenschaften: Ermöglichen die Anpassung des Compilers über
CompilerOptions.
Beispiel-Nutzung:
var compiler = new Pl0Compiler();
var result = compiler.Compile(sourceCode);
if (result.Success)
{
var instructions = result.Instructions;
// Instruktionen verwenden
}
Pl0Lexer – Lexikalische Analyse
Pl0Lexer teilt den Quelltext in Token auf. Jedes Token wird mit:
- TokenKind: Die Art des Tokens (Keyword, Identifier, Number, etc.)
- Textposition: Zeile und Spalte für Fehlermeldungen
- Textwert: Der tatsächliche Token-Text
Relevante Typen:
Pl0Token– Repräsentation eines einzelnen TokensTokenKind– Enumeration der Token-ArtenLexerResult– Ergebnis der lexikalischen AnalyseLexerDiagnostic– Fehlerdiagnosen
Pl0Parser – Syntaxanalyse
Pl0Parser implementiert die PL/0-Grammatik und erzeugt ein abstraktes Syntaxbaum-ähnliche Struktur. Der Parser arbeitet eng mit der Symboltabelle zusammen.
Relevante Typen:
SymbolTable– Speichert Symbole und deren ScopeSymbolEntry– Ein einzelnes Symbol (Variable, Konstante, Prozedur)SymbolKind– Art des Symbols
Codegenerierung & Instruktionen
Die Codegenerierung erzeugt P-Code-Instruktionen, die von der virtuellen Maschine ausgeführt werden.
Relevante Typen:
Instruction– Eine einzelne P-Code-InstruktionOpcode– Die Operation (LIT, LOD, STO, etc.)PCodeSerializer– Serialisierung von Instruktionen für Speicherung/Transport
P-Code Instruktionen:
// Beispiele von Opcodes
Opcode.LIT // Lade Konstante auf Stack
Opcode.LOD // Lade Variable auf Stack
Opcode.STO // Speichere Stack-Top in Variable
Opcode.ADD // Addition
Opcode.JMP // Unbedingter Sprung
Opcode.JPC // Bedingter Sprung
Fehlerbehandlung
Kompilierungsfehler werden in CompilerDiagnostic erfasst und über CompilationResult zurückgegeben.
Nutzung:
var result = compiler.Compile(sourceCode);
if (!result.Success)
{
foreach (var diagnostic in result.Diagnostics)
{
Console.WriteLine($"{diagnostic.Message} at {diagnostic.Position}");
}
}
Verbindung zu anderen Modulen
- → Pl0.Cli: Der CLI-Parser nutzt
Pl0Compilerfür diecompile-Kommando. - → Pl0.Vm: Die erzeugten P-Code-Instruktionen werden von
VirtualMachineausgeführt.