Transpile procedure declaration heading

This commit is contained in:
Eugen Wissner 2025-05-28 00:12:33 +02:00
parent ddc5865c7d
commit 04a52d5ad7
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
2 changed files with 61 additions and 3 deletions

View File

@ -311,7 +311,7 @@ BEGIN
AToken^.Kind := lexerKindWhile
ELSIF CompareKeyword('DO', ALexer^.Start, ALexer^.Current) THEN
AToken^.Kind := lexerKindDo
ELSIF CompareKeyword('PROCEDURE', ALexer^.Start, ALexer^.Current) THEN
ELSIF CompareKeyword('PROCEDURE', ALexer^.Start, ALexer^.Current) OR CompareKeyword('proc', ALexer^.Start, ALexer^.Current) THEN
AToken^.Kind := lexerKindProc
ELSIF CompareKeyword('BEGIN', ALexer^.Start, ALexer^.Current) THEN
AToken^.Kind := lexerKindBegin

View File

@ -141,6 +141,7 @@ BEGIN
TranspileConstantPart(AContext, ALexer);
TranspileTypePart(AContext, ALexer);
TranspileVariablePart(AContext, ALexer);
TranspileProcedurePart(AContext, ALexer);
Token := LexerCurrent(ALexer);
WHILE Token.Kind <> lexerKindEof DO
@ -190,8 +191,11 @@ VAR
Token: LexerToken;
WrittenBytes: CARDINAL;
BEGIN
Token := LexerCurrent(ALexer);
WriteString('POINTER TO ');
Token := TranspilerLex(ALexer);
IF Token.Kind = lexerKindPointer THEN
Token := TranspilerLex(ALexer)
END;
TranspileTypeExpression(AContext, ALexer)
END TranspilePointerType;
@ -285,7 +289,7 @@ BEGIN
TranspileEnumerationType(AContext, ALexer)
ELSIF Token.Kind = lexerKindArray THEN
TranspileArrayType(AContext, ALexer)
ELSIF Token.Kind = lexerKindPointer THEN
ELSIF (Token.Kind = lexerKindPointer) OR (Token.Kind = lexerKindHat) THEN
TranspilePointerType(AContext, ALexer)
ELSIF Token.Kind = lexerKindProc THEN
TranspileProcedureType(AContext, ALexer)
@ -364,6 +368,60 @@ BEGIN
END
END TranspileVariablePart;
PROCEDURE TranspileProcedureDeclaration(AContext: PTranspilerContext; ALexer: PLexer);
VAR
Token: LexerToken;
WrittenBytes: CARDINAL;
BEGIN
WriteString('PROCEDURE ');
Token := TranspilerLex(ALexer);
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer);
Write('(');
Token := TranspilerLex(ALexer);
WHILE Token.Kind <> lexerKindRightParen DO
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer);
WriteString(': ');
Token := TranspilerLex(ALexer);
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer);
IF Token.Kind = lexerKindSemicolon THEN
WriteString('; ');
Token := TranspilerLex(ALexer)
END
END;
WriteString(')');
Token := TranspilerLex(ALexer);
(* Check for the return type and write it. *)
IF Token.Kind = lexerKindColon THEN
WriteString(': ');
Token := TranspilerLex(ALexer);
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
Token := TranspilerLex(ALexer)
END;
Token := TranspilerLex(ALexer);
WriteSemicolon()
END TranspileProcedureDeclaration;
PROCEDURE TranspileProcedurePart(AContext: PTranspilerContext; ALexer: PLexer);
VAR
Token: LexerToken;
BEGIN
Token := LexerCurrent(ALexer);
IF Token.Kind = lexerKindProc THEN
TranspileProcedureDeclaration(AContext, ALexer)
END
END TranspileProcedurePart;
PROCEDURE Transpile(ALexer: PLexer);
VAR
Token: LexerToken;