cleanup and add run and build commands
This commit is contained in:
parent
d5290ad483
commit
3621e6772b
11 changed files with 91 additions and 23 deletions
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
|
@ -1,5 +1,10 @@
|
|||
{
|
||||
"files.associations": {
|
||||
"string.h": "c"
|
||||
"string.h": "c",
|
||||
"bitset": "c",
|
||||
"initializer_list": "c",
|
||||
"string": "c",
|
||||
"string_view": "c",
|
||||
"assert.h": "c"
|
||||
}
|
||||
}
|
7
Makefile
7
Makefile
|
@ -14,11 +14,14 @@ $(BINARY): $(OBJ) Makefile tcc/libtcc1.a
|
|||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
run: $(BINARY)
|
||||
./$(BINARY) example.lisp example
|
||||
./$(BINARY) run example.lisp
|
||||
|
||||
run-build: $(BINARY)
|
||||
./$(BINARY) build example.lisp example
|
||||
./example
|
||||
|
||||
tcc/libtcc1.a:
|
||||
cd tcc && ./configure
|
||||
cd tcc && ./configure --cc=$(CC)
|
||||
make -C tcc
|
||||
|
||||
clean:
|
||||
|
|
8
include/binary.h
Normal file
8
include/binary.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#include <helpers.h>
|
||||
|
||||
#ifndef __BINARY_H__
|
||||
#define __BINARY_H__
|
||||
|
||||
int binary_produce(const char* code, Args args);
|
||||
|
||||
#endif
|
|
@ -1,6 +1,13 @@
|
|||
#ifndef __HELPERS_H__
|
||||
#define __HELPERS_H__
|
||||
|
||||
typedef struct Args {
|
||||
const char* input;
|
||||
const char* output;
|
||||
int build;
|
||||
} Args;
|
||||
|
||||
char* gen_ident(int indent);
|
||||
Args parse_args(int argc, char* argv[]);
|
||||
|
||||
#endif
|
|
@ -1 +1 @@
|
|||
Subproject commit ce1c05c6e6fdc00ccc381ad3ba621edcaa80469e
|
||||
Subproject commit 1de5b35258cffda13d4bcf505e83c976e448e750
|
|
@ -21,5 +21,6 @@ Token* tokenize(char* input);
|
|||
|
||||
Token* token_create(char* value, TokenType type, Token* root);
|
||||
Token* token_append(Token* root, Token* new_token);
|
||||
void tokens_print(Token* root);
|
||||
|
||||
#endif
|
29
src/binary.c
Normal file
29
src/binary.c
Normal file
|
@ -0,0 +1,29 @@
|
|||
#include <binary.h>
|
||||
#include <libtcc.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
int binary_produce(const char* code, Args args) {
|
||||
TCCState* state = tcc_new();
|
||||
tcc_set_lib_path(state, "tcc");
|
||||
if(args.build) {
|
||||
assert(tcc_set_output_type(state, TCC_OUTPUT_EXE) == 0);
|
||||
} else {
|
||||
assert(tcc_set_output_type(state, TCC_OUTPUT_MEMORY) == 0);
|
||||
}
|
||||
|
||||
assert(tcc_add_include_path(state, "std") == 0);
|
||||
assert(tcc_add_file(state, "std/std.c") == 0);
|
||||
assert(tcc_compile_string(state, code) == 0);
|
||||
|
||||
int ret = -1;
|
||||
if(args.build) {
|
||||
ret = tcc_output_file(state, args.output);
|
||||
printf("Binary produced: %s\n", args.output);
|
||||
} else {
|
||||
ret = tcc_run(state, 0, NULL);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -36,5 +36,5 @@ const char* codegen(ASTNode* node) {
|
|||
return sl_c_str(code);
|
||||
}
|
||||
|
||||
return "";
|
||||
return NULL;
|
||||
}
|
|
@ -1,10 +1,26 @@
|
|||
#include <helpers.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
char* gen_ident(int indent) {
|
||||
char* text = malloc(sizeof(char) * (indent + 1));
|
||||
memset(text, ' ', indent);
|
||||
text[indent] = '\0';
|
||||
return text;
|
||||
}
|
||||
|
||||
Args parse_args(int argc, char* argv[]) {
|
||||
assert(argc > 2);
|
||||
int build = 0;
|
||||
if(strcmp(argv[1], "build") == 0) {
|
||||
build = 1;
|
||||
assert(argc > 3 && "Build needs an input and output filename.");
|
||||
} else assert(strcmp(argv[1], "run") == 0 && "You must specify to either build or run.");
|
||||
|
||||
return (Args){
|
||||
.input = argv[2],
|
||||
.output = build ? argv[3] : NULL,
|
||||
.build = build
|
||||
};
|
||||
}
|
28
src/main.c
28
src/main.c
|
@ -1,27 +1,25 @@
|
|||
#define SL_IMPLEMENTATION
|
||||
#include <slibs/slibs.h>
|
||||
|
||||
#include <tokenizer.h>
|
||||
#include <ast.h>
|
||||
#include <codegen.h>
|
||||
#include <libtcc.h>
|
||||
#include <binary.h>
|
||||
#include <helpers.h>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
assert(argc > 2);
|
||||
Args args = parse_args(argc, argv);
|
||||
|
||||
sl_string buffer = { 0 };
|
||||
sl_read_file(argv[1], &buffer);
|
||||
sl_read_file(args.input, &buffer);
|
||||
|
||||
Token* root = tokenize(sl_c_str(buffer));
|
||||
printf("Tokens:\n");
|
||||
Token* curr = root;
|
||||
while(curr != NULL) {
|
||||
printf("%s: %s\n", TokenTypeText[curr->type], curr->value);
|
||||
curr = curr->next;
|
||||
}
|
||||
Token* tokens = tokenize(sl_c_str(buffer));
|
||||
tokens_print(tokens);
|
||||
printf("\n");
|
||||
|
||||
printf("AST:\n");
|
||||
ASTNode* program = ast_parse(&root);
|
||||
ASTNode* program = ast_parse(&tokens);
|
||||
ast_print(program, 0);
|
||||
printf("\n");
|
||||
|
||||
|
@ -29,13 +27,7 @@ int main(int argc, char* argv[]) {
|
|||
const char* code = codegen(program);
|
||||
printf("%s\n\n", code);
|
||||
|
||||
TCCState* state = tcc_new();
|
||||
tcc_set_lib_path(state, "tcc");
|
||||
assert(tcc_set_output_type(state, TCC_OUTPUT_EXE) == 0);
|
||||
assert(tcc_add_include_path(state, "std") == 0);
|
||||
assert(tcc_add_file(state, "std/std.c") == 0);
|
||||
assert(tcc_compile_string(state, code) == 0);
|
||||
assert(tcc_output_file(state, argv[2]) == 0);
|
||||
binary_produce(code, args);
|
||||
|
||||
printf("Binary produced: %s\n", argv[2]);
|
||||
return 0;
|
||||
}
|
|
@ -74,4 +74,11 @@ Token* token_append(Token* root, Token* new_token) {
|
|||
}
|
||||
current->next = new_token;
|
||||
return root;
|
||||
}
|
||||
|
||||
void tokens_print(Token* root) {
|
||||
while(root != NULL) {
|
||||
printf("%s: %s\n", TokenTypeText[root->type], root->value);
|
||||
root = root->next;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue