#include #include #include #include const int MAX_PROGRAM_LENGTH = 38911; FILE* outfile; int next_reg = 1; char* input; char* token; char delims[] = " \n\r\t"; int next_register() { return next_reg++; } typedef enum opcode {LOADI=0, AND, OR, EXOR, NOT, OUTPUT} opcode; void emit (opcode op, int arg1, int arg2, int arg3) { switch (op) { case LOADI: fprintf(outfile, "loadI %s => r%d\n", arg1 ? "true" : "false", arg2); break; case AND: fprintf(outfile, "and r%d, r%d => r%d\n", arg1, arg2, arg3); break; case OR: fprintf(outfile, "or r%d, r%d => r%d\n", arg1, arg2, arg3); break; case EXOR: fprintf(outfile, "exor r%d, r%d => r%d\n", arg1, arg2, arg3); break; case NOT: fprintf(outfile, "not r%d => r%d\n", arg1, arg2); break; case OUTPUT: fprintf(outfile, "output r%d\n", arg1); break; default: fprintf(stderr, "Illegal opcode %d passed to \"emit\" \n", op); } } void next_token() { static int started = 0; if (! started) { token = strtok (input, delims); started = 1; } else { token = strtok (NULL, delims); } if (token == NULL) token = "EOF"; } void error(char* nt) { fprintf(stderr, "Error in %s at token '%s'\n", nt, token); exit(1); } int Opnd () { int rreg = next_register(); if (! strcmp (token, "true")) { next_token(); emit(LOADI, true, rreg, 0); return rreg; } else if (! strcmp(token, "false")) { next_token(); emit(LOADI, false, rreg, 0); return rreg; } else error("Opnd"); } int Expr () { int rreg, rreg1, rreg2; if (! strcmp(token,"or")) { next_token(); rreg1 = Expr(); rreg2 = Expr(); emit(OR, rreg1, rreg2, rreg = next_register()); return rreg; } else if (! strcmp(token,"and")){ next_token(); rreg1 = Expr(); rreg2 = Expr(); emit(AND, rreg1, rreg2, rreg = next_register()); return rreg; } else if (! strcmp(token,"exor")){ next_token(); rreg1 = Expr(); rreg2 = Expr(); emit(EXOR, rreg1, rreg2, rreg = next_register()); return rreg; } else if (! strcmp(token,"not")) { next_token(); rreg1 = Expr(); emit(NOT, rreg1, rreg = next_register(), 0); return rreg; } else Opnd(); } void Start () { int rreg; next_token(); rreg = Expr(); if (strcmp(token, "EOF")) { error("Start"); } emit(OUTPUT, rreg, 0, 0); } int main(void) { int result; FILE* infile = fopen("in.truth", "r"); input = malloc(MAX_PROGRAM_LENGTH); fgets(input, MAX_PROGRAM_LENGTH, infile); outfile = fopen("code.out", "w"); Start(); fclose(infile); fclose(outfile); return 0; }