контекстно-свободная грамматика — реализация алгоритма CYK Переполнение стека

Я пытался реализовать алгоритм CYK, основанный на псевдокоде, заданном википедией, однако я не могу понять, что это правильно, и я не знаю, что не так с кодом. Я думаю, что мои индексы неверны, поскольку псевдокод не использует индексацию массива.

Это грамматика, которую я тестирую:
/ -> U1V1 | U2V2 | V1V1 | V2V2 | а | б
S -> U1V1 | U2V2 | V1V1 | V2V2 | а | б
V1 -> а
V2 -> б
U1 -> V1S
U2 -> V2S
Эта грамматика принимает палиндромы, поэтому «бааб» должен быть принят, однако он не принимается как часть грамматики

Вот код:

int n = (int)S.size();
std::vector<std::vector<std::vector<bool>>> P(n, std::vector<std::vector<bool>>(n, std::vector<bool>(startVariables.size(), false)));

for(int i = 0; i < n; i++)
{
for(int j = 0; j < productions.size(); j++)
{
std::vector<std::string> prods = getProductionsFromVariable(productions[j].variable);
for(int k = 0; k < prods.size(); k++)
{
if(prods[k][0] == S[i] && !isMayus(prods[k][0]) && !isnumber(prods[k][0]))
{
P[0][i][j] = true;
}
}
}
}

for(int i = 1; i < n; i++)
{
for(int j = 0; j < n-i; j++)
{
for(int k = 0; k < i; k++)
{
for(int l = 0; l < startVariables.size(); l++)
{
std::vector<std::string> prods = getProductionsFromVariable(startVariables[l]);
for(int m = 0; m < prods.size(); m++)
{
if(getNumberOfVars(prods[m]) >= 2)
{
std::vector<std::string> subProds = getNumberedVariables(prods[m]);
int A = getStartVariablePos(startVariables[l]);
int B = getStartVariablePos(subProds[0]);
int C = getStartVariablePos(subProds[1]);
if(P[k][j][B] && P[i-k][j+k][C])
P[i][j][A] = true;
}
}
}
}
}
}

bool cyk = false;
for(int i = 0; i < startVariables.size(); i++)
{
if(P[n-1][0][i])
cyk = true;
}
return cyk;

Вспомогательные функции просто возвращают все заданные произведения переменной и их индекс в векторе переменных {/, S, V1, V2, U1, U2}

Эта грамматика (в CNF) происходит от преобразованной грамматики S> aSa | bSb | aa | bb | a | b (не в CNF)

Любая помощь будет принята с благодарностью

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …