Make procedure name after the end

This commit is contained in:
2025-05-29 14:59:22 +02:00
parent 4adac0531f
commit c87c0501af
3 changed files with 36 additions and 62 deletions

View File

@@ -80,7 +80,8 @@ TYPE
); );
LexerToken = RECORD LexerToken = RECORD
CASE Kind: LexerKind OF CASE Kind: LexerKind OF
lexerKindBoolean: booleanKind: BOOLEAN lexerKindBoolean: booleanKind: BOOLEAN |
lexerKindIdentifier: identifierKind: ARRAY[1..256] OF CHAR
END END
END; END;
PLexerToken = POINTER TO LexerToken; PLexerToken = POINTER TO LexerToken;

View File

@@ -5,7 +5,7 @@ FROM SYSTEM IMPORT ADR;
FROM Storage IMPORT DEALLOCATE, ALLOCATE; FROM Storage IMPORT DEALLOCATE, ALLOCATE;
FROM Strings IMPORT Length; FROM Strings IMPORT Length;
FROM MemUtils IMPORT MemZero; FROM MemUtils IMPORT MemCopy, MemZero;
FROM StrCase IMPORT Lower; FROM StrCase IMPORT Lower;
CONST CONST
@@ -201,7 +201,6 @@ BEGIN
Classification[127] := transitionClassSingle; (* ~ *) Classification[127] := transitionClassSingle; (* ~ *)
Classification[128] := transitionClassInvalid (* DEL *) Classification[128] := transitionClassInvalid (* DEL *)
END InitializeClassification; END InitializeClassification;
PROCEDURE CompareKeyword(Keyword: ARRAY OF CHAR; TokenStart: PLexerBuffer; TokenEnd: PLexerBuffer): BOOLEAN; PROCEDURE CompareKeyword(Keyword: ARRAY OF CHAR; TokenStart: PLexerBuffer; TokenEnd: PLexerBuffer): BOOLEAN;
VAR VAR
Result: BOOLEAN; Result: BOOLEAN;
@@ -218,19 +217,16 @@ BEGIN
Result := (Index = Length(Keyword)) AND (TokenStart = TokenEnd) AND Result; Result := (Index = Length(Keyword)) AND (TokenStart = TokenEnd) AND Result;
RETURN Result RETURN Result
END CompareKeyword; END CompareKeyword;
(* Reached the end of file. *) (* Reached the end of file. *)
PROCEDURE TransitionActionEof(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionEof(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
AToken^.Kind := lexerKindEof AToken^.Kind := lexerKindEof
END TransitionActionEof; END TransitionActionEof;
(* Add the character to the token currently read and advance to the next character. *) (* Add the character to the token currently read and advance to the next character. *)
PROCEDURE TransitionActionAccumulate(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionAccumulate(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
INC(ALexer^.Current) INC(ALexer^.Current)
END TransitionActionAccumulate; END TransitionActionAccumulate;
(* The current character is not a part of the token. Finish the token already (* The current character is not a part of the token. Finish the token already
* read. Don't advance to the next character. *) * read. Don't advance to the next character. *)
PROCEDURE TransitionActionFinalize(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionFinalize(ALexer: PLexer; AToken: PLexerToken);
@@ -254,7 +250,6 @@ BEGIN
AToken^.Kind := lexerKindDot AToken^.Kind := lexerKindDot
END END
END TransitionActionFinalize; END TransitionActionFinalize;
(* An action for tokens containing multiple characters. *) (* An action for tokens containing multiple characters. *)
PROCEDURE TransitionActionComposite(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionComposite(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
@@ -277,14 +272,12 @@ BEGIN
END; END;
INC(ALexer^.Current) INC(ALexer^.Current)
END TransitionActionComposite; END TransitionActionComposite;
(* Skip a space. *) (* Skip a space. *)
PROCEDURE TransitionActionSkip(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionSkip(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
INC(ALexer^.Current); INC(ALexer^.Current);
INC(ALexer^.Start) INC(ALexer^.Start)
END TransitionActionSkip; END TransitionActionSkip;
(* Delimited string action. *) (* Delimited string action. *)
PROCEDURE TransitionActionDelimited(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionDelimited(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
@@ -299,12 +292,14 @@ BEGIN
END; END;
INC(ALexer^.Current) INC(ALexer^.Current)
END TransitionActionDelimited; END TransitionActionDelimited;
(* Finalize keyword or identifier. *) (* Finalize keyword or identifier. *)
PROCEDURE TransitionActionKeyId(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionKeyId(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
AToken^.Kind := lexerKindIdentifier; AToken^.Kind := lexerKindIdentifier;
AToken^.identifierKind[1] := ALexer^.Current - ALexer^.Start;
MemCopy(ALexer^.Start, ORD(AToken^.identifierKind[1]), ADR(AToken^.identifierKind[2]));
IF CompareKeyword('PROGRAM', ALexer^.Start, ALexer^.Current) THEN IF CompareKeyword('PROGRAM', ALexer^.Start, ALexer^.Current) THEN
AToken^.Kind := lexerKindProgram AToken^.Kind := lexerKindProgram
END; END;
@@ -401,7 +396,6 @@ BEGIN
AToken^.booleanKind := FALSE AToken^.booleanKind := FALSE
END END
END TransitionActionKeyId; END TransitionActionKeyId;
(* Action for tokens containing only one character. The character cannot be (* Action for tokens containing only one character. The character cannot be
* followed by other characters forming a composite token. *) * followed by other characters forming a composite token. *)
PROCEDURE TransitionActionSingle(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionSingle(ALexer: PLexer; AToken: PLexerToken);
@@ -450,13 +444,11 @@ BEGIN
END; END;
INC(ALexer^.Current) INC(ALexer^.Current)
END TransitionActionSingle; END TransitionActionSingle;
(* Handle an integer literal. *) (* Handle an integer literal. *)
PROCEDURE TransitionActionInteger(ALexer: PLexer; AToken: PLexerToken); PROCEDURE TransitionActionInteger(ALexer: PLexer; AToken: PLexerToken);
BEGIN BEGIN
AToken^.Kind := lexerKindInteger AToken^.Kind := lexerKindInteger
END TransitionActionInteger; END TransitionActionInteger;
PROCEDURE SetDefaultTransition(CurrentState: TransitionState; DefaultAction: TransitionAction; NextState: TransitionState); PROCEDURE SetDefaultTransition(CurrentState: TransitionState; DefaultAction: TransitionAction; NextState: TransitionState);
VAR VAR
DefaultTransition: Transition; DefaultTransition: Transition;
@@ -487,7 +479,6 @@ BEGIN
Transitions[ORD(CurrentState)][ORD(transitionClassLess)] := DefaultTransition; Transitions[ORD(CurrentState)][ORD(transitionClassLess)] := DefaultTransition;
Transitions[ORD(CurrentState)][ORD(transitionClassOther)] := DefaultTransition Transitions[ORD(CurrentState)][ORD(transitionClassOther)] := DefaultTransition
END SetDefaultTransition; END SetDefaultTransition;
(* (*
* The transition table describes transitions from one state to another, given * The transition table describes transitions from one state to another, given
* a symbol (character class). * a symbol (character class).
@@ -741,7 +732,6 @@ BEGIN
Transitions[ORD(transitionStateDecimalSuffix)][ORD(transitionClassX)].Action := NIL; Transitions[ORD(transitionStateDecimalSuffix)][ORD(transitionClassX)].Action := NIL;
Transitions[ORD(transitionStateDecimalSuffix)][ORD(transitionClassX)].NextState := transitionStateEnd Transitions[ORD(transitionStateDecimalSuffix)][ORD(transitionClassX)].NextState := transitionStateEnd
END InitializeTransitions; END InitializeTransitions;
PROCEDURE LexerInitialize(ALexer: PLexer; Input: File); PROCEDURE LexerInitialize(ALexer: PLexer; Input: File);
BEGIN BEGIN
ALexer^.Input := Input; ALexer^.Input := Input;
@@ -751,7 +741,6 @@ BEGIN
MemZero(ALexer^.Buffer, ChunkSize); MemZero(ALexer^.Buffer, ChunkSize);
ALexer^.Size := ChunkSize ALexer^.Size := ChunkSize
END LexerInitialize; END LexerInitialize;
PROCEDURE LexerCurrent(ALexer: PLexer): LexerToken; PROCEDURE LexerCurrent(ALexer: PLexer): LexerToken;
VAR VAR
CurrentClass: TransitionClass; CurrentClass: TransitionClass;
@@ -773,7 +762,6 @@ BEGIN
END; END;
RETURN Result RETURN Result
END LexerCurrent; END LexerCurrent;
PROCEDURE LexerLex(ALexer: PLexer): LexerToken; PROCEDURE LexerLex(ALexer: PLexer): LexerToken;
VAR VAR
Result: LexerToken; Result: LexerToken;
@@ -787,12 +775,10 @@ BEGIN
Result := LexerCurrent(ALexer); Result := LexerCurrent(ALexer);
RETURN Result RETURN Result
END LexerLex; END LexerLex;
PROCEDURE LexerDestroy(ALexer: PLexer); PROCEDURE LexerDestroy(ALexer: PLexer);
BEGIN BEGIN
DEALLOCATE(ALexer^.Buffer, ALexer^.Size) DEALLOCATE(ALexer^.Buffer, ALexer^.Size)
END LexerDestroy; END LexerDestroy;
BEGIN BEGIN
InitializeClassification(); InitializeClassification();
InitializeTransitions() InitializeTransitions()

View File

@@ -25,14 +25,12 @@ BEGIN
RETURN Result RETURN Result
END TranspilerLex; END TranspilerLex;
(* Write a semicolon followed by a newline. *) (* Write a semicolon followed by a newline. *)
PROCEDURE WriteSemicolon(); PROCEDURE WriteSemicolon();
BEGIN BEGIN
WriteString(';'); WriteString(';');
WriteLn() WriteLn()
END WriteSemicolon; END WriteSemicolon;
PROCEDURE TranspileImport(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileImport(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -59,7 +57,6 @@ BEGIN
WriteSemicolon(); WriteSemicolon();
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END TranspileImport; END TranspileImport;
PROCEDURE TranspileImportPart(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileImportPart(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -72,7 +69,6 @@ BEGIN
END; END;
WriteLn() WriteLn()
END TranspileImportPart; END TranspileImportPart;
PROCEDURE TranspileConstant(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileConstant(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -91,7 +87,6 @@ BEGIN
Token := TranspilerLex(ALexer); Token := TranspilerLex(ALexer);
WriteSemicolon() WriteSemicolon()
END TranspileConstant; END TranspileConstant;
PROCEDURE TranspileConstantPart(AContext: PTranspilerContext; ALexer: PLexer): BOOLEAN; PROCEDURE TranspileConstantPart(AContext: PTranspilerContext; ALexer: PLexer): BOOLEAN;
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -112,7 +107,6 @@ BEGIN
END; END;
RETURN Result RETURN Result
END TranspileConstantPart; END TranspileConstantPart;
PROCEDURE TranspileModule(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileModule(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -149,16 +143,19 @@ BEGIN
WriteLn() WriteLn()
END; END;
TranspileProcedurePart(AContext, ALexer); TranspileProcedurePart(AContext, ALexer);
TranspileStatementPart(AContext, ALexer);
Token := LexerCurrent(ALexer); WriteString('END ');
WHILE Token.Kind <> lexerKindEof DO
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
WriteLn();
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer);
END WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer);
Write('.');
Token := TranspilerLex(ALexer);
WriteLn()
END TranspileModule; END TranspileModule;
PROCEDURE TranspileTypeFields(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileTypeFields(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -181,7 +178,6 @@ BEGIN
WriteLn() WriteLn()
END END
END TranspileTypeFields; END TranspileTypeFields;
PROCEDURE TranspileRecordType(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileRecordType(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -191,7 +187,6 @@ BEGIN
TranspileTypeFields(AContext, ALexer); TranspileTypeFields(AContext, ALexer);
WriteString(' END') WriteString(' END')
END TranspileRecordType; END TranspileRecordType;
PROCEDURE TranspilePointerType(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspilePointerType(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -204,7 +199,6 @@ BEGIN
END; END;
TranspileTypeExpression(AContext, ALexer) TranspileTypeExpression(AContext, ALexer)
END TranspilePointerType; END TranspilePointerType;
PROCEDURE TranspileArrayType(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileArrayType(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -228,7 +222,6 @@ BEGIN
WriteString(' OF '); WriteString(' OF ');
TranspileTypeExpression(AContext, ALexer) TranspileTypeExpression(AContext, ALexer)
END TranspileArrayType; END TranspileArrayType;
PROCEDURE TranspileEnumerationType(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileEnumerationType(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -255,12 +248,10 @@ BEGIN
WriteLn(); WriteLn();
WriteString(' )') WriteString(' )')
END TranspileEnumerationType; END TranspileEnumerationType;
PROCEDURE TranspileUnionType(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileUnionType(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
END TranspileUnionType; END TranspileUnionType;
PROCEDURE TranspileProcedureType(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileProcedureType(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -282,7 +273,6 @@ BEGIN
END; END;
Write(')') Write(')')
END TranspileProcedureType; END TranspileProcedureType;
PROCEDURE TranspileTypeExpression(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileTypeExpression(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -308,7 +298,6 @@ BEGIN
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start) WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start)
END END
END TranspileTypeExpression; END TranspileTypeExpression;
PROCEDURE TranspileTypeDeclaration(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileTypeDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -324,7 +313,6 @@ BEGIN
Token := TranspilerLex(ALexer); Token := TranspilerLex(ALexer);
WriteSemicolon(); WriteSemicolon();
END TranspileTypeDeclaration; END TranspileTypeDeclaration;
PROCEDURE TranspileTypePart(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileTypePart(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -343,7 +331,6 @@ BEGIN
WriteLn() WriteLn()
END END
END TranspileTypePart; END TranspileTypePart;
PROCEDURE TranspileVariableDeclaration(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileVariableDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -359,7 +346,6 @@ BEGIN
Token := TranspilerLex(ALexer); Token := TranspilerLex(ALexer);
WriteSemicolon() WriteSemicolon()
END TranspileVariableDeclaration; END TranspileVariableDeclaration;
PROCEDURE TranspileVariablePart(AContext: PTranspilerContext; ALexer: PLexer): BOOLEAN; PROCEDURE TranspileVariablePart(AContext: PTranspilerContext; ALexer: PLexer): BOOLEAN;
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -380,15 +366,15 @@ BEGIN
END; END;
RETURN Result RETURN Result
END TranspileVariablePart; END TranspileVariablePart;
PROCEDURE TranspileProcedureHeading(AContext: PTranspilerContext; ALexer: PLexer): LexerToken;
PROCEDURE TranspileProcedureHeading(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
Result: LexerToken;
WrittenBytes: CARDINAL; WrittenBytes: CARDINAL;
BEGIN BEGIN
WriteString('PROCEDURE '); WriteString('PROCEDURE ');
Token := TranspilerLex(ALexer); Result := TranspilerLex(ALexer);
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start); WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer); Token := TranspilerLex(ALexer);
@@ -420,9 +406,10 @@ BEGIN
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END; END;
Token := TranspilerLex(ALexer); Token := TranspilerLex(ALexer);
WriteSemicolon() WriteSemicolon();
END TranspileProcedureHeading;
RETURN Result
END TranspileProcedureHeading;
PROCEDURE TranspileIfStatement(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileIfStatement(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -442,7 +429,6 @@ BEGIN
WriteString(' END'); WriteString(' END');
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END TranspileIfStatement; END TranspileIfStatement;
PROCEDURE TranspileWhileStatement(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileWhileStatement(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -462,7 +448,6 @@ BEGIN
WriteString(' END'); WriteString(' END');
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END TranspileWhileStatement; END TranspileWhileStatement;
PROCEDURE TranspileAssignmentStatement(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileAssignmentStatement(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -477,7 +462,6 @@ BEGIN
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END END
END TranspileAssignmentStatement; END TranspileAssignmentStatement;
PROCEDURE TranspileCallStatement(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileCallStatement(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -491,7 +475,6 @@ BEGIN
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END END
END TranspileCallStatement; END TranspileCallStatement;
PROCEDURE TranspileReturnStatement(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileReturnStatement(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -502,7 +485,6 @@ BEGIN
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start); WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END TranspileReturnStatement; END TranspileReturnStatement;
PROCEDURE TranspileStatement(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileStatement(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -548,6 +530,16 @@ BEGIN
Write('^'); Write('^');
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END; END;
WHILE Token.Kind = lexerKindLeftSquare DO
Write('[');
Token := TranspilerLex(ALexer);
WHILE Token.Kind <> lexerKindRightSquare DO
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer)
END;
Write(']');
Token := TranspilerLex(ALexer);
END;
IF Token.Kind = lexerKindAssignment THEN IF Token.Kind = lexerKindAssignment THEN
TranspileAssignmentStatement(AContext, ALexer) TranspileAssignmentStatement(AContext, ALexer)
@@ -557,7 +549,6 @@ BEGIN
END END
END END
END TranspileStatement; END TranspileStatement;
PROCEDURE TranspileStatements(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileStatements(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -574,7 +565,6 @@ BEGIN
WriteLn() WriteLn()
END END
END TranspileStatements; END TranspileStatements;
PROCEDURE TranspileStatementPart(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileStatementPart(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -586,25 +576,24 @@ BEGIN
TranspileStatements(AContext, ALexer) TranspileStatements(AContext, ALexer)
END END
END TranspileStatementPart; END TranspileStatementPart;
PROCEDURE TranspileProcedureDeclaration(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileProcedureDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
SeenPart: BOOLEAN; SeenPart: BOOLEAN;
WrittenBytes: CARDINAL; WrittenBytes: CARDINAL;
BEGIN BEGIN
TranspileProcedureHeading(AContext, ALexer); Token := TranspileProcedureHeading(AContext, ALexer);
SeenPart := TranspileConstantPart(AContext, ALexer); SeenPart := TranspileConstantPart(AContext, ALexer);
SeenPart := TranspileVariablePart(AContext, ALexer); SeenPart := TranspileVariablePart(AContext, ALexer);
TranspileStatementPart(AContext, ALexer); TranspileStatementPart(AContext, ALexer);
WriteString('END '); WriteString('END ');
Token := TranspilerLex(ALexer); WrittenBytes := WriteNBytes(StdOut, ORD(Token.identifierKind[1]), ADR(Token.identifierKind[2]));
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer); Token := TranspilerLex(ALexer);
WriteSemicolon(); WriteSemicolon();
Token := TranspilerLex(ALexer) Token := TranspilerLex(ALexer)
END TranspileProcedureDeclaration; END TranspileProcedureDeclaration;
PROCEDURE TranspileProcedurePart(AContext: PTranspilerContext; ALexer: PLexer); PROCEDURE TranspileProcedurePart(AContext: PTranspilerContext; ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -617,7 +606,6 @@ BEGIN
WriteLn() WriteLn()
END END
END TranspileProcedurePart; END TranspileProcedurePart;
PROCEDURE Transpile(ALexer: PLexer); PROCEDURE Transpile(ALexer: PLexer);
VAR VAR
Token: LexerToken; Token: LexerToken;
@@ -626,5 +614,4 @@ VAR
BEGIN BEGIN
TranspileModule(ADR(Context), ALexer) TranspileModule(ADR(Context), ALexer)
END Transpile; END Transpile;
END Transpiler. END Transpiler.