diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-11 21:35:20 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-08-11 21:35:20 +0200 |
commit | 5eafed8deddd17392cdf6ca1a6d304b24fa1cba8 (patch) | |
tree | 7a9429f61835eb08f3b56a826d7aa159cd08c74a /crenshaw | |
parent | 05102f66690054d9c545ee258224ef0297691095 (diff) | |
download | compilertests-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.pas | 44 | ||||
-rw-r--r-- | crenshaw/test.prog | 2 |
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 |