#include #include #include "finalize.h" #include "gen.h" #include "lexer.h" #include "parser.h" #include "sym.h" void printHeader(FILE *out) { fprintf(out, "\\documentclass[preview, margin=1cm]{standalone}\n"); fprintf(out, "\\usepackage{amsmath}\n"); fprintf(out, "\\usepackage{forest}\n"); fprintf(out, "\\usepackage{listings}\n"); fprintf(out, "\\lstdefinelanguage\n"); fprintf(out, " [ulm]{Assembler} %% add \"ulm\" dialect of Assembler\n"); fprintf(out, " [x86masm]{Assembler} %% based on \"x86masm\" dialect\n"); fprintf(out, " %% with these extra keywords:\n"); fprintf(out, " {morekeywords={halt, jmp, subq, jnz, jne, jz, je, %%\n"); fprintf(out, " ldzwq, addq, imulq, ja, jb, getc, %%\n"); fprintf(out, " divq, putc, movb, movzbq, movq, %%\n"); fprintf(out, " shldwq, ldpa, ldfp,}} %%\n"); fprintf(out, "\\definecolor{codegreen}{rgb}{0,0.6,0}\n"); fprintf(out, "\\definecolor{codegray}{rgb}{0.5,0.5,0.5}\n"); fprintf(out, "\\definecolor{codepurple}{rgb}{0.58,0,0.82}\n"); fprintf(out, "\\definecolor{backcolour}{rgb}{0.95,0.95,0.92}\n"); fprintf(out, "\\lstset{\n"); fprintf(out, " commentstyle=\\color{codegreen},\n"); fprintf(out, " keywordstyle=\\color{magenta}\\bfseries,\n"); fprintf(out, " numberstyle=\\small\\color{codegray},\n"); fprintf(out, " stringstyle=\\color{codepurple},\n"); fprintf(out, " basicstyle=\\ttfamily,\n"); fprintf(out, " breakatwhitespace=false,\n"); fprintf(out, " breaklines=true,\n"); fprintf(out, " captionpos=b,\n"); fprintf(out, " keepspaces=true,\n"); fprintf(out, " numbers=left,\n"); fprintf(out, " numbersep=5pt,\n"); fprintf(out, " showspaces=false,\n"); fprintf(out, " showstringspaces=true,\n"); fprintf(out, " showtabs=false,\n"); fprintf(out, " tabsize=2,\n"); fprintf(out, " language={[ulm]Assembler},\n"); fprintf(out, "}\n"); fprintf(out, "\\begin{document}\n"); } void printFooter(FILE *out) { fprintf(out, "\\end{document}\n"); } void usage(const char *prg) { fprintf(stderr, "usage: %s [out [log]]\n", prg); finalizeExit(1); } int main(int argc, char *argv[]) { FILE *out = stdout, *logOut = 0; if (argc > 3) { usage(argv[0]); } else if (argc >= 2) { out = fopen(argv[1], "w"); if (!out) { fprintf(stderr, "can not open output file %s\n", argv[1]); finalizeExit(1); } if (argc == 3) { logOut = fopen(argv[2], "w"); if (!logOut) { fprintf(stderr, "can not open output file %s\n", argv[2]); finalizeExit(1); } } } if (out) { setParserOut(out); } if (logOut) { setParserLog(logOut); printHeader(logOut); } genHeader(); getToken(); parse(); genFooter(); printSymtab(); if (out) { fclose(out); } if (logOut) { printFooter(logOut); fclose(logOut); } finalize(); }