예제 #1
0
파일: KFormula.cpp 프로젝트: tpagram/sddtab
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;
}
예제 #2
0
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
  }
}
예제 #3
0
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

}