summaryrefslogtreecommitdiff
path: root/crenshaw
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2018-08-11 16:10:03 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2018-08-11 16:10:03 +0200
commit0300971e3bb7efa727c35ef54203a8ffe00eba9a (patch)
treed7633f8fae3b279209651f25dd00ab310a26b635 /crenshaw
parent3f7d123bbcc1611b37e5e3ea5777177ed0ef0aa8 (diff)
downloadcompilertests-0300971e3bb7efa727c35ef54203a8ffe00eba9a.tar.gz
compilertests-0300971e3bb7efa727c35ef54203a8ffe00eba9a.tar.bz2
a first tutorial2 expression output
Diffstat (limited to 'crenshaw')
-rw-r--r--crenshaw/README4
-rw-r--r--crenshaw/main.pas51
-rw-r--r--crenshaw/test.prog2
3 files changed, 56 insertions, 1 deletions
diff --git a/crenshaw/README b/crenshaw/README
new file mode 100644
index 0000000..1047944
--- /dev/null
+++ b/crenshaw/README
@@ -0,0 +1,4 @@
+fpc main.pas
+./main < test.prog > test.asm
+nasm test.asm -f bin -o test.bin
+ndisasm -b32 test.bin
diff --git a/crenshaw/main.pas b/crenshaw/main.pas
index 3adc53b..a5f42ae 100644
--- a/crenshaw/main.pas
+++ b/crenshaw/main.pas
@@ -63,9 +63,58 @@ end;
procedure EmitLn(s : string);
begin
- WriteLn;
Emit(s);
+ WriteLn;
+end;
+
+
+procedure Term;
+begin
+ EmitLn('mov eax, ' + GetNum);
+end;
+
+procedure Add;
+begin;
+ Match('+');
+ Term;
+ EmitLn('add eax, ebx');
+end;
+
+procedure Subtract;
+begin;
+ Match('-');
+ Term;
+ EmitLn('sub eax, ebx');
+end;
+
+procedure Expression;
+begin
+ Term;
+ EmitLn('mov ebx, eax');
+ case Look of
+ '+': Add;
+ '-': Subtract;
+ else Expected('+/-');
+ end;
+end;
+
+procedure Init;
+begin
+ GetChar;
+end;
+
+procedure Prologue;
+begin
+ EmitLn('[bits 32]');
+end;
+
+procedure Epilogue;
+begin
end;
begin
+ Prologue;
+ Init;
+ Expression;
+ Epilogue;
end.
diff --git a/crenshaw/test.prog b/crenshaw/test.prog
new file mode 100644
index 0000000..d6c68c4
--- /dev/null
+++ b/crenshaw/test.prog
@@ -0,0 +1,2 @@
+4+2
+