Table of Contents

Class Pl0Parser

Namespace
Pl0.Core
Assembly
Pl0.Core.dll

Rekursiv-absteigender Parser, der P-Code und Diagnosen erzeugt.

public sealed class Pl0Parser
Inheritance
Pl0Parser
Inherited Members

Constructors

Pl0Parser(IReadOnlyList<Pl0Token>, CompilerOptions)

Erstellt einen Parser für den gegebenen Token-Strom und Optionen.

public Pl0Parser(IReadOnlyList<Pl0Token> tokens, CompilerOptions options)

Parameters

tokens IReadOnlyList<Pl0Token>

Vom Lexer erzeugte Token.

options CompilerOptions

Compiler-Optionen.

Fields

BlockContinuationTokens

Token, die einen Block nach Deklarationen fortsetzen können.

private static readonly TokenKind[] BlockContinuationTokens

Field Value

TokenKind[]

ErrorProgramTooLong

Diagnose-Code für Programme, die die maximale Befehlsanzahl überschreiten.

private const int ErrorProgramTooLong = 35

Field Value

int

ErrorSymbolTableOverflow

Diagnose-Code für Symboltabellen-Überlauf.

private const int ErrorSymbolTableOverflow = 34

Field Value

int

ExpressionFollowTokens

Token, die einem Ausdruck folgen können.

private static readonly TokenKind[] ExpressionFollowTokens

Field Value

TokenKind[]

OprAdd

OPR-Opcode für Addition.

private const int OprAdd = 2

Field Value

int

OprDiv

OPR-Opcode für Division.

private const int OprDiv = 5

Field Value

int

OprEq

OPR-Opcode für Gleichheitsvergleich.

private const int OprEq = 8

Field Value

int

OprGeq

OPR-Opcode für Größer-gleich-Vergleich.

private const int OprGeq = 11

Field Value

int

OprGt

OPR-Opcode für Größer-als-Vergleich.

private const int OprGt = 12

Field Value

int

OprLeq

OPR-Opcode für Kleiner-gleich-Vergleich.

private const int OprLeq = 13

Field Value

int

OprLt

OPR-Opcode für Kleiner-als-Vergleich.

private const int OprLt = 10

Field Value

int

OprMul

OPR-Opcode für Multiplikation.

private const int OprMul = 4

Field Value

int

OprNegate

OPR-Opcode für unäre Negation.

private const int OprNegate = 1

Field Value

int

OprNeq

OPR-Opcode für Ungleichheitsvergleich.

private const int OprNeq = 9

Field Value

int

OprOdd

OPR-Opcode für Ungerade-Test.

private const int OprOdd = 6

Field Value

int

OprRead

OPR-Opcode für Eingabe-Lesen.

private const int OprRead = 14

Field Value

int

OprSub

OPR-Opcode für Subtraktion.

private const int OprSub = 3

Field Value

int

OprWrite

OPR-Opcode für Ausgabe-Schreiben.

private const int OprWrite = 15

Field Value

int

StatementFollowTokens

Token, die einer Anweisung folgen können.

private static readonly TokenKind[] StatementFollowTokens

Field Value

TokenKind[]

StatementStartTokens

Token, die eine Anweisung beginnen können.

private static readonly TokenKind[] StatementStartTokens

Field Value

TokenKind[]

_code

Erzeugte P-Code-Befehle.

private readonly List<Instruction> _code

Field Value

List<Instruction>

_culture

Zielsprache für Fehlertexte.

private readonly CultureInfo _culture

Field Value

CultureInfo

_diagnostics

Compiler-Diagnosen.

private readonly List<CompilerDiagnostic> _diagnostics

Field Value

List<CompilerDiagnostic>

_options

Compiler-Optionen für Grenzwerte und Dialekt.

private readonly CompilerOptions _options

Field Value

CompilerOptions

_position

Aktuelle Token-Position in der Token-Liste.

private int _position

Field Value

int

_reportedUnexpectedEof

Verfolgt ob unerwartetes EOF bereits gemeldet wurde.

private bool _reportedUnexpectedEof

Field Value

bool

_rm

ResourceManager für lokalisierte Fehlertexte.

private readonly ResourceManager _rm

Field Value

ResourceManager

_symbols

Symboltabelle für den aktuellen Parse-Vorgang.

private readonly SymbolTable _symbols

Field Value

SymbolTable

_tokens

Zu parsende Token.

private readonly IReadOnlyList<Pl0Token> _tokens

Field Value

IReadOnlyList<Pl0Token>

Properties

Current

Gibt das aktuelle Token zurück.

private Pl0Token Current { get; }

Property Value

Pl0Token

Methods

Advance()

Rückt zum nächsten Token vor und gibt das vorherige zurück.

private Pl0Token Advance()

Returns

Pl0Token

Das verbrauchte Token.

ComputeLevelDifference(int, SymbolEntry)

Berechnet den lexikalischen Ebenenunterschied für eine Symbolreferenz.

private int ComputeLevelDifference(int currentLevel, SymbolEntry symbol)

Parameters

currentLevel int

Aktuelle lexikalische Ebene.

symbol SymbolEntry

Referenziertes Symbol.

Returns

int

Der nicht-negative Ebenenunterschied.

Emit(Opcode, int, int)

Gibt einen P-Code-Befehl aus und gibt seinen Index zurück.

private int Emit(Opcode opcode, int level, int argument)

Parameters

opcode Opcode

Auszugebender Opcode.

level int

Lexikalisches Ebenen-Argument.

argument int

Befehlsargument.

Returns

int

Befehlsindex.

Expect(TokenKind, int, string)

Erwartet ein Token einer bestimmten Art oder meldet eine Diagnose.

private Pl0Token Expect(TokenKind kind, int code, string message)

Parameters

kind TokenKind

Erwartete Token-Art.

code int

Diagnose-Code bei Nichtübereinstimmung.

message string

Diagnose-Meldung bei Nichtübereinstimmung.

Returns

Pl0Token

Das verbrauchte Token.

ExpectOrSync(TokenKind, int, string, params TokenKind[])

Erwartet ein Token oder synchronisiert zu einer Wiederherstellungsmenge.

private Pl0Token ExpectOrSync(TokenKind kind, int code, string message, params TokenKind[] syncTokens)

Parameters

kind TokenKind

Erwartete Token-Art.

code int

Diagnose-Code bei Nichtübereinstimmung.

message string

Diagnose-Meldung bei Nichtübereinstimmung.

syncTokens TokenKind[]

Token zur Synchronisation.

Returns

Pl0Token

Das verbrauchte Token wenn gefunden.

IsRelation(TokenKind)

Ermittelt ob eine Token-Art ein Vergleichsoperator ist.

private static bool IsRelation(TokenKind kind)

Parameters

kind TokenKind

Zu prüfende Token-Art.

Returns

bool

True wenn das Token ein Vergleichsoperator ist.

Lookup(string, TextPosition)

Schlägt ein Symbol nach und meldet einen Fehler wenn es fehlt.

private SymbolEntry? Lookup(string name, TextPosition position)

Parameters

name string

Symbolname.

position TextPosition

Position für Diagnosen.

Returns

SymbolEntry

Der Symboltabelleneintrag oder null.

Msg(string)

Gibt den lokalisierten Meldungstext für den angegebenen Schlüssel zurück.

private string Msg(string key)

Parameters

key string

Ressourcen-Schlüssel.

Returns

string

Lokalisierter Meldungstext oder der Schlüssel als Fallback.

Parse()

Parst Token in P-Code-Befehle und Diagnosen.

public CompilationResult Parse()

Returns

CompilationResult

Das Kompilierungsergebnis.

ParseAssignment(int)

Parst eine Zuweisungsanweisung.

private void ParseAssignment(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseBeginEnd(int)

Parst eine BEGIN-END-Anweisungsfolge.

private void ParseBeginEnd(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseBlock(int, SymbolEntry?)

Parst einen Block mit Deklarationen und Anweisungsrumpf.

private void ParseBlock(int level, SymbolEntry? owner)

Parameters

level int

Aktuelle lexikalische Ebene.

owner SymbolEntry

Prozedur-Symbol, das diesen Block besitzt, wenn vorhanden.

ParseCall(int)

Parst eine Prozeduraufruf-Anweisung.

private void ParseCall(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseCondition(int)

Parst einen Bedingungsausdruck.

private void ParseCondition(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseConstDeclaration(int)

Parst eine Konstantendeklaration im aktuellen Block.

private void ParseConstDeclaration(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseExpression(int)

Parst einen arithmetischen Ausdruck.

private void ParseExpression(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseFactor(int)

Parst einen Faktor innerhalb eines Terms.

private void ParseFactor(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseIf(int)

Parst eine IF-THEN-Anweisung.

private void ParseIf(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseInput(int)

Parst eine Eingabeanweisung.

private void ParseInput(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseOutput(int)

Parst eine Ausgabeanweisung.

private void ParseOutput(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseStatement(int)

Parst eine einzelne Anweisung.

private void ParseStatement(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseTerm(int)

Parst einen Term innerhalb eines Ausdrucks.

private void ParseTerm(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

ParseVarDeclaration(int, ref int)

Parst eine Variablendeklaration und weist eine Stack-Adresse zu.

private void ParseVarDeclaration(int level, ref int dataIndex)

Parameters

level int

Aktuelle lexikalische Ebene.

dataIndex int

Aktueller Datenzuweisungsindex.

ParseWhile(int)

Parst eine WHILE-DO-Schleife.

private void ParseWhile(int level)

Parameters

level int

Aktuelle lexikalische Ebene.

PatchArgument(int, int)

Patcht das Argument eines zuvor ausgegebenen Befehls.

private void PatchArgument(int index, int argument)

Parameters

index int

Befehlsindex.

argument int

Neuer Argumentwert.

Report(int, string)

Meldet eine Diagnose an der aktuellen Token-Position.

private void Report(int code, string message)

Parameters

code int

Diagnose-Code.

message string

Diagnose-Meldung.

Report(int, string, TextPosition)

Meldet eine Diagnose an einer angegebenen Position.

private void Report(int code, string message, TextPosition position)

Parameters

code int

Diagnose-Code.

message string

Diagnose-Meldung.

position TextPosition

Quellposition.

ReportUnexpectedEofOnce()

Meldet unerwartetes Dateiende einmalig pro Parse-Vorgang.

private void ReportUnexpectedEofOnce()

Synchronize(IEnumerable<TokenKind>)

Rückt Token vor bis ein Synchronisations-Token gefunden wird.

private void Synchronize(IEnumerable<TokenKind> syncTokens)

Parameters

syncTokens IEnumerable<TokenKind>

Synchronisations-Token.

TryDeclare(SymbolEntry, int, string)

Deklariert ein Symbol oder meldet Duplikat-/Überlauf-Fehler.

private void TryDeclare(SymbolEntry entry, int code, string message)

Parameters

entry SymbolEntry

Zu deklarierendes Symbol.

code int

Diagnose-Code bei Fehler.

message string

Diagnose-Meldung bei Fehler.

TryMatch(TokenKind)

Verbraucht das aktuelle Token wenn es der erwarteten Art entspricht.

private bool TryMatch(TokenKind kind)

Parameters

kind TokenKind

Erwartete Token-Art.

Returns

bool

True wenn gefunden und verbraucht.