Transpile procedure declaration heading

This commit is contained in:
Eugen Wissner 2025-05-28 00:13:04 +02:00
parent 46d89122e4
commit 24651e7c48
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
3 changed files with 66 additions and 6 deletions

View File

@ -102,9 +102,11 @@ task :backport do
target = source
.gsub(/^(var|type|const)/) { |match| match.upcase }
.gsub(/^[[:alnum:]]* ?module/) { |match| match.upcase }
.gsub(/(procedure|record| pointer to )/) { |match| match.upcase }
.gsub(/(record| pointer to )/) { |match| match.upcase }
.gsub(/proc(\(| )/, 'PROCEDURE\1')
.gsub(/([[:space:]]*)end;/, '\1END;')
.gsub(/^from ([[:alnum:]]+) import/, 'FROM \1 IMPORT')
.gsub(/ \^([[:alnum:]])/, ' POINTER TO \1')
target_path = Pathname.new('boot/stage1/source') + source_path.basename
File.write target_path, target

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;