Transpile procedure declaration heading

This commit is contained in:
2025-05-28 00:13:04 +02:00
parent 46d89122e4
commit 24651e7c48
3 changed files with 66 additions and 6 deletions

View File

@ -60,7 +60,7 @@ type
transitionStateDecimalSuffix,
transitionStateEnd
);
TransitionAction = procedure(PLexer, PLexerToken);
TransitionAction = proc(PLexer, PLexerToken);
Transition = record
Action: TransitionAction;
NextState: TransitionState
@ -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

@ -7,7 +7,7 @@ from Terminal import Write, WriteLn, WriteString;
from Lexer import Lexer, LexerToken, LexerCurrent, LexerLex, LexerKind;
type
PTranspilerContext = pointer to TranspilerContext;
PTranspilerContext = ^TranspilerContext;
TranspilerContext = record
Indentation: CARDINAL
end;
@ -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;