// 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; }
// 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; }
// 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()); }
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; }
// 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; }
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; }
// 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); }
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; }
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 }
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; }
// 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); }
int* Parser::parse_clause() { eatws(); return clause(); }