Я надеюсь, что кто-то может помочь мне понять вопрос, который у меня есть, это не домашнее задание, это просто пример вопроса, который я пытаюсь решить. Проблема состоит в том, чтобы определить грамматику, которая генерирует все суммы любого числа операндов. Например, 54 + 3 + 78 + 2 + 5... и т. д. Самый простой способ определить проблему:
non-terminal {S,B}
terminal {0..9,+,epsilon}
Rules:
S -> [0..9]S
S -> + B
B -> [0..9]B
B -> + S
S -> epsilon
B -> epsilon
epsilon is an empty string.
Мне кажется, это должно быть правильно, поскольку вы можете рекурсивно определить первое число с помощью первого правила, затем, чтобы добавить следующее целое число, вы можете использовать второе правило, а затем определить второе целое число, используя третье правило. Затем вы можете использовать четвертое правило, чтобы вернуться к S и определить столько целых чисел, сколько вам нужно.
Это решение кажется мне обычной грамматикой, поскольку оно подчиняется правилу A -> aB или A -> a, но в примечаниях к этому вопросу говорится, что невозможно определить эту проблему, используя обычную грамматику. Может ли кто-нибудь объяснить мне, почему моя попытка неверна и почему это должно быть контекстно-свободным?
Спасибо.
+
. Если первыйB
пуст, то1+
является допустимым предложением, что, я думаю, вы не имеете в виду. - person paulotorrens   schedule 27.12.2014