Как написать CFG с примером ambn
L = {am bn | м >= п}.
Описание языка: am bn состоит из a
, за которым следует b
, где число из a
больше или равно числу b
.
несколько примеров строк: {^, a, aa, aab, aabb, aaaab, ab......}
Таким образом, всегда есть один a
на один b
, но возможны и дополнительные a
. строка заражения может состоять только из a
. Также обратите внимание, что ^
null является элементом языка, поскольку в ^
NumberOf(a) = NumberOf(b) = 0
Как написать грамматику, которая принимает язык, образованный строками am bn?
В грамматике должны быть такие правила, что если вы добавляете символ b
, вы также добавляете символ a
.
и это можно сделать с помощью чего-то вроде:
S --> aSb
Но это неполное, потому что нам нужно правило для генерации дополнительных a
s:
A --> aA | a
Объедините два продукционных правила в одну грамматику CFG.
S --> aSb | A
A --> aA | a
Таким образом, вы можете сгенерировать любую строку, состоящую из a
, а также a
и b
в (am b п) узор.
Но в приведенной выше грамматике нет способа сгенерировать строку ^
.
Итак, измените эту грамматику следующим образом:
S --> B | ^
B --> aBb | A
A --> aA | a
эта грамматика может генерировать {am bn | m >= n} язык.
Примечание: чтобы сгенерировать пустую строку ^
, я добавил дополнительный первый шаг в грамматике, добавив S--> B | ^
, поэтому вы можете либо добавить ^
, либо свою строку символов a
и b
. (теперь B
играет роль S
из предыдущей грамматики, чтобы создать равное количество a
и b
)
Изменить: Спасибо @Andy Hayden
Вы также можете написать эквивалентную грамматику для того же языка {am bn | м >= п}:
S --> aSb | A
A --> aA | ^
обратите внимание: здесь A --> aA | ^
может генерировать ноль или любое количество a
. И это должно быть предпочтительнее моей грамматики, поскольку она генерирует меньшее дерево синтаксического анализа для той же строки.
(меньшее по высоте предпочтительнее из-за эффективного синтаксического анализа)
Следующие советы могут быть полезны при написании грамматики формального языка:
- Вы должны четко понимать язык, что он описывает (значение/шаблон).
- Вы можете запомнить решения некоторых основных проблем (идея в том, что вы можете написать новые грамматики).
- Вы можете написать правила для основных языков, таких как я написал для RE в этом примере написать Right-Linear-Grammmar. Правила помогут вам написать Грамматика для новых языков.
- Другой подход заключается в том, чтобы сначала нарисовать автоматы, а затем преобразовать автоматы в грамматику. У нас есть предопределенные методы написания грамматики из автоматов любого класса формального языка.
- Подобно хорошему программисту, который учится, читая чужой код, точно так же можно научиться писать грамматики для формальных языков.
Кроме того, написанная вами грамматика неверна.
person
Grijesh Chauhan
schedule
28.02.2013