summaryrefslogtreecommitdiff
path: root/crenshaw
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-08-16 09:39:51 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-08-16 09:39:51 +0200
commit43f86cfdefd629426c0c3bc203ec715d47fb7a15 (patch)
treedd4a0c0c02558fd17067523475b064fc4f3dafe2 /crenshaw
parent35ad67c69732d9cc450492100dee52eab20c9748 (diff)
downloadcompilertests-43f86cfdefd629426c0c3bc203ec715d47fb7a15.tar.gz
compilertests-43f86cfdefd629426c0c3bc203ec715d47fb7a15.tar.bz2
crenshaw: dynamic section of variables
Diffstat (limited to 'crenshaw')
-rw-r--r--crenshaw/main.pas43
-rw-r--r--crenshaw/test.prog2
2 files changed, 41 insertions, 4 deletions
diff --git a/crenshaw/main.pas b/crenshaw/main.pas
index 3e9e0a4..55189a7 100644
--- a/crenshaw/main.pas
+++ b/crenshaw/main.pas
@@ -79,14 +79,39 @@ end;
procedure Expression; Forward;
+var
+ nof_names : integer;
+ names : array[0..26] of char;
+
+procedure RememberName(name : char);
+var
+ i : integer;
+ found : boolean;
+begin
+ found := false;
+ for i := 0 to nof_names do begin
+ if names[i] = name then
+ found := true;
+ end;
+ if i = 26 then Abort('Table of variable names overflowed');
+ if not found then begin
+ names[nof_names] := name;
+ inc(nof_names);
+ end;
+end;
+
procedure Factor;
+var name : char;
begin
if Look = '(' then begin
Match('(');
Expression;
Match(')');
- end
- else
+ end else if IsAlpha(Look) then begin
+ name := GetName;
+ RememberName(name);
+ EmitLn('mov eax, [' + name + ']');
+ end else
EmitLn('mov eax, ' + GetNum);
end;
@@ -126,7 +151,7 @@ begin;
Match('+');
Term;
Emitln('pop ebx');
- EmitLn('add eax, ebx');
+ EmitLn('add eax,ebx');
end;
procedure Subtract;
@@ -157,12 +182,14 @@ end;
procedure Init;
begin
+ nof_names := 0;
GetChar;
end;
procedure Prologue;
begin
WriteLn('[bits 32]');
+ WriteLn('cpu 486');
WriteLn('org 0x1000000');
{ WriteLn('section .text');
WriteLn('global main');
@@ -172,9 +199,19 @@ begin
}
end;
+procedure Variables;
+var i : integer;
+begin
+ for i := 0 to nof_names do begin
+ EmitLabel(names[i]);
+ EmitLn('dw 0');
+ end;
+end;
+
procedure Epilogue;
begin
EmitLn('hlt');
+ Variables;
{
EmitLn('leave');
EmitLn('ret');
diff --git a/crenshaw/test.prog b/crenshaw/test.prog
index c208a59..339791d 100644
--- a/crenshaw/test.prog
+++ b/crenshaw/test.prog
@@ -1 +1 @@
-(4+4)*3/2-3
+(4+4)*3/2-3+a-b