aboutsummaryrefslogtreecommitdiff
path: root/compiler/main.cup
blob: a0a34768522261b6f94bcdcdcc9a39afd6d35f0a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import "std/file.cup"
import "compiler/lexer.cup"
import "compiler/parser.cup"
import "compiler/codegen.cup"

fn main(argc: int, argv: char **): int {
    if (argc != 2)
        die("Usage: cupcc <input_file>");
    
    let input_file = fopen(argv[1], 'r');
    defer fclose(input_file);

    // using `fmap` here doesn't work on linux, for some reason.
    let file_size = fsize(input_file);
    let src: char* = malloc(file_size+1);
    fread(input_file, src, file_size);
    src[file_size] = '\0';
    
    let lexer = lexer_new(argv[1], src, file_size);
    let ast = parse_program(lexer);

    dump_ast(ast, 0);

    let out_file = fopen("build/host.nasm", 'w');
    defer fclose(out_file);

    generate_program(ast, out_file);

    puts("---------------------------\n");

    puts("Total amount of memory used by malloc: ");
    putu(__malloc_buf_pos);
    putsln("\nDone.");
}