From ddc5865c7d2b14fdc760211f5c9b0bcb856cf274 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Tue, 27 May 2025 17:04:15 +0200 Subject: [PATCH] Transpile the global var section --- source/Lexer.elna | 2 +- source/Transpiler.elna | 71 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/source/Lexer.elna b/source/Lexer.elna index 4de2760..28b9a52 100644 --- a/source/Lexer.elna +++ b/source/Lexer.elna @@ -68,7 +68,7 @@ TYPE 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 28dd9d1..6afe16a 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;