Методические указания (1114907), страница 3
Текст из файла (страница 3)
Д) строки, выделенные полужирным шрифтом, такие как id или if.
-
Эти символы являются нетерминалами:
А) прописные буквы из начала алфавита, такие как A, B, C;
Б) буква S, которая обычно обозначает стартовый символ;
В) имена из строчных букв, выделенные курсивом, такие как stmt или expr.
-
Прописные буквы из конца алфавита, такие как X, Y, Z, представляют грамматические символы, т е либо терминалы, либо нетерминалы.
-
Строчные буквы из конца алфавита, такие как u, v, …, z, обозначают строки терминалов.
-
Строчные греческие буквы, такие как α, β, µ, представляют строки грамматических символов. Таким образом, в общем виде продукция может быть записана как А → α, в которой одиночный нетерминал А располагается справа от стрелки, а строка грамматических символов α – справа от стрелки.
-
Если А → α1, A → α2, …, A → αk представляют собой продукции с А в левой части, то можем записать А → α1| α2| …| αk. Мы называем α1, α2, …, αk альтернативами А.
-
Если иное не указано явно, левая часть первой продукции является стартовым символом.
-
Продукция - →.
Классификация грамматик и я зыков по Хомскому
(грамматики классифицируются по виду их правил вывода)
Тип 0:
Грамматика G = (VT, VN, P, S), называется грамматикой типа 0, если на правила вывода не накладывается никаких ограничений (кроме тех, которые указаны в определении грамматики).
Тип 1:
Грамматика G = (VT, VN, P, S), называется неукорачивающей грамматикой, если каждое правило Р имеет вид α → β, где α € (VTﮟVN)+, β € (VTﮟVN)+ и | α| <= | β|.
Грамматика G = (VT, VN, P, S), называется контекстно-зависимой (КЗ), если каждое правило из Р имеет вид α → β, где α = ξ1А ξ2; β = ξ1γ ξ2; А € VN; γ € (VTﮟVN)+; ξ1, ξ2 € (VTﮟVN)*.
Тип 2:
Грамматика G = (VT, VN, P, S), называется контекстно-свободной (КС), если каждое правило из Р имеет вид А → β, где А € VN, β € (VTﮟVN)+.
Грамматика G = (VT, VN, P, S), называется укорачивающей контекстно-свободной (УКС), если каждое правило из Р имеет вид А → β, где А € VN, β € (VTﮟVN)*.
Тип 3:
Грамматика G = (VT, VN, P, S), называется праволинейной, если каждое правило из Р имеет вид А → tB либо А →t, где А € VN, В € VN, t € VN.
Грамматика G = (VT, VN, P, S), называется леволинейной, если каждое правило из Р имеет вид А→ Bt либо А →t, где А € VN, В € VN, t € VN.
Алгоритм «Устранение левой рекурсии»
Вход. Грамматика G без циклов и ε-продукций.
Выход. Эквивалентная грамматика без левой рекурсии.
Метод. Применить алгоритм устранения левой рекурсии. Результирующая грамматика без левой рекурсии может иметь ε-продукции.
-
Расположить нетерминалы в некотором порядке А1, А2, ..., Аn
-
for i:=1 to n do begin
for j:=1 to i-1 do begin
Заменить каждую продукцию вида Ai → Ajγ
Продукциями А →δ1γ| δ2γ| …| δkγ
Где Аj А →δ1| δ2| …| δk – все текущие Аj – продукции
End
Устранить непосредственную левую рекурсию
Среди Аi – продукций
End
Алгоритм «Левая факторизация грамматики»
Вход. Грамматика G.
Выход. Эквивалентная левофакторизованная грамматика
Метод. Для каждого нетерминала А находим наидлиннейший префикс α, общий для двух или большего числа альтернатив. Если α≠ε, т е имеется нетривиальный общий префикс, заменим все продукции А→αβ1| αβ2| …| αβn| γ, где γ представляет все альтернативы, не начинающиеся с α, продукциями
А →αА’| γ
A’→ β1| β2| …| βn
Здесь А’ – новый нетерминал. Выполняем это преобразование до тех пор, пока никакие две альтернативы не будут иметь общий префикс.
Условие:
-
По описанию языка построить порождающую грамматику.
-
Определить тип построенной грамматики и свойства.
-
Построить для трех примеров деревья разбора.
-
Если грамматика является леворекурсивной, то устранить её.
-
Если грамматика является не левофакторизованной, то левофакторизовать.
-
Для модифицированной грамматики построить деревья разбора по тем же примерам что и в п.3
Варианты:
№ | Формулировка варианта задания |
| <E> ::= <E> ‘+’ <E> | <E> ‘*’ <E> | ‘(‘ <E> ‘)’ | ‘i’ |
| <S> ::= ‘if’ <E> ‘then’ <O> [ ‘else’ <O> ] <E> ::= ‘i’ | ‘i’ ‘==’ <E> <O> ::= ‘o’ … |
| type: formalParameter: block: |
| |
| <P> ::= [ <H> ] <B> <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <P> ::= <H> [ <B> ] <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <P> ::= [ <H> ] [ <B> ] <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <P> ::= <H> (<B>)… <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <P> ::= [ <H> ] <B> <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… [‘;’] |
| <P> ::= [ <H> ] <B> <H> ::= [‘h’] (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… [‘;’] |
| <P> ::= <H> [ <B> ] <H> ::= [‘h’] (‘t’ ‘i’)… <B> ::= ‘b’ ( [ ‘,’ ] ‘b’)… ‘;’ |
| <P> ::= <H>… [ <B> ] <H> ::= [‘h’] (‘t’ ‘i’)… <B> ::= ‘b’ ( [ ‘,’ ] ‘b’)… [ ‘;’ ] |
| <P> ::= <H> [ <B>… ] <H> ::= [‘h’] (‘t’ ‘i’)… <B> ::= [‘b’] ( [‘,’] ‘b’)… ‘;’ |
| <P> ::= ([ <H> ] [ <B> ])… <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <P> ::= (<H> | <B>)… <H> ::= ‘h’ (‘t’ ‘i’)… <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <P> ::= <H> [ <B> ] <H> ::= ‘h’ (‘t’ ‘i’)… | ε <B> ::= ‘b’ (‘,’ ‘b’)… ‘;’ |
| <E> ::= <E> ‘-’ <E> | <E> ‘+’ <E> | ‘(‘ <E> ‘)’ | ‘i’ |
| <S> ::= ‘if’ <E> ‘then’ <O> [ ‘else’ <O> ] <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | <S> | ‘o’ |
| |
| b: |
| h: b: |
| h: b: |
| h: b: |
| <S> ::= ‘if’ [ <E> ] ( [ ‘i’ ‘:’ ] ‘then’ <O> )… <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | <S> | ‘o’ |
| <S> ::= ‘if’ [ <E> ] ( ‘i’ ‘:’ ‘then’ <O> )… <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | ‘o’ |
| <S> ::= ‘if’ [ <E> ] ( ‘i’ ‘:’ ‘then’ <O> )… <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | <S> | ‘o’ |
| <S> ::= ‘if’ [ <E> ] ‘then’ <O> | <O> <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | <S> | ‘o’ |
| <S> ::= ‘if’ [ <E> ] ‘then’ <O> [ ‘else’ <O> ] | <O> <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | <S> | ‘o’ |
| <S> ::= ‘if’ [ <E> ] ‘then’ <O> [ ‘else’ <O> ] <E> ::= ‘i’ | ‘i’ ‘<>’ <E> <O> ::= ‘o’ <O> | <S> | ‘o’ |
| <E> ::= <E> ‘*’ <E> | <E> ‘=’ <E> | ‘(‘ <E> ‘)’ | ‘i’ |
Пример построения КС-грамматики:
-
Дано описание языка: <E> ::= <E> ‘+’ <E> | <E> ‘*’ <E> | ‘(‘ <E> ‘)’ | ‘i’
-
Построим грамматику о описанию языка:
-
Грамматика является контекстно-свободной (КС), потому что символы левой части - нетерминалы, а символы правой части – терминалы или нетерминалы.
-
Построим для трех примеров деревья разбора
-
i+ (i+i)
-
(i+i)*(i+i)+i
-
i*i+i*(i+i)
-
Грамматика является леворекурсивной. Преобразуем грамматику.
α1=+Е β1=(Е)