KFormula* KFormula::parseKFormula(const char* str) { if (!str || !*str) return NULL; KFormula* ret = parseEQU(str); while(isspace(*str)) ++str; if (*str) { std::cerr << "ERROR: \""<< *str << "\"" << std::endl;} assert(! *str); return ret; }
KFormula* KFormula::parseEQU(const char*& str) { KFormula* left = parseIMP(str); while(isspace(*str)) ++str; if(strncmp(str,"<=>",3) == 0) { // This is an equivalence str += 3; KFormula* right = parseEQU(str); return new KFormula(KFormula::EQU,left,right); } else { return left; // This is not an equivalence } }
KFormula* KFormula::parseRest(const char*& str) { while(isspace(*str)) ++str; KFormula *left; if(*str == '('){ ++str; left = parseEQU(str); while(isspace(*str)) ++str; assert(*str == ')'); ++str; return left; } else if (strncmp(str,"<", 1) == 0 && (isalnum(*(str + 1)) || *(str+1) == '-')) { size_t n = 1;// "<" if (*(str+1) == '-') ++n; while(isalnum(*(str+n))) ++n; std::string roleString(str+1, n - 1); ++n;// ">" str += n; left = parseRest(str); left = new KFormula(KFormula::DIA,left,NULL); left->setprop(roleString); return left; } else if (strncmp(str,"<>", 2) == 0) { str += 2; left = parseRest(str); left = new KFormula(KFormula::DIA,left,NULL); return left; } else if (strncmp(str,"[", 1) == 0 && (isalnum(*(str + 1)) || *(str+1) == '-')) { size_t n = 1;// "[" if (*(str+1) == '-') ++n; while(isalnum(*(str+n))) ++n; std::string roleString(str+1, n - 1); ++n;// "]" str += n; left = parseRest(str); left = new KFormula(KFormula::BOX,left,NULL); left->setprop(roleString); return left; }else if (strncmp(str,"[]",2) == 0) { str += 2; left = parseRest(str); left = new KFormula(KFormula::BOX,left,NULL); return left; } else if (*str=='~') { ++str; left = parseRest(str); left = new KFormula(KFormula::NOT,left,NULL); return left; } else if (strncmp(str,"True",4)==0) { str += 4; return new KFormula(true); } else if (strncmp(str,"False",5)==0) { str += 5; return new KFormula(false); } else if (isalpha(*str) || *str == '_') { size_t n = 1; while(isalnum(*(str+n)) || *(str+n) == '_') ++n; left = new KFormula(std::string(str,n)); str += n; return left; } assert(false && "Could not parse input"); // Must not reach here }