#include #include #include #include const int MAX_PROGRAM_LENGTH = 38911; // FILE* outfile; for compiler. char* input; char* token; char delims[] = " \n\r\t"; 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); } bool Opnd () { if (! strcmp (token, "true")) { next_token(); return true; } else if (! strcmp(token, "false")) { next_token(); return false; } else error("Opnd"); } bool Expr () { bool r1, r2; if (! strcmp(token,"or")) { next_token(); r1 = Expr(); r2 = Expr(); return r1 || r2; } else if (! strcmp(token,"and")){ next_token(); r1 = Expr(); r2 = Expr(); return r1 && r2; } else if (! strcmp(token,"exor")){ next_token(); r1 = Expr(); r2 = Expr(); return (r1 || r2) && (! (r1 && r2)); } else if (! strcmp(token,"not")) { next_token(); r1 = Expr(); return !r1; } else return Opnd(); } bool Start () { bool result; next_token(); result = Expr(); if (strcmp(token, "EOF")) { error("Start"); } return result; } int main(void) { int result; FILE* infile = fopen("in.truth", "r"); input = malloc(MAX_PROGRAM_LENGTH); fgets(input, MAX_PROGRAM_LENGTH, infile); result = Start(); fclose(infile); printf("Result: %s\n", result ? "true" : "false"); return 0; }