Тема 10: Нормальные формы контекстно-свободных грамматик Рассматривается что каждая контекстно-свободная грамматика эквивалентна некоторой контекстно-свободной грамматике специального вида, а именно грамматике в нормальной форме Хомского или в нормальной форме Грейбаха. Для получения нормальной формы Хомского нужны несколько предварительных преобразований, имеющих и самостоятельное значение. 1. Удалить бесполезные символы, т.е. нетерминалы или терминалы, которые не встречаются в порождениях терминальных цепочек из стартового символа. 2. Удалить ε-продукции, т.е. продукции вида A для некоторого нетерминала A. 3. Удалить цепные продукции вида A B с нетерминалами A и B. Устранение бесполезных символов Определение: Символ X называется полезным в грамматике G = (VT, VN, * * P, S), если существует некоторое порождение вида S X w, где wVT*, , (VNVТ)*, X может быть как нетерминалом, так и терминалом. Если символ X не является полезным, то называется бесполезным. Очевидно, что исключение бесполезных символов из грамматики не изменяет порождаемого языка, поэтому все бесполезные символы можно обнаружить и удалить. Определение: Символ XVN называется порождающим, если существует * такое слово wVТ*, так чтобы X w. Заметим, что каждый терминал является порождающим, поскольку w может быть этим терминалом, порождаемым за 0 шагов. Если символ X не является порождающим, то называется непорождающим. Определение: Символ XVN называется достижимым, если существует * порождение S X, для некоторых и β, где , β(VNVТ)*. Если символ недостижимым. X не является достижимым, то он называется Полезный достижимым. символ Если является сначала одновременно удалить из и порождающим, грамматики и непорождающие символы (также каждое правило, содержащее хотя бы один такой символ), а затем недостижимые (и правила, их содержащие), то останутся только полезные. Теорема: Для любой КС-грамматики можно построить эквивалентную G' грамматику без непорождающих символов. Алгоритм создания грамматики G'=(VN', VT', S, P'). Шаг 1. i=0, V0={A / AVN, A->, VT*} Шаг 2. i=i+1, Vi=Vi-1{X / XVN, X, VTVi-1 Шаг 3. Vi Vi-1 то переходим к шагу 2. Шаг 4. Если Vi=Vi−1 VT'=VT, VN'=VNVi. В P' включаем все правила из P, которые содержат только нетерминальные символы из VN'. Теорема: Для любой КС-грамматики G можно построить новую, эквивалентную ей КС-грамматику G' без недостижимых символов. Алгоритм создания грамматики G'=(VN', VT', S, P'). Шаг 1. i=0, V0={S} создаём множество из одного символа – аксиомы. Шаг 2. i=i+1, Vi=Vi−1{X/ A→X} — правило, и АVi−1. Шаг 3. Если Vi≠Vi−1 то переходим к шагу 2. Шаг 4. Если Vi=Vi−1 VN'=VNVi, VT'=VTVi, P' содержит все правила из P, которые содержат только терминалы и элементы из Vi.