added ops for C codegen

This commit is contained in:
2024-08-09 11:41:14 +03:00
parent 1056b74b11
commit b574944656
3 changed files with 99 additions and 40 deletions

View File

@@ -188,35 +188,11 @@
(defmethod write-program ((target (eql :c)) program out &key (mem-cap 640000))
(declare (ignore mem-cap))
(format out
"#include <stdio.h>
struct Stack {
int content[100];
int i;
};
typedef struct Stack Stack;
void push(Stack* stack, int val){
stack->content[stack->i] = val;
stack->i += 1;
}
int pop(Stack* stack){
stack->i -= 1;
return stack->content[stack->i];
}
Stack stack;
int rax, rbx;
int main(void){
stack.i = 0;
")
(iter (for op in-sequence program)
(write-op target out (car op) (cdr op)))
(format out " return 0;~%}~%"))
(gen-c-stack out)
(with-c-fn (:int main) () out
(iter (for op in-sequence program)
(write-op target out (car op) (cdr op)))
(format out "~% return 0;~%")))
(defun generate-program (program
&key (path "output.asm") (compile nil)
@@ -238,7 +214,9 @@ int main(void){
:output t :silence silence)))
(defmethod compile-program ((target (eql :c)) path silence)
(run `("gcc" ,path) :output t :silence silence))
(let ((name (first (uiop:split-string path :separator '(#\.)))))
(run `("gcc" ,path "-o" ,name)
:output t :silence silence)))