Практический подход, который во многих примерах работает (но не всегда, я знаю), пытается найти структуру вложенности строк в языке. «Вложенные зависимости» должны создаваться одновременно в разных частях строки.
Также у нас есть основной набор инструментов :
конкатенация: если вы можете разделить язык на две последовательные части, используйте эту продукциюS→ S1S2
объединение: разделены на непересекающиеся частиS→ S1∣ S2
итерация:S→ S1S| & epsi ;
Пример 1
Вот пример для вложения (спасибо Рафаэль).
L = { bКaL( б в )мaNбо∣ к , л , м , n , o ∈ N , k ≠ o , 2 l = n , m ≥ 2 }
Заменить от . Теперь мы можем бросить в условиях.2 l nN2 лN
Замените на (в замешательстве? это 'oh', а не 'ноль'). Применить инструменты для объединения. Мы работаем с здесь. Также тогда и только тогда, когда и где - новая переменная. Заменить на .k > o или k < o o k > o k > o k = s + o s > 0 s k s + oк ≠ ок > о или к < оок > ок > оk = s + oс > 0sКс + о
L1= { бс + оaL( б в )мa2 лбо∣ l , m , o , s ∈ N , s > 0 , m ≥ 2 }
Несколько простых переписывает.
L1= { b bsбоaLb c b c ( b c )м( )Lбо∣ l , m , o , s ∈ N }
Теперь мы видим структуру вложенности и начинаем строить грамматику.
T → b U U → b U ∣ εS1→ TВ , , (см .: объединение и итерация здесь)T→ б UU→ б U| & epsi ;
o bВ→ B Vб ∣ з (мы генерируем 'с обеих сторон)о б
W→ с W| X
Y → b c b c Z → b c Z ∣ εИкс→ YZ , ,Y→ B C B CZ→ b c Z| & epsi ;
Пример 2
К= { аКбLсм∣ l = m + k }
Первое «очевидное» переписывание.
К= { аКбм + ксм∣ m , k ≥ 0 } = { aКбмбКсм∣ m , k ≥ 0 }
В лингвистике это называется «перекрестной последовательной зависимостью»: чередование (обычно) строго указывает на отсутствие контекста. Конечно и мы спасены.m + k = k + mк , м , к , мм + к = к + м
К= { аКбк + мсм∣ m , k ≥ 0 } = { aКбКбмсм∣ m , k ≥ 0 }
с производствами , ,X → a X b ∣ ε Y → b Y c ∣ εS→ XYИкс→ Хб ∣ εY→ б Yc ∣ ε
Точно так жеК'= { аКбLсм∣ m = k + l } = { aКбLсLсК∣ k , l ≥ 0 }
с производствами ,X → b X c ∣ εS→ Sс ∣ хИкс→ B Xc ∣ ε
Заключительный комментарий: эти методы помогут вам создать кандидатскую контекстно-свободную грамматику, которая, будем надеяться, распознает ваш язык. До сих пор может потребоваться подтверждение правильности , чтобы гарантировать, что грамматика действительно работает для распознавания вашего языка (не более и не менее).