ВУЗ:
Составители:
55
ifstream fi(fname);
N.clear();
T.clear();
P.clear();
// ввод нетерминалов
fi >> n;
for (i = 0; i < n; i++){
fi >> c;
N.insert(c);
}
// ввод терминалов
fi >> n;
for (i = 0; i < n; i++){
fi >> c;
T.insert(c);
}
// ввод правил
fi >> n;
for (i = 0; i < n; i++){
fi >> r.first >> r.second;
P.insert(r);
}
// начальный символ
fi >> S;
}
string Grammar::AsString(){
string res = "";
charset::iterator i;
res += "Nonterminals (";
res += IntToStr(N.size()).c_str();
res += ") : ";
for (i = N.begin(); i != N.end(); i++){
res += *i;
res += " ";
}
res += "\nTerminals (";
res += IntToStr(T.size()).c_str();
res += ") : ";
for (i = T.begin(); i != T.end(); i++){
res += *i;
res += " ";
}
res += "\nRules (";
res += IntToStr(P.size()).c_str();
res += ")\n";
for (rulemap::iterator j = P.begin(); j != P.end();
j++){
res += "\t";
res += j->first;
res += " -> " + j->second + "\n";
}
res += "Starting symbol: ";
res += S;
res += "\n";
return res;
}
void Grammar::OutGrammar(char *fname){
ofstream fo(fname);
charset::iterator i;
fo << N.size() << "\n";
for (i = N.begin(); i != N.end(); i++)
fo << *i;
fo << "\n" << T.size() << "\n";
for (i = T.begin(); i != T.end(); i++)
fo << *i;
fo << "\n" << P.size() << "\n";
for (rulemap::iterator j = P.begin(); j != P.end();
j++)
fo << j->first << " " << j->second << "\n";
fo << "\n" << S;
}
void FAutomat::SetGrammar(Grammar *NG){
G = NG;
}
void FAutomat::CreateAutomat(){
rulemap::iterator i, j;
rule r;
char c, t;
int k;
// поиск незанятого символа
for(c = 'A'; G->N.count(c); c++);
// поиск правил вида A -> a без A -> aB
for(i = G->P.begin(); i != G->P.end(); i++)
if (i->second.length() == 1 && G->T.count(i-
>second[0])){
for(j = G->P.lower_bound(i->first), k = G-
>P.count(i->first); k; j++, k--)
if (j->second.length() == 2 && j-
>second[0] == i->second[0] && G->N.count(j-
>second[1]))
break;
if (!k){
// добавление правила вида A -> aC
r.first = i->first;
r.second = i->second + c;
G->P.insert(r);
G->N.insert(c);
}
}
// начальный символ
H = G->S;
// состояния
Q = G->N;
Лист
18
res += S;
res += "\n";
ifstream fi(fname); return res;
N.clear(); }
T.clear();
P.clear(); void Grammar::OutGrammar(char *fname){
// ввод нетерминалов ofstream fo(fname);
fi >> n; charset::iterator i;
for (i = 0; i < n; i++){ fo << N.size() << "\n";
fi >> c; for (i = N.begin(); i != N.end(); i++)
N.insert(c); fo << *i;
} fo << "\n" << T.size() << "\n";
// ввод терминалов for (i = T.begin(); i != T.end(); i++)
fi >> n; fo << *i;
for (i = 0; i < n; i++){ fo << "\n" << P.size() << "\n";
fi >> c; for (rulemap::iterator j = P.begin(); j != P.end();
T.insert(c); j++)
} fo << j->first << " " << j->second << "\n";
// ввод правил fo << "\n" << S;
fi >> n; }
for (i = 0; i < n; i++){
fi >> r.first >> r.second; void FAutomat::SetGrammar(Grammar *NG){
P.insert(r); G = NG;
} }
// начальный символ
fi >> S; void FAutomat::CreateAutomat(){
} rulemap::iterator i, j;
rule r;
string Grammar::AsString(){ char c, t;
string res = ""; int k;
charset::iterator i; // поиск незанятого символа
res += "Nonterminals ("; for(c = 'A'; G->N.count(c); c++);
res += IntToStr(N.size()).c_str(); // поиск правил вида A -> a без A -> aB
res += ") : "; for(i = G->P.begin(); i != G->P.end(); i++)
for (i = N.begin(); i != N.end(); i++){ if (i->second.length() == 1 && G->T.count(i-
res += *i; >second[0])){
res += " "; for(j = G->P.lower_bound(i->first), k = G-
} >P.count(i->first); k; j++, k--)
res += "\nTerminals ("; if (j->second.length() == 2 && j-
res += IntToStr(T.size()).c_str(); >second[0] == i->second[0] && G->N.count(j-
res += ") : "; >second[1]))
for (i = T.begin(); i != T.end(); i++){ break;
res += *i; if (!k){
res += " "; // добавление правила вида A -> aC
} r.first = i->first;
res += "\nRules ("; r.second = i->second + c;
res += IntToStr(P.size()).c_str(); G->P.insert(r);
res += ")\n"; G->N.insert(c);
for (rulemap::iterator j = P.begin(); j != P.end(); }
j++){ }
res += "\t"; // начальный символ
res += j->first; H = G->S;
res += " -> " + j->second + "\n"; // состояния
} Q = G->N;
res += "Starting symbol: ";
Лист
18
55
