From 5eafed8deddd17392cdf6ca1a6d304b24fa1cba8 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 11 Aug 2018 21:35:20 +0200 Subject: crenshaw test: added division, multiply, reversed stack, avoid NEG --- crenshaw/main.pas | 44 ++++++++++++++++++++++++++++++++++++++------ crenshaw/test.prog | 2 +- 2 files changed, 39 insertions(+), 7 deletions(-) (limited to 'crenshaw') 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 -- cgit v1.2.3-54-g00ecf