Регулярный по сравнению с контекстно-свободными грамматиками

Вы никогда не войдете в проверку условия while(n < 2) во время выполнения предыдущей проверки условия или return n. то есть. он зацикливается на while (n > 8), когда условие истинно, или return n выполняется, когда условие не выполняется. Поэтому он никогда не выполнит вторую проверку условия while (n < 2).

Попробуйте реализовать логическое ИЛИ в одном цикле while, как показано ниже

int between_2_and_8(string prompt)
{
    int n;
    do
    {
        n = get_int("%s", prompt);
    }
    while (n < 3 || n > 8);// Loops around until n is either less than 2 or greater than 8
    return n;

}

Редактировать : Исправления, сделанные при проверке состояния

93
задан nbro 16 October 2016 в 16:56
поделиться

2 ответа

Регулярная грамматика является или правом или леволинейный, тогда как контекстно-свободная грамматика является в основном любой комбинацией терминалов и нетерминалов. Следовательно Вы видите, что регулярная грамматика является подмножеством контекстно-свободной грамматики.

Так для палиндрома, например, имеет форму,

S->ABA
A->something
B->something

можно ясно видеть, что палиндромов нельзя выразить в регулярной грамматике, так как это должно быть или право или леволинейный, и как таковой не может иметь нетерминального на обеих сторонах.

, Так как регулярные грамматики ненеоднозначны, существует только одно порождающее правило для данного нетерминального, тогда как может быть больше чем один в случае контекстно-свободной грамматики.

70
ответ дан rlandster 24 November 2019 в 06:19
поделиться

Я думаю, о чем Вы хотите думать, различные насосные аннотации. Регулярный язык может быть распознан конечным автоматом. Контекстно-свободный язык требует стека, и контекстно-зависимый язык требует двух стеков (который эквивалентен высказыванию, что он требует полной Машины Тьюринга.)

Так, если мы думаем о насосная лемма для регулярных языков , что она говорит, по существу, то, что любой регулярный язык может быть разломан на три части, x , y, и z, где все экземпляры языка находятся в xy*z (где * повторение Kleene, т.е., 0 или больше копий y.) У Вас в основном есть одно "нетерминальное", которое может быть расширено.

Теперь, что относительно контекстно-свободных языков? Существует аналогичное насосная лемма для контекстно-свободных языков , который повреждает строки на языке в пять частей, uvxyz, и где все экземпляры языка находятся в UV <глоток> я xy <глоток> я z, поскольку я ≥ 0. Теперь, Вы имеете два "нетерминалы", которые могут копироваться или качаться, , пока у Вас есть тот же номер .

55
ответ дан viebel 24 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: