Make procedure name after the end

This commit is contained in:
2025-05-29 14:59:56 +02:00
parent 192e7e40c8
commit 6ee7a8d2a7
5 changed files with 130 additions and 97 deletions

View File

@ -24,14 +24,14 @@ begin
end;
return Result
END TranspilerLex;
end;
(* Write a semicolon followed by a newline. *)
proc WriteSemicolon();
begin
WriteString(';');
WriteLn()
END WriteSemicolon;
end;
proc TranspileImport(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -58,7 +58,7 @@ begin
end;
WriteSemicolon();
Token := TranspilerLex(ALexer)
END TranspileImport;
end;
proc TranspileImportPart(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -71,7 +71,7 @@ begin
Token := LexerCurrent(ALexer)
end;
WriteLn()
END TranspileImportPart;
end;
proc TranspileConstant(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -90,7 +90,7 @@ begin
Token := TranspilerLex(ALexer);
WriteSemicolon()
END TranspileConstant;
end;
proc TranspileConstantPart(AContext: PTranspilerContext; ALexer: PLexer): BOOLEAN;
var
@ -111,7 +111,7 @@ begin
end
end;
return Result
END TranspileConstantPart;
end;
proc TranspileModule(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -149,15 +149,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
END TranspileModule;
Token := TranspilerLex(ALexer);
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer);
Write('.');
Token := TranspilerLex(ALexer);
WriteLn()
end;
proc TranspileTypeFields(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -180,7 +184,7 @@ begin
end;
WriteLn()
end
END TranspileTypeFields;
end;
proc TranspileRecordType(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -190,7 +194,7 @@ begin
WriteLn();
TranspileTypeFields(AContext, ALexer);
WriteString(' END')
END TranspileRecordType;
end;
proc TranspilePointerType(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -203,7 +207,7 @@ begin
Token := TranspilerLex(ALexer)
end;
TranspileTypeExpression(AContext, ALexer)
END TranspilePointerType;
end;
proc TranspileArrayType(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -227,7 +231,7 @@ begin
end;
WriteString(' OF ');
TranspileTypeExpression(AContext, ALexer)
END TranspileArrayType;
end;
proc TranspileEnumerationType(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -254,12 +258,12 @@ begin
end;
WriteLn();
WriteString(' )')
END TranspileEnumerationType;
end;
proc TranspileUnionType(AContext: PTranspilerContext; ALexer: PLexer);
var
Token: LexerToken;
END TranspileUnionType;
end;
proc TranspileProcedureType(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -281,7 +285,7 @@ begin
end
end;
Write(')')
END TranspileProcedureType;
end;
proc TranspileTypeExpression(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -307,7 +311,7 @@ begin
if Token.Kind = lexerKindIdentifier then
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start)
end
END TranspileTypeExpression;
end;
proc TranspileTypeDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -323,7 +327,7 @@ begin
TranspileTypeExpression(AContext, ALexer);
Token := TranspilerLex(ALexer);
WriteSemicolon();
END TranspileTypeDeclaration;
end;
proc TranspileTypePart(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -342,7 +346,7 @@ begin
end;
WriteLn()
end
END TranspileTypePart;
end;
proc TranspileVariableDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -358,7 +362,7 @@ begin
TranspileTypeExpression(AContext, ALexer);
Token := TranspilerLex(ALexer);
WriteSemicolon()
END TranspileVariableDeclaration;
end;
proc TranspileVariablePart(AContext: PTranspilerContext; ALexer: PLexer): BOOLEAN;
var
@ -379,16 +383,17 @@ begin
end
end;
return Result
END TranspileVariablePart;
end;
proc TranspileProcedureHeading(AContext: PTranspilerContext; ALexer: PLexer);
proc 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,8 +425,24 @@ begin
Token := TranspilerLex(ALexer)
end;
Token := TranspilerLex(ALexer);
WriteSemicolon()
END TranspileProcedureHeading;
WriteSemicolon();
return Result
end;
proc TranspileExpression(AContext: PTranspilerContext; ALexer: PLexer; TrailingToken: LexerKind);
var
Token: LexerToken;
WrittenBytes: CARDINAL;
begin
Token := TranspilerLex(ALexer);
while (Token.Kind <> TrailingToken) AND (Token.Kind <> lexerKindEnd) do
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Write(' ');
Token := TranspilerLex(ALexer)
end
end;
proc TranspileIfStatement(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -429,19 +450,14 @@ var
WrittenBytes: CARDINAL;
begin
WriteString(' IF ');
Token := TranspilerLex(ALexer);
TranspileExpression(AContext, ALexer, lexerKindThen);
while Token.Kind <> lexerKindThen do
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Write(' ');
Token := TranspilerLex(ALexer)
end;
WriteString('THEN');
WriteLn();
TranspileStatements(AContext, ALexer);
WriteString(' END');
Token := TranspilerLex(ALexer)
END TranspileIfStatement;
end;
proc TranspileWhileStatement(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -449,34 +465,20 @@ var
WrittenBytes: CARDINAL;
begin
WriteString(' WHILE ');
Token := TranspilerLex(ALexer);
TranspileExpression(AContext, ALexer, lexerKindDo);
while Token.Kind <> lexerKindDo do
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Write(' ');
Token := TranspilerLex(ALexer)
end;
WriteString('DO');
WriteLn();
TranspileStatements(AContext, ALexer);
WriteString(' END');
Token := TranspilerLex(ALexer)
END TranspileWhileStatement;
end;
proc TranspileAssignmentStatement(AContext: PTranspilerContext; ALexer: PLexer);
var
Token: LexerToken;
WrittenBytes: CARDINAL;
begin
WriteString(' := ');
Token := TranspilerLex(ALexer);
while (Token.Kind <> lexerKindSemicolon) AND (Token.Kind <> lexerKindEnd) do
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Write(' ');
Token := TranspilerLex(ALexer)
end
END TranspileAssignmentStatement;
TranspileExpression(AContext, ALexer, lexerKindSemicolon);
end;
proc TranspileCallStatement(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -490,7 +492,7 @@ begin
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer)
end
END TranspileCallStatement;
end;
proc TranspileReturnStatement(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -501,7 +503,7 @@ begin
Token := TranspilerLex(ALexer);
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer)
END TranspileReturnStatement;
end;
proc TranspileStatement(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -548,6 +550,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)
@ -556,7 +568,7 @@ begin
TranspileCallStatement(AContext, ALexer)
end
end
END TranspileStatement;
end;
proc TranspileStatements(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -573,7 +585,7 @@ begin
end;
WriteLn()
end
END TranspileStatements;
end;
proc TranspileStatementPart(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -585,7 +597,7 @@ begin
WriteLn();
TranspileStatements(AContext, ALexer)
end
END TranspileStatementPart;
end;
proc TranspileProcedureDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -593,17 +605,18 @@ var
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;
end;
proc TranspileProcedurePart(AContext: PTranspilerContext; ALexer: PLexer);
var
@ -616,7 +629,7 @@ begin
Token := LexerCurrent(ALexer);
WriteLn()
end
END TranspileProcedurePart;
end;
proc Transpile(ALexer: PLexer);
var
@ -625,6 +638,6 @@ var
Context: TranspilerContext;
begin
TranspileModule(ADR(Context), ALexer)
END Transpile;
end;
END Transpiler.
end Transpiler.