#include #include "io/file.h" #include "cli/args.h" #include "diag/diag.h" #include "sema/sema.h" #include "lexer/lexer.h" #include "codegen/nasm.h" #include "parser/parser.h" int main(int argc, char** argv) { struct Args args; enum ParseResult result = parse_args(argc, argv, &args); if (result == PARSE_EXIT) return 0; if (result == PARSE_ERROR) return 1; if (args.target != ASSEMBLER_NASM) { report_error_message("only the nasm target is supported"); return 1; } struct File source; if (!read_file(args.input_path, &source)) return 1; struct Lexer lexer = create_lexer(source.data); lexer.name = args.input_path; struct Program program; if (!parse_program(&lexer, &program)) { free_program(&program); free_file(&source); return 1; } struct Source diagnostics = { args.input_path, source.data }; if (!analyze_program(diagnostics, &program)) { free_program(&program); free_file(&source); return 1; } FILE* out = stdout; if (args.output_path != NULL) { out = fopen(args.output_path, "w"); if (out == NULL) { char message[256]; snprintf(message, sizeof(message), "could not open '%s' for writing", args.output_path); report_error_message(message); free_program(&program); free_file(&source); return 1; } } generate_nasm(&program, out); if (out != stdout) fclose(out); free_program(&program); free_file(&source); }