Вариант № 9
-
Написать грамматику для цикла for языка Pascal.
<оператор_цикла_с_параметром> ::= for <условие> do <блок_опер> ;
<условие>:=<идентификатор> := < арифм_выр> <направл_измен_перемен_цикла> < арифм_выр>
<направл_измен_перемен_цикла> ::= to | downto
<арифм_выр>::= <арифм_выр> + <слагаемое>
<арифм_выр>::= <слагаемое>
<арифм_выр>::= <арифм_выр> - <слагаемое>
<слагаемое>::= <слагаемое> * <множитель>
<слагаемое>::= <множитель>
<слагаемое>::= <слагаемое> / <множитель>
<множитель>::= <идентификатор>
<множитель>::= <число>
<множитель>::= ( <арифм_выр> )
<блок_опер>::= <идентификатор> := <арифм_выр>
<блок_опер>::= begin <операторы> end
<блок_опер>::=
<операторы>::= <блок_опер> ; <операторы>
<операторы>::= <блок_опер>
<идентификатор>::= <буква> { <буква> | <цифра> }
<буква>::=A|B|C…Y|Z|a|b|c…z|
<цифра>::= 0|1|2|3|4|5|6|7|8|9
<число>::= [ +|-] <число_без_знака>
<число_без_знака>::= <цифра> { <цифра> }
1.2.Удалить правила с одинаковой правой частью.R={S->AaC, S->C, A->c, C->Bb, B->c}
Алгоритм:
R’={ S->AaC, S->caC, S->C, C->Bb, B->c }
Т.о. исключили правую рекурсию, но появился бесполезный (непроизводящий) символ А.
Построение множества порождающих нетерминалов G : Np
N0p ={B} N1p ={B, C} N2p ={B, C, S} N p ={B, C, S}
R’={ S–>caC, S–>C, C–>Bb, B–>c}
-
Определить преобразователь, осуществляющий перевод целых и вещественных чисел с
фиксированной точкой со знаком или без знака в цепочки из нулей и единиц по принципу: целому
соответствует 0, действительному – 1.
S + E, S - E, Sch A, Ech A, Ach A, A . C, A , B,A#, B + E, B - E, B ch A, Cch D, Dch D, D , B, D#
Управляющая таблица: заключительные состояния:A, D
|
+ |
- |
ch |
. |
, |
# |
Eps |
S (q0) |
E |
E |
A |
|
|
|
|
E (q1) |
|
|
A |
|
|
|
|
A (q2) |
|
|
A |
C |
B |
A |
|
B (q3) |
E |
E |
A |
|
|
|
|
C (q4) |
|
|
D |
|
|
|
|
D (q5) |
|
|
D |
|
B |
D |
|
Функции перехода:
(q0, +) {(q1, )}
(q0, – ) {(q1, )}
(q0, ch) {(q2, )}
(q1, ch) {(q2, )}
(q2, ch) {(q2, )}
(q2, . ) {(q4, )}
(q2, , ) {(q3, 0)}
(q2, # ) {(q2, 0)}
(q3,+) {(q1, )}
(q3, – ) {(q1, )}
(q3, ch) {(q2, )}
(q4, ch) {(q5, )}
(q5, ch) {(q5, )}
(q5, , ) {(q3, 1)}
(q5, #) {(q5, 1)}
4. R={S->begin D ; P end, D->d, D->D ; d, P->p, P->P ; P}
Требуется проверить, является ли это грамматикой прямого предшествования.
КС-грамматика G = < T, N, S, R > называется грамматикой предшествования, если она приведенная, не содержит правил с пустой правой частью и для любой пары символов из V выполняется не более одного отношения простого предшествования.
КС-грамматика, в которой нет правил с одинаковой правой частью, называется обратимой.
Обратимая грамматика предшествования называется грамматикой простого предшествования.
S->begin D ; P end (1)
D->d (2)
D->D ; d (3)
P->p (4)
P->P ; P (5)
Алгоритм построения матрицы предшествования:
Существуют отношения 4 видов (одновременное сворачивание, раньше/позже или вообще отсутствие отношения).Для построения матрицы отношений действуем по этим группам:
-
Нахождение всех отношений одновременного сворачивания