Ejemplo n.º 1
0
// parse ((('foo', 0.23), ('bar', 0.77)), (('a', 0.3), ('c', 0.7)))
CN parsePCN(const std::string& in)
{
  CN res;
  int c = 0;
  if (in[c++] != '(') return res; // error
  while (1) {
    if (c > (int)in.size()) {
      break;
    }
    if (get(in,c) == ')') {
      c++;
      eatws(in,c);
      break;
    }
    if (get(in,c) == ',' && get(in,c+1) == ')') {
      c+=2;
      eatws(in,c);
      break;
    }
    if (get(in,c) == ',') {
      c++;
      eatws(in,c);
    }
    res.push_back(getCNCol(in, c));
  }
  return res;
}
Ejemplo n.º 2
0
// parse (('foo', 0.23), ('bar', 0.77))
CNCol getCNCol(const std::string& in, int &c)
{
  CNCol res;
  if (get(in,c++) != '(') return res;  // error
  eatws(in,c);
  while (1) {
    if (c > (int)in.size()) {
      break;
    }
    if (get(in,c) == ')') {
      c++;
      eatws(in,c);
      break;
    }
    if (get(in,c) == ',' && get(in,c+1) == ')') {
      c+=2;
      eatws(in,c);
      break;
    }
    if (get(in,c) == ',') {
      c++;
      eatws(in,c);
    }
    res.push_back(getCNAlt(in, c));
  }
  return res;
}
Ejemplo n.º 3
0
// basically atof
int getInt(const std::string& in, int &c)
{
	std::string tmp;
	eatws(in,c);
	while (c < (int)in.size() && get(in,c) != ' ' && get(in,c) != ')' && get(in,c) != ',') {
		tmp += get(in,c++);
	}
	eatws(in,c);
	return atoi(tmp.c_str());
}
Ejemplo n.º 4
0
std::string getString(const std::string& in, int &c)
{
  std::string ret;
  eatws(in,c);
  while (c < (int)in.size() && get(in,c) != ' ' && get(in,c) != ')' && get(in,c) != ',') {
    ret += get(in,c++);
  }
  eatws(in,c);
  return ret;
}
Ejemplo n.º 5
0
// from 'foo' return foo
std::string getEscapedString(const std::string& in, int &c)
{
	eatws(in,c);
	if (get(in,c++) != quote) return "ERROR";
	std::string res;
	char cur = 0;
	do {
		cur = get(in,c++);
		if (cur == slash) { res += get(in,c++); }
		else if (cur != quote) { res += cur; }
	} while (get(in,c) != quote && (c < (int)in.size()));
	c++;
	eatws(in,c);
	return res;
}
Ejemplo n.º 6
0
static tn_array *parse_removed(char *str) 
{
    char *p, *q;
    tn_array *pkgs;

    pkgs = pkgs_array_new(64);
    p = q = eatws(str);
    while ((p = next_tokn(&q, ' ', NULL)) != NULL) {
        const char   *name = NULL, *ver = NULL, *rel = NULL;
        int32_t      epoch = 0;
        struct pkg  *pkg;

        if (*p == '\0')
            continue;
        
        if ((pkg = pndir_parse_pkgkey(p, strlen(p), NULL)) == NULL) {
            if (poldek_util_parse_nevr(p, &name, &epoch, &ver, &rel)) {
                pkg = pkg_new(name, epoch, ver, rel, NULL, NULL);
            }
        }
        
        if (pkg)
            n_array_push(pkgs, pkg);
    }
    
    if (n_array_size(pkgs) == 0) {
        n_array_free(pkgs);
        pkgs = NULL;
    }
    
    return pkgs;
}
Ejemplo n.º 7
0
// parse ('foo', 0.23)
CNAlt getCNAlt(const std::string& in, int &c)
{
  if (get(in,c++) != '(') {
    std::cerr << "PCN/PLF parse error: expected ( at start of cn alt block\n";  // throw "expected (";
    return CNAlt();
  }
  std::string word = getEscapedString(in,c);
  if (get(in,c++) != ',') {
    std::cerr << "PCN/PLF parse error: expected , after string\n";  // throw "expected , after string";
    return CNAlt();
  }
  size_t cnNext = 1;

  // read all tokens after the 1st
  std::vector<string> toks;
  toks.push_back(getString(in,c));
  while (get(in,c) == ',') {
    c++;
    string tok = getString(in,c);
    toks.push_back(tok);
  }

  std::vector<float> probs;

  // dense scores
  size_t ind;
  for (ind = 0; ind < toks.size() - 1; ++ind) {
    const string &tok = toks[ind];

    if (tok.find('=') == tok.npos) {
      float val = Moses::Scan<float>(tok);
      probs.push_back(val);
    } else {
      // beginning of sparse feature
      break;
    }
  }

  // sparse features
  std::map<string, float> sparseFeatures;
  for (; ind < toks.size() - 1; ++ind) {
    const string &tok = toks[ind];
    vector<string> keyValue = Moses::Tokenize(tok, "=");
    CHECK(keyValue.size() == 2);
    float prob = Moses::Scan<float>(keyValue[1]);
    sparseFeatures[ keyValue[0] ] = prob;
  }

  //last item is column increment
  cnNext = Moses::Scan<size_t>(toks.back());

  if (get(in,c++) != ')') {
    std::cerr << "PCN/PLF parse error: expected ) at end of cn alt block\n";  // throw "expected )";
    return CNAlt();
  }
  eatws(in,c);
  return CNAlt(word, probs, sparseFeatures, cnNext);
}
Ejemplo n.º 8
0
static int parse_avlangs(char *str, struct pkgdir *pkgdir) 
{
    char *p, *token;

    p = str;
    p = eatws(p);

    while ((token = next_tokn(&p, ':', NULL)) != NULL) {
        up_avlangs(token, pkgdir);
    }
    up_avlangs(p, pkgdir);
    return 1;
}
Ejemplo n.º 9
0
int *Parser::clause() {
  int i = 0;
  while(true) {
    eatws();
    if ((buf[i++] = oint()) == 0) {
      int *c = new int[i];
      for (int j = 0; j < i; j++)
	c[j] = buf[j];
      return c;
    }
    if (i == BUFLEN)
      error("Maximum clause length exceeded.");
  }
  return 0; // never reached
}
Ejemplo n.º 10
0
static tn_array *parse_depdirs(char *str) 
{
    char *p, *token;
    tn_array *arr;

    arr = n_array_new(16, free, (tn_fn_cmp)strcmp);
    p = str;
    p = eatws(p);

    while ((token = next_tokn(&p, ':', NULL)) != NULL) {
        n_array_push(arr, n_strdup(token));
    }
                
    n_array_push(arr, n_strdup(p));
                
    if (n_array_size(arr)) 
        n_array_sort(arr);

    return arr;
}
Ejemplo n.º 11
0
// parse ('foo', 0.23)
CNAlt getCNAlt(const std::string& in, int &c)
{
	if (get(in,c++) != '(') { std::cerr << "PCN/PLF parse error: expected ( at start of cn alt block\n"; return CNAlt(); } // throw "expected (";
	std::string word = getEscapedString(in,c);
	if (get(in,c++) != ',') { std::cerr << "PCN/PLF parse error: expected , after string\n"; return CNAlt(); } // throw "expected , after string";
	size_t cnNext = 1;
	std::vector<float> probs;
	probs.push_back(getFloat(in,c));
	while (get(in,c) == ',') {
		c++;
		float val = getFloat(in,c);
		probs.push_back(val);
	}
	//if we read more than one prob, this was a lattice, last item was column increment
	if (probs.size()>1) {
		cnNext = static_cast<size_t>(probs.back());
		probs.pop_back();
		if (cnNext < 1) { ; std::cerr << "PCN/PLF parse error: bad link length at last element of cn alt block\n"; return CNAlt(); } //throw "bad link length"
	}
	if (get(in,c++) != ')') { std::cerr << "PCN/PLF parse error: expected ) at end of cn alt block\n"; return CNAlt(); } // throw "expected )";
	eatws(in,c);
	return CNAlt(std::pair<std::string, std::vector<float> >(word,probs), cnNext);
}
Ejemplo n.º 12
0
int* Parser::parse_clause()
{
	eatws();
	return clause();
}