Transpile the global var section
This commit is contained in:
parent
3d401e7dac
commit
46d89122e4
17
Rakefile
17
Rakefile
@ -93,3 +93,20 @@ task :default do |t|
|
|||||||
puts [cat_arguments * ' ', exe, diff_arguments * ' '].join(' | ')
|
puts [cat_arguments * ' ', exe, diff_arguments * ' '].join(' | ')
|
||||||
Open3.pipeline(cat_arguments, exe, diff_arguments)
|
Open3.pipeline(cat_arguments, exe, diff_arguments)
|
||||||
end
|
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
|
||||||
|
@ -6,7 +6,7 @@ from SYSTEM import ADR;
|
|||||||
from Lexer import Lexer, LexerDestroy, LexerInitialize;
|
from Lexer import Lexer, LexerDestroy, LexerInitialize;
|
||||||
from Transpiler import Transpile;
|
from Transpiler import Transpile;
|
||||||
|
|
||||||
VAR
|
var
|
||||||
ALexer: Lexer;
|
ALexer: Lexer;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -66,9 +66,9 @@ type
|
|||||||
NextState: TransitionState
|
NextState: TransitionState
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VAR
|
var
|
||||||
Classification: ARRAY[1..128] OF TransitionClass;
|
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();
|
PROCEDURE InitializeClassification();
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -140,6 +140,7 @@ BEGIN
|
|||||||
TranspileImportPart(AContext, ALexer);
|
TranspileImportPart(AContext, ALexer);
|
||||||
TranspileConstantPart(AContext, ALexer);
|
TranspileConstantPart(AContext, ALexer);
|
||||||
TranspileTypePart(AContext, ALexer);
|
TranspileTypePart(AContext, ALexer);
|
||||||
|
TranspileVariablePart(AContext, ALexer);
|
||||||
|
|
||||||
Token := LexerCurrent(ALexer);
|
Token := LexerCurrent(ALexer);
|
||||||
WHILE Token.Kind <> lexerKindEof DO
|
WHILE Token.Kind <> lexerKindEof DO
|
||||||
@ -163,11 +164,11 @@ BEGIN
|
|||||||
Token := TranspilerLex(ALexer);
|
Token := TranspilerLex(ALexer);
|
||||||
WriteString(': ');
|
WriteString(': ');
|
||||||
TranspileTypeExpression(AContext, ALexer);
|
TranspileTypeExpression(AContext, ALexer);
|
||||||
Token := TranspilerLex(ALexer);
|
Token := TranspilerLex(ALexer);
|
||||||
|
|
||||||
IF Token.Kind = lexerKindSemicolon THEN
|
IF Token.Kind = lexerKindSemicolon THEN
|
||||||
Token := TranspilerLex(ALexer);
|
Token := TranspilerLex(ALexer);
|
||||||
WriteSemicolon()
|
WriteSemicolon()
|
||||||
ELSE
|
ELSE
|
||||||
WriteLn()
|
WriteLn()
|
||||||
END
|
END
|
||||||
@ -197,7 +198,25 @@ END TranspilePointerType;
|
|||||||
PROCEDURE TranspileArrayType(AContext: PTranspilerContext; ALexer: PLexer);
|
PROCEDURE TranspileArrayType(AContext: PTranspilerContext; ALexer: PLexer);
|
||||||
VAR
|
VAR
|
||||||
Token: LexerToken;
|
Token: LexerToken;
|
||||||
|
WrittenBytes: CARDINAL;
|
||||||
BEGIN
|
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;
|
END TranspileArrayType;
|
||||||
|
|
||||||
PROCEDURE TranspileEnumerationType(AContext: PTranspilerContext; ALexer: PLexer);
|
PROCEDURE TranspileEnumerationType(AContext: PTranspilerContext; ALexer: PLexer);
|
||||||
@ -216,12 +235,12 @@ BEGIN
|
|||||||
|
|
||||||
WHILE Token.Kind = lexerKindComma DO
|
WHILE Token.Kind = lexerKindComma DO
|
||||||
Write(',');
|
Write(',');
|
||||||
WriteLn();
|
WriteLn();
|
||||||
WriteString(' ');
|
WriteString(' ');
|
||||||
Token := TranspilerLex(ALexer);
|
Token := TranspilerLex(ALexer);
|
||||||
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
|
WrittenBytes := WriteNBytes(StdOut, ADDRESS(ALexer^.Current - ALexer^.Start), ALexer^.Start);
|
||||||
|
|
||||||
Token := TranspilerLex(ALexer)
|
Token := TranspilerLex(ALexer)
|
||||||
END;
|
END;
|
||||||
WriteLn();
|
WriteLn();
|
||||||
WriteString(' )')
|
WriteString(' )')
|
||||||
@ -303,12 +322,48 @@ BEGIN
|
|||||||
Token := TranspilerLex(ALexer);
|
Token := TranspilerLex(ALexer);
|
||||||
|
|
||||||
WHILE Token.Kind = lexerKindIdentifier DO
|
WHILE Token.Kind = lexerKindIdentifier DO
|
||||||
TranspileTypeDeclaration(AContext, ALexer);
|
TranspileTypeDeclaration(AContext, ALexer);
|
||||||
Token := TranspilerLex(ALexer)
|
Token := TranspilerLex(ALexer)
|
||||||
END
|
END;
|
||||||
|
WriteLn()
|
||||||
END
|
END
|
||||||
END TranspileTypePart;
|
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);
|
PROCEDURE Transpile(ALexer: PLexer);
|
||||||
VAR
|
VAR
|
||||||
Token: LexerToken;
|
Token: LexerToken;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user