From 24651e7c4838d9e53e1656842074f62ba2f9ae1a Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Wed, 28 May 2025 00:13:04 +0200 Subject: [PATCH] Transpile procedure declaration heading --- Rakefile | 4 ++- source/Lexer.elna | 4 +-- source/Transpiler.elna | 64 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Rakefile b/Rakefile index 1c5f77c..bbe15fb 100644 --- a/Rakefile +++ b/Rakefile @@ -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 diff --git a/source/Lexer.elna b/source/Lexer.elna index cfc1f8d..52fa345 100644 --- a/source/Lexer.elna +++ b/source/Lexer.elna @@ -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 diff --git a/source/Transpiler.elna b/source/Transpiler.elna index 186b33e..9ffd25a 100644 --- a/source/Transpiler.elna +++ b/source/Transpiler.elna @@ -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;