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

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