#include "cgen.h" #include "lex.h" #include "parse.h" #include #include #include #include int main(int argc, char *argv[]) { struct lex l = {0}; struct ast p = {0}; struct cgen c = {0}; FILE *f = stdin; int opened = 0, ret = EXIT_FAILURE; if (argc != 2) { fprintf(stderr, "%s: error: missing input file\n", *argv); goto end; } else if (strcmp(argv[1], "-")) { if (!(f = fopen(argv[1], "rb"))) { fprintf(stderr, "failed to open %s: %s\n", argv[1], strerror(errno)); goto end; } opened = 1; l.loc.f = argv[1]; } else l.loc.f = "stdin"; if (lex(&l, f) || parse(&l, &p) || cgen(&p, &c)) goto end; ret = EXIT_SUCCESS; end: if (opened && fclose(f)) { perror("fclose(3)"); ret = EXIT_FAILURE; } lex_free(&l); ast_free(&p); cgen_free(&c); return ret; }