aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorMustafa Quraish <[email protected]>2022-02-07 15:29:04 -0500
committerMustafa Quraish <[email protected]>2022-02-07 15:29:04 -0500
commit941df930b0b519cf4b82f5e46ffe49ca75e68619 (patch)
treeb2da7c31710b831201d0ee9a3ee03fdfe7196f07 /compiler
parent[cup] Self-hosting is now possible! Make some tweaks to match C output (diff)
downloadcup-941df930b0b519cf4b82f5e46ffe49ca75e68619.tar.xz
cup-941df930b0b519cf4b82f5e46ffe49ca75e68619.zip
[cup] Remove unnecessary function from codegen, add info to README
Diffstat (limited to 'compiler')
-rw-r--r--compiler/README.md15
-rw-r--r--compiler/codegen.cup13
2 files changed, 16 insertions, 12 deletions
diff --git a/compiler/README.md b/compiler/README.md
index 0e58d43..54ab576 100644
--- a/compiler/README.md
+++ b/compiler/README.md
@@ -1,3 +1,16 @@
# CUP Compiler in CUP
-This is the beginnings of a CUP compiler written in itself. \ No newline at end of file
+This is an implementation of the CUP compiler in itself! As of this writing, it can generate identical assembly code to the compiler written in C.
+
+```bash
+$ make
+gcc -Wall -Wextra -Werror -ggdb3 -o build/cupcc <...>
+$ ./build/cupcc compiler/main.cup -o 1.nasm
+$ make 1.out
+nasm -felf64 1.nasm -o 1.o
+ld 1.o -o 1.out
+$ ./1.out compiler/main.cup -o 2.nasm
+$ diff 1.nasm 2.nasm
+$ # no output, same generated code, yay!
+```
+
diff --git a/compiler/codegen.cup b/compiler/codegen.cup
index c18500f..67a401c 100644
--- a/compiler/codegen.cup
+++ b/compiler/codegen.cup
@@ -29,12 +29,6 @@ fn emit_asm(msg: char*) {
fwrite(gen_out_file, msg, strlen(msg));
}
-// This is a hack because we don't support manual escaping, and
-// we need to be able to include '`' in string literal definitions.
-fn emit_asm_char(c: char) {
- fwrite(gen_out_file, &c, 1);
-}
-
fn emit_num(num: int) {
// FIXME: Just support printing negatives directly.
if (num < 0) {
@@ -486,10 +480,7 @@ fn generate_program(ast: Node*, file: File*) {
// cause invalid output and break everything. Maybe just output the
// byte values.
for (let i = 0; i < gen_string_literals.size; ++i) {
- emit_asm(" global_string_"); emit_num(i); emit_asm(": db ");
- emit_asm_char('`');
- emit_asm(gen_string_literals.data[i]);
- emit_asm_char('`');
- emit_asm(", 0\n");
+ emit_asm(" global_string_"); emit_num(i);
+ emit_asm(": db \`"); emit_asm(gen_string_literals.data[i]); emit_asm("\`, 0\n");
}
} \ No newline at end of file