
- •Обзорная лекция по курсу «языки программирования и методы трансляции»
- •Основная литература
- •1 Описание языка программирования
- •2 Введение в трансляцию
- •3 Способы описания языка
- •4 Формальные языки и грамматики. Основные термины и определения
- •5 Порождающие грамматики (Грамматики н.Хомского1)
- •6 Классификация формальных грамматик
- •7 Автоматные грамматики и конечные автоматы
- •7.1. Механизмы распознавания и преобразования
- •7.2 Конечные автоматы
- •7.3 Способы задания конечных автоматов
- •Контекстно-свободные грамматики и языки
- •Проверка существования языка
- •Удаление бесполезных символов грамматики
- •Эквивалентные преобразования кс-грамматик
- •9.1 Устранение цепных правил
- •Удаление произвольного правила
- •9.3 Левая факторизация правил
- •9.4 Преобразование к нормальной форме Хомского
- •Распознающий автомат для кс- языков (автомат с магазинной памятью)
- •Разнозновидности мп-автоматов
- •11 Методы синтаксического анализа
- •Нисходящий разбор
- •Восходящий разбор
- •12 Генерация внутреннего представления программ
- •12.1 Польская запись
- •2 Алгоритм перевода на промежуточный язык
- •2.1 Полиз как промежуточный язык
Удаление бесполезных символов грамматики
При разработке грамматики языка могут возникнуть следующие ошибки:
В грамматике имеются нетерминальные символы, которые не участвуют в выводе терминальных цепочек
В грамматике существуют символы, недоступные из начального символа грамматики
Бесполезные символы это
W={X | X , (S*X*x, , x, T*).
Их можно разделить на три группы:
нетерминалы, не порождающие терминальных строк
{X | X N, (X*x), x T*}
недостижимые нетерминалы, порождающие терминальные строки
{X | X N, (S*X), (X*x), , , xT).
недостижимые терминалы
{X | X T, (S*X), , ).
Нетерминалы (достижимые и недостижимые), не порождающие терминальных строк, можно вычислить и удались, используя в качестве основы алгоритм проверки существования языка.
Алгоритм устранения нетерминалов, не порождающих терминальных строк, состоит в следующем:
Вход: КС-грамматика G=(VN, T, P, S) без -правил.
Выход: Эквивалентная КС-грамматика G’=(VN, T, P’, S) у которой L(G)=L(G’) и для всех Z N существуют выводы Z*x, где xT*.
Положить N0=
Вычислить N1= N0 {A | (A) P и (N0 T)*}
Если N1 N0 , то положить N0= N1 и перейти к п.2; иначе положить N= N1
Вычислить VN’ = VN N, NБ= VN – V’N, P’=P-PБ , где PБ P – это множество правил, содержащих бесполезные нетерминалы X NБ, т.е.
PБ = {(X) P , (AX) P для всех X NБ, где А V’N , , *}
Пример: Рассмотренный алгоритм преобразует грамматику G=(VN, T, P, S) = ({a, b, d}, {Q, A, B, C}, P, Q) c правилами:
Q ab
Q AC
A AB
B b
C db
Шаг алгоритма |
Действия и результаты |
1 |
N0= |
2 |
N1 = { Q, B, C } |
3 |
N1 = N0 ? Нет N0 = N1={ Q, B, C } |
4 |
N1 = { Q, B, C } |
5 |
N1 = N0 ? Да N ={ Q, B, C } |
6 |
V’N= { Q, B, C } NБ = {A} P’= {Q ab, B b, C db} |
Алгоритм устранения недостижимых символов.
Недостижимые терминалы (группа “в” бесполезных символов) и недостижимые нетерминалы, порождающие терминальные строки (группа “б” бесполезных символов), исключаются из грамматики с помощью алгоритма устранения недостижимых символов.
Вход: КС-грамматика G=(VN, T, P, S)
Выход: Эквивалентная КС-грамматика G’=(N’, T’, P’, S) у которой L(G)=L(G’) и для всех Z ’ существуют выводы S*Z, где , (’)*.
Здесь, как и в предыдущей задаче, сначала решается обратная задача, т.е. определяется множество W достижимых символов Z:
W={Z | Z , S*Z, где , (’)*}.
Положить W0=S
Вычислить W1= W0 {X | X , (AX) P, A W0 , , (’)*}
Если W1W0 , то положить W0= W1 и перейти к п.2; иначе положить W= W1
Вычислить N’=NW, T’==TW, Б=-W, P’=P-PБ, где PБP – это множество правил, содержащих недостижимые символы X Б, т.е. PБ = {(X )P для всех X Б , где }
Пример: Преобразование КС-грамматики с правилами
1) Q ab 2)B b 3)C db
в эквивалентную грамматику, не содержащую бесполезных символов.
Шаг алгоритма |
Действия и результаты |
1 |
W0=Q |
2 |
W1 = { Q, a,b } |
3 |
W1 = W0 ? Нет W0 = W1={ Q, a, b } |
4 |
W1 = { Q, a, b } |
5 |
W1 = W0 ? Да W ={ Q, a, b } |
6 |
N’= { Q} T’={a, b} Б={B, C, d} P’= {Q ab} |