From 46d89122e41a1ae4d688b27abdebc66ef691ec79 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Tue, 27 May 2025 17:05:00 +0200 Subject: [PATCH] Transpile the global var section --- Rakefile | 17 ++++++++++ source/Compiler.elna | 2 +- source/Lexer.elna | 4 +-- source/Transpiler.elna | 71 +++++++++++++++++++++++++++++++++++++----- 4 files changed, 83 insertions(+), 11 deletions(-) diff --git a/Rakefile b/Rakefile index 5893232..1c5f77c 100644 --- a/Rakefile +++ b/Rakefile @@ -93,3 +93,20 @@ task :default do |t| puts [cat_arguments * ' ', exe, diff_arguments * ' '].join(' | ') Open3.pipeline(cat_arguments, exe, diff_arguments) end + +task :backport do + FileList['source/*.elna'].each do |file| + source_path = Pathname.new file + source = File.read source_path + + target = source + .gsub(/^(var|type|const)/) { |match| match.upcase } + .gsub(/^[[:alnum:]]* ?module/) { |match| match.upcase } + .gsub(/(procedure|record| pointer to )/) { |match| match.upcase } + .gsub(/([[:space:]]*)end;/, '\1END;') + .gsub(/^from ([[:alnum:]]+) import/, 'FROM \1 IMPORT') + + target_path = Pathname.new('boot/stage1/source') + source_path.basename + File.write target_path, target + end +end diff --git a/source/Compiler.elna b/source/Compiler.elna index 9fe3ffa..23e700f 100644 --- a/source/Compiler.elna +++ b/source/Compiler.elna @@ -6,7 +6,7 @@ from SYSTEM import ADR; from Lexer import Lexer, LexerDestroy, LexerInitialize; from Transpiler import Transpile; -VAR +var ALexer: Lexer; BEGIN diff --git a/source/Lexer.elna b/source/Lexer.elna index 45f2762..cfc1f8d 100644 --- a/source/Lexer.elna +++ b/source/Lexer.elna @@ -66,9 +66,9 @@ type NextState: TransitionState end; -VAR +var Classification: ARRAY[1..128] OF TransitionClass; - Transitions: ARRAY[0..MAX(TransitionState)] OF ARRAY[0..MAX(TransitionClass)] OF Transition; + Transitions: ARRAY[0..15] OF ARRAY[0..21] OF Transition; PROCEDURE InitializeClassification(); BEGIN diff --git a/source/Transpiler.elna b/source/Transpiler.elna index 3bd76e4..186b33e 100644 --- a/source/Transpiler.elna +++ b/source/Transpiler.elna @@ -140,6 +140,7 @@ BEGIN TranspileImportPart(AContext, ALexer); TranspileConstantPart(AContext, ALexer); TranspileTypePart(AContext, ALexer); + TranspileVariablePart(AContext, ALexer); Token := LexerCurrent(ALexer); WHILE Token.Kind <> lexerKindEof DO @@ -163,11 +164,11 @@ BEGIN Token := TranspilerLex(ALexer); WriteString(': '); TranspileTypeExpression(AContext, ALexer); - Token := TranspilerLex(ALexer); + Token := TranspilerLex(ALexer); - IF Token.Kind = lexerKindSemicolon THEN + IF Token.Kind = lexerKindSemicolon THEN Token := TranspilerLex(ALexer); - WriteSemicolon() + WriteSemicolon() ELSE WriteLn() END @@ -197,7 +198,25 @@ END TranspilePointerType; PROCEDURE TranspileArrayType(AContext: PTranspilerContext; ALexer: PLexer); VAR Token: LexerToken; + WrittenBytes: CARDINAL; BEGIN + WriteString('ARRAY'); + Token := TranspilerLex(ALexer); + + IF Token.Kind <> lexerKindOf THEN + Write('['); + Token := TranspilerLex(ALexer); + 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); + Write(']'); + Token := TranspilerLex(ALexer) + END; + WriteString(' OF '); + TranspileTypeExpression(AContext, ALexer) END TranspileArrayType; PROCEDURE TranspileEnumerationType(AContext: PTranspilerContext; ALexer: PLexer); @@ -216,12 +235,12 @@ BEGIN WHILE Token.Kind = lexerKindComma DO Write(','); - WriteLn(); - WriteString(' '); + WriteLn(); + WriteString(' '); Token := TranspilerLex(ALexer); WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start); - Token := TranspilerLex(ALexer) + Token := TranspilerLex(ALexer) END; WriteLn(); WriteString(' )') @@ -303,12 +322,48 @@ BEGIN Token := TranspilerLex(ALexer); WHILE Token.Kind = lexerKindIdentifier DO - TranspileTypeDeclaration(AContext, ALexer); + TranspileTypeDeclaration(AContext, ALexer); Token := TranspilerLex(ALexer) - END + END; + WriteLn() END END TranspileTypePart; +PROCEDURE TranspileVariableDeclaration(AContext: PTranspilerContext; ALexer: PLexer); +VAR + Token: LexerToken; + WrittenBytes: CARDINAL; +BEGIN + WriteString(' '); + Token := LexerCurrent(ALexer); + WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start); + + Token := TranspilerLex(ALexer); + WriteString(': '); + TranspileTypeExpression(AContext, ALexer); + Token := TranspilerLex(ALexer); + WriteSemicolon() +END TranspileVariableDeclaration; + +PROCEDURE TranspileVariablePart(AContext: PTranspilerContext; ALexer: PLexer); +VAR + Token: LexerToken; +BEGIN + Token := LexerCurrent(ALexer); + + IF Token.Kind = lexerKindVar THEN + WriteString('VAR'); + WriteLn(); + Token := TranspilerLex(ALexer); + + WHILE Token.Kind = lexerKindIdentifier DO + TranspileVariableDeclaration(AContext, ALexer); + Token := TranspilerLex(ALexer) + END; + WriteLn() + END +END TranspileVariablePart; + PROCEDURE Transpile(ALexer: PLexer); VAR Token: LexerToken;