Эй, ребята, у меня проблема с моей программой, я пытаюсь читать в грамматике, помещая несколько правил для правой руки в правило для левой руки, используя мультимаппирование. Дело в том, что, скажем, правило таково:
a -> al be ze
он отображает [a, al] и игнорирует все остальное.
Оставляя ключ в покое, я хочу присвоить этому атрибуту различные атрибуты.
Интересно, вы, ребята, могли заметить ошибку, которую я не могу найти?
Я неправильно использую мультикартирование?
Спасибо.
map<string, string> rule; // global var
void righthandside(){ // get rhs of grammar rule
char c;
skipSpace();
c = getchar();
if(isalpha(c)){
checkforE = false; // rule not epsilon
while(isalnum(c)){
righths += c;
c = getchar();
}
righths += '\0';
rule.insert(pair<string, string>(LHS[lhs], righths));
righths.clear();
righthandside();
}
else if(c == '#'){
if(checkforE == true)
rule.insert(pair<string, string>(LHS[lhs], epsilon)); // rule states NT goes to epsilon
skipSpace();
c = getchar();
if(c == '#'){ //end of file
cout << "end of file \n";
}
else{ // end of rule
ungetc(c, stdin);
lhs++;
readGR();
}
}
else{
errorcode(0);
}
}
Если вы хотите один уникальный ключ с несколькими значениями, вы можете использовать std::map
с контейнером для значений, таких как:
std::map<std::string, std::vector<std::string> > rule;
Если вам нужны дубликаты ключей с одним значением, вы можете вместо этого использовать std::multimap
как это:
std::multimap<std::string, std::string> rule;
Это позволило бы rule
содержать пары [a,al]
, [a,be]
, [a,ze]
Других решений пока нет …