#include #include "file.h" #include "args.h" #include "diag.h" #include "sema.h" #include "lexer.h" #include "parser.h" #include "codegen.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_MASM) { report_error_message("the masm target is not implemented yet"); 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; } } if (args.target == ASSEMBLER_FASM) generate_fasm(&program, out); else generate_nasm(&program, out); if (out != stdout) fclose(out); free_program(&program); free_file(&source); }