#include #include /* or -> and | and "OR" or and -> compare | compare "AND" and compare -> val | val "==" val val -> VAR | "(" or ")" TODO: NOT/!, XOR/!= TODO: Possible out-of-bounds reads on input */ void skipw(const char ** s) { while (**s == ' ') ++*s; } bool eval_or(const char ** s); bool eval_val(const char ** s) { skipw(s); if ((*s)[0]=='(') { ++*s; bool v1=eval_or(s); skipw(s); if ((*s)[0]==')') { ++*s; return v1; } else { printf(" Fehler, ')' erwartet %s\n",*s); return false; } } else if ((*s)[0]>='A' && (*s)[0]<='Z') { // Annahme: Alle variablennamen haben nur einen Buchstaben. char variable=(*s)[0]; printf(" TODO Hole Wert für Variable '%c' -> %s\n",variable, variable%2==1?"WAHR":"FALSCH"); ++*s; // Hier Pin einlesen, dictionary befragen etc... // Für Demo: "ungerade" buchstaben... return variable%2==1; } else { if ((*s)[0]==0) { printf(" Fehler, end-of-input\n"); } else { printf(" Fehler, unerwartetes Zeichen %c bei `%s`\n",(*s)[0], *s); } return false; } } bool eval_compare(const char ** s) { bool v1=eval_val(s); skipw(s); if ((*s)[0]=='=' && (*s)[1]=='=') { *s+=2; bool v2=eval_val(s); return v1==v2; } else { return v1; } } bool eval_and(const char ** s) { bool v1=eval_compare(s); skipw(s); if ((*s)[0]=='A' && (*s)[1]=='N' && (*s)[2]=='D') { *s+=3; bool v2=eval_and(s); return v1 && v2; } else { return v1; } } bool eval_or(const char ** s) { bool v1=eval_and(s); skipw(s); if ((*s)[0]=='O' && (*s)[1]=='R') { *s+=2; bool v2=eval_or(s); return v1 || v2; } else { return v1; } } int main() { const char* const example=" (A == B) AND (Y == X ) OR ( (D == F) AND (U==P)) "; const char* position=example; bool result=eval_or(&position); if (*position != 0) { /* wurde alles verarbeitet? dann sollten wir den end-of-string marker sehen.*/ printf(" Fehler, nicht alles verarbeitet, rest='%s'\n",position); } printf("%ld Chars verarbeitet, `%s` -> %s\n", position-example, example, result?"WAHR":"FALSCH"); return result; }