Class Pl0Parser
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
tokensIReadOnlyList<Pl0Token>Vom Lexer erzeugte Token.
optionsCompilerOptionsCompiler-Optionen.
Fields
BlockContinuationTokens
Token, die einen Block nach Deklarationen fortsetzen können.
private static readonly TokenKind[] BlockContinuationTokens
Field Value
ErrorProgramTooLong
Diagnose-Code für Programme, die die maximale Befehlsanzahl überschreiten.
private const int ErrorProgramTooLong = 35
Field Value
ErrorSymbolTableOverflow
Diagnose-Code für Symboltabellen-Überlauf.
private const int ErrorSymbolTableOverflow = 34
Field Value
ExpressionFollowTokens
Token, die einem Ausdruck folgen können.
private static readonly TokenKind[] ExpressionFollowTokens
Field Value
OprAdd
OPR-Opcode für Addition.
private const int OprAdd = 2
Field Value
OprDiv
OPR-Opcode für Division.
private const int OprDiv = 5
Field Value
OprEq
OPR-Opcode für Gleichheitsvergleich.
private const int OprEq = 8
Field Value
OprGeq
OPR-Opcode für Größer-gleich-Vergleich.
private const int OprGeq = 11
Field Value
OprGt
OPR-Opcode für Größer-als-Vergleich.
private const int OprGt = 12
Field Value
OprLeq
OPR-Opcode für Kleiner-gleich-Vergleich.
private const int OprLeq = 13
Field Value
OprLt
OPR-Opcode für Kleiner-als-Vergleich.
private const int OprLt = 10
Field Value
OprMul
OPR-Opcode für Multiplikation.
private const int OprMul = 4
Field Value
OprNegate
OPR-Opcode für unäre Negation.
private const int OprNegate = 1
Field Value
OprNeq
OPR-Opcode für Ungleichheitsvergleich.
private const int OprNeq = 9
Field Value
OprOdd
OPR-Opcode für Ungerade-Test.
private const int OprOdd = 6
Field Value
OprRead
OPR-Opcode für Eingabe-Lesen.
private const int OprRead = 14
Field Value
OprSub
OPR-Opcode für Subtraktion.
private const int OprSub = 3
Field Value
OprWrite
OPR-Opcode für Ausgabe-Schreiben.
private const int OprWrite = 15
Field Value
StatementFollowTokens
Token, die einer Anweisung folgen können.
private static readonly TokenKind[] StatementFollowTokens
Field Value
StatementStartTokens
Token, die eine Anweisung beginnen können.
private static readonly TokenKind[] StatementStartTokens
Field Value
_code
Erzeugte P-Code-Befehle.
private readonly List<Instruction> _code
Field Value
_culture
Zielsprache für Fehlertexte.
private readonly CultureInfo _culture
Field Value
_diagnostics
Compiler-Diagnosen.
private readonly List<CompilerDiagnostic> _diagnostics
Field Value
_options
Compiler-Optionen für Grenzwerte und Dialekt.
private readonly CompilerOptions _options
Field Value
_position
Aktuelle Token-Position in der Token-Liste.
private int _position
Field Value
_reportedUnexpectedEof
Verfolgt ob unerwartetes EOF bereits gemeldet wurde.
private bool _reportedUnexpectedEof
Field Value
_rm
ResourceManager für lokalisierte Fehlertexte.
private readonly ResourceManager _rm
Field Value
_symbols
Symboltabelle für den aktuellen Parse-Vorgang.
private readonly SymbolTable _symbols
Field Value
_tokens
Zu parsende Token.
private readonly IReadOnlyList<Pl0Token> _tokens
Field Value
Properties
Current
Gibt das aktuelle Token zurück.
private Pl0Token Current { get; }
Property Value
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
currentLevelintAktuelle lexikalische Ebene.
symbolSymbolEntryReferenziertes 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
opcodeOpcodeAuszugebender Opcode.
levelintLexikalisches Ebenen-Argument.
argumentintBefehlsargument.
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
kindTokenKindErwartete Token-Art.
codeintDiagnose-Code bei Nichtübereinstimmung.
messagestringDiagnose-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
kindTokenKindErwartete Token-Art.
codeintDiagnose-Code bei Nichtübereinstimmung.
messagestringDiagnose-Meldung bei Nichtübereinstimmung.
syncTokensTokenKind[]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
kindTokenKindZu 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
namestringSymbolname.
positionTextPositionPosition 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
keystringRessourcen-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
levelintAktuelle lexikalische Ebene.
ParseBeginEnd(int)
Parst eine BEGIN-END-Anweisungsfolge.
private void ParseBeginEnd(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseBlock(int, SymbolEntry?)
Parst einen Block mit Deklarationen und Anweisungsrumpf.
private void ParseBlock(int level, SymbolEntry? owner)
Parameters
levelintAktuelle lexikalische Ebene.
ownerSymbolEntryProzedur-Symbol, das diesen Block besitzt, wenn vorhanden.
ParseCall(int)
Parst eine Prozeduraufruf-Anweisung.
private void ParseCall(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseCondition(int)
Parst einen Bedingungsausdruck.
private void ParseCondition(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseConstDeclaration(int)
Parst eine Konstantendeklaration im aktuellen Block.
private void ParseConstDeclaration(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseExpression(int)
Parst einen arithmetischen Ausdruck.
private void ParseExpression(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseFactor(int)
Parst einen Faktor innerhalb eines Terms.
private void ParseFactor(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseIf(int)
Parst eine IF-THEN-Anweisung.
private void ParseIf(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseInput(int)
Parst eine Eingabeanweisung.
private void ParseInput(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseOutput(int)
Parst eine Ausgabeanweisung.
private void ParseOutput(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseStatement(int)
Parst eine einzelne Anweisung.
private void ParseStatement(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseTerm(int)
Parst einen Term innerhalb eines Ausdrucks.
private void ParseTerm(int level)
Parameters
levelintAktuelle lexikalische Ebene.
ParseVarDeclaration(int, ref int)
Parst eine Variablendeklaration und weist eine Stack-Adresse zu.
private void ParseVarDeclaration(int level, ref int dataIndex)
Parameters
ParseWhile(int)
Parst eine WHILE-DO-Schleife.
private void ParseWhile(int level)
Parameters
levelintAktuelle lexikalische Ebene.
PatchArgument(int, int)
Patcht das Argument eines zuvor ausgegebenen Befehls.
private void PatchArgument(int index, int argument)
Parameters
Report(int, string)
Meldet eine Diagnose an der aktuellen Token-Position.
private void Report(int code, string message)
Parameters
Report(int, string, TextPosition)
Meldet eine Diagnose an einer angegebenen Position.
private void Report(int code, string message, TextPosition position)
Parameters
codeintDiagnose-Code.
messagestringDiagnose-Meldung.
positionTextPositionQuellposition.
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
syncTokensIEnumerable<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
entrySymbolEntryZu deklarierendes Symbol.
codeintDiagnose-Code bei Fehler.
messagestringDiagnose-Meldung bei Fehler.
TryMatch(TokenKind)
Verbraucht das aktuelle Token wenn es der erwarteten Art entspricht.
private bool TryMatch(TokenKind kind)
Parameters
kindTokenKindErwartete Token-Art.
Returns
- bool
True wenn gefunden und verbraucht.