it-swarm.com.ru

Советы по созданию "Грамматики без контекста"

Я новичок в CFG,
Может кто-нибудь дать мне советы по созданию CFG, который генерирует какой-то язык

Например 

L = {am bn | m >= n}

Что я получил это:

So -> a | aSo | aS1 | e
S1 -> b | bS1 | e

но я думаю, что эта область неверна, потому что есть вероятность, что числоbможет быть больше, чемa.

12
user1988365

Как написать CFG с примероммбn

L = {aм бn | m> = n}. 

Описание языка: aм бn состоит из a, за которым следует b, где число a равно или больше, чем число b

некоторые примеры строк: {^, a, aa, aab, aabb, aaaab, ab......}

Таким образом, всегда есть один a для одного b, но возможны дополнительные a. строка заражения может состоять только из a. Также обратите внимание, что ^ null является членом языка, потому что в ^NumberOf(a) = NumberOf(b) = 0

Как написать грамматику, которая принимает язык, образованный строкамим бn

В грамматике должны быть такие правила, чтобы при добавлении символа b вы также добавляли символ a

и это можно сделать с помощью чего-то вроде: 

   S --> aSb 

Но это неполно, потому что нам нужно правило для генерации дополнительных as: 

   A --> aA | a

Объедините два правила производства в одну грамматику CFG. 

   S --> aSb | A
   A --> aA  | a

Таким образом, вы можете сгенерировать любую строку, состоящую из a и a и b в (aм бn) шаблон. 

Но в вышеприведенной грамматике есть no способ генерирования строки ^

Итак, измените эту грамматику следующим образом: 

   S --> B   | ^
   B --> aBb | A
   A --> aA  | a

эта грамматика может генерироватьм бn | m> = n} язык. 

Примечание: для создания нулевой строки ^ я добавил дополнительный первый шаг в грамматике, добавив S--> B | ^, так что вы можете добавить ^ или строку символов a и b. (теперь B играет роль S из предыдущей грамматики для генерации равных чисел a и b

Правка: Благодаря @ Энди Хейден
Вы также можете написать эквивалентную грамматику для того же языка {aм бn | m> = n}: 

   S --> aSb | A
   A --> aA | ^

обратите внимание: здесь A --> aA | ^ может генерировать ноль или любое число a. И это должно быть предпочтительнее моей грамматики, потому что она генерирует меньшее дерево разбора для той же строки.
(меньше по высоте предпочтительно из-за эффективного разбора

Следующие tips могут быть полезны при написании грамматики для формального языка: 

  • Вы должны четко понимать язык, который он описывает (значение/образец). 
  • Вы можете вспомнить решения для некоторых основных задач (идея заключается в том, что вы можете писать новые грамматики). 
  • Вы можете написать правила для основных языков, таких как я написал для RE в этом примере, чтобы написать Right-Linear-Grammmar . Правила помогут вам написать грамматику для новых языков. 
  • Один другой подход - сначала нарисовать automata, а затем преобразовать автоматы в грамматику. У нас есть предопределенные методы для написания грамматики из автоматов из любого класса формального языка. 
  • Как Хороший Программист, который учится, читая код других, так же можно научиться писать грамматики для формальных языков. 

Также написанная вами грамматика неверна.

44
Grijesh Chauhan

вы хотите создать грамматику для следующего языка

    L= {an bm | m>=n }

это означает, что число «b» должно быть больше или равно числу «a» или вы можете сказать, что для каждого «b» может быть не более одного «a». не наоборот.

вот грамматика для этого языка

      S-> aSb | Sb | b | ab

в этой грамматике для каждого «а» есть один «б». но b можно сгенерировать, не генерируя никаких «a». 

вы также можете попробовать эти языки:

           L1= {an bm | m > n }
           L2= {an bm | m >= 2n }
           L3= {an bm | 2m >= n }
           L4= {an bm | m != n }

я даю грамматику для каждого языка.

для L1

         S-> aSb | Sb | b

для L2

         S-> aSbb | Sb | abb

для L3

         S-> AASb | Sb | aab | ab | b

для L4

        S-> S1 | S2
        S1-> aS1b | S1b | b
        S2-> aS2b | aS2 | a
3
Anand Pandey

Наименее переменные: S -> a S b | S | е

2
Chris Chan

с меньшим количеством переменных:

S -> a S b | S | а б | е

0
SeyedAlireza SanaeeKohroudi