вопрос заключается в построении CFG, который генерирует языкКак написать этот CFG?
мое решение: S -> aSb | aS | bS | a | b
, однако, эта грамматика может также генерировать строки, как aabb
, так как сделать это?
Спасибо за помощь.
вопрос заключается в построении CFG, который генерирует языкКак написать этот CFG?
мое решение: S -> aSb | aS | bS | a | b
, однако, эта грамматика может также генерировать строки, как aabb
, так как сделать это?
Спасибо за помощь.
Итак, вы хотите строку a
-х затем строку b
-х, с неравным числом a
х и b
годов. Во-первых, давайте проигнорируем условие равенства. Тогда:
S -> aSb | 0
будет генерировать все строки, которые начинаются с a
-х, а затем b
'с. Это правило гарантирует равное количество a
и b
или пустую строку. Теперь мы хотим либо больше a
, либо больше b
, но не оба. Потому что, если бы мы хотели еще один a
И еще один b
, мы бы снова применили S. Таким образом, мы добавим два новых правила:
A -> aA
B -> bB
и обновить S
быть:
S -> aSb | A | B
Итак, теперь мы можем добавить равное количество a
и b
, или добавить больше a
«S, или добавьте еще b
, но не оба. Это гарантирует неравенство, поэтому мы почти закончили. Если вам не нужна пустая строка, вы можете просто остановиться здесь. Для пустой строки, мы не можем сделать:
S -> aSb | A | B | 0
,
потому что это может привести к S -> aSb -> a0b -> ab
, что нарушает условия. Мы также не можем сделать:
A -> aA | 0
,
потому, что может привести к S -> aSb -> aAb -> a0b -> ab
. Так что же нам делать? Хитрость заключается в том, чтобы заставить S
«s позже расширения, чтобы иметь по крайней мере один a
или b
, как это:
S -> aSb | aA | bB
A -> aA | 0
B -> bB | 0
и это ваше решение.
'0' смотрит на смущение. Я думаю, что большинство conman sing for nul - '^'. –
Я также объяснил @: [Советы по созданию «Контекстной свободной грамматики»] (http://stackoverflow.com/questions/15126824/tips-for-creating-context-free-grammar/15130451#15130451) и некоторые из связанные ответы. –