summaryrefslogtreecommitdiff
path: root/crenshaw
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-08-11 21:35:20 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-08-11 21:35:20 +0200
commit5eafed8deddd17392cdf6ca1a6d304b24fa1cba8 (patch)
tree7a9429f61835eb08f3b56a826d7aa159cd08c74a /crenshaw
parent05102f66690054d9c545ee258224ef0297691095 (diff)
downloadcompilertests-5eafed8deddd17392cdf6ca1a6d304b24fa1cba8.tar.gz
compilertests-5eafed8deddd17392cdf6ca1a6d304b24fa1cba8.tar.bz2
crenshaw test: added division, multiply, reversed stack, avoid NEG
Diffstat (limited to 'crenshaw')
-rw-r--r--crenshaw/main.pas44
-rw-r--r--crenshaw/test.prog2
2 files changed, 39 insertions, 7 deletions
diff --git a/crenshaw/main.pas b/crenshaw/main.pas
index 677c496..12fec6e 100644
--- a/crenshaw/main.pas
+++ b/crenshaw/main.pas
@@ -72,18 +72,51 @@ begin;
WriteLn(s+':');
end;
-procedure Term;
+procedure Factor;
begin
EmitLn('mov eax, ' + GetNum);
EmitLn('push eax');
end;
+procedure Multiply;
+begin
+ Match('*');
+ Factor;
+ EmitLn('pop ebx');
+ EmitLn('pop eax');
+ EmitLn('mul ebx');
+ EmitLn('push eax');
+end;
+
+procedure Divide;
+begin
+ Match('/');
+ Factor;
+ EmitLn('pop ebx');
+ EmitLn('pop eax');
+ EmitLn('div ebx');
+ EmitLn('push eax');
+end;
+
+procedure Term;
+begin
+ Factor;
+ while Look in ['*', '/'] do
+ begin
+ case Look of
+ '*': Multiply;
+ '/': Divide;
+ else Expected('* or /');
+ end;
+ end;
+end;
+
procedure Add;
begin;
Match('+');
Term;
- Emitln('pop eax');
- EmitLn('pop ebx');
+ Emitln('pop ebx');
+ EmitLn('pop eax');
EmitLn('add eax, ebx');
EmitLn('push eax');
end;
@@ -92,10 +125,9 @@ procedure Subtract;
begin;
Match('-');
Term;
- EmitLn('pop eax');
EmitLn('pop ebx');
+ EmitLn('pop eax');
EmitLn('sub eax, ebx');
- EmitLn('neg eax');
EmitLn('push eax');
end;
@@ -107,7 +139,7 @@ begin
case Look of
'+': Add;
'-': Subtract;
- else Expected('+/-');
+ else Expected('+ or -');
end;
end;
end;
diff --git a/crenshaw/test.prog b/crenshaw/test.prog
index a490d4b..95b87fe 100644
--- a/crenshaw/test.prog
+++ b/crenshaw/test.prog
@@ -1,2 +1,2 @@
-4+2+5-8
+4+4*3/2-3