- •1. Постановка задачи
- •Задание 10
- •2. Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Семантика входного языка
- •2.2.1.Встроенные типы данных входного языка
- •2.2.2.Операции входного языка и их приоритет
- •2.2.3.Конструкции входного языка
- •3. Описание этапа лексического анализа.
- •3.1. Определение типов лексем.
- •3.2. Определение синтаксиса лексем
- •3. Описание этапа синтаксического анализа.
- •3.1 Построение кс-грамматики входного языка.
- •3.2 Определение класса кс-грамматики входного языка.
- •3.3 Постоение таблиц переменных, меток, констант и векторов
- •3.4 Описание промежуточного языка.
- •3.5 Неформальное описание перевода
- •Построение транслирующей грамматики
- •Построение атрибутной транслирующей грамматики
- •Построение атрибутного дмп-процессора
- •Тестирование атрибутного дмп-процессора
3. Описание этапа синтаксического анализа.
3.1 Построение кс-грамматики входного языка.
S → Decl void main() { SOp }
SOp → Op SOp SOp → ε
Op → Lab: NOp; Op → NOp; Op → DecT;
DecT → typedef Typ ID DecT → typedef vector [Dim] ID
NOp → { SOp } NOp → COpG NOp → COp NOp → CycOp NOp → TrOp NOp → InOp NOp → OutOp NOp → Exp
COpG → (Exp)? Exp : Exp
COp → if (Exp) Op else Op COp → if (Exp) Op
CycOp → for (NEx;NEx;NEx) Op
NEx → Exp NEx → ε
TrOp → goto Lab
OutOp → printf ( Pr NPr )
NPr → , Pr NPr NPr → ε Pr → Var Pr → Num Pr → Str
InOp → scanf Var
Exp → Exp || Dis Exp → Dis Exp → Exp UnOp Exp → Exp GOp Exp Dis → Dis && Con Dis → Con |
Con → Con AddOp Rel Con → Rel
Rel → Rel RelOp Sm Rel → Sm
Sm → Sm MOp Ml Sm → Ml
Ml → Num Ml → Var Ml → (Exp) Ml → UnOp Ml Ml → ! Ml
Decl → Decl1; Decl Decl → ε
Decl1 → Typ ID Decl1’ Decl1 → const Typ ID Decl1’ Decl1 → vector ID Dim Decl1’’
Decl1’ → = Num Decl1’ → ε Decl1’’ → = VecVal Decl1’’ → ε
VecVal → [ELV LNum]
LNum → , ELV LNum LNum → ε
Var → ID Var → VecVal Var → ElV
ElV → ID [ Ind ] ElV → Num
Typ → Type Typ → ID Lab → ID Dim → CN Ind → CN Num → CF Num → CN |
3.2 Определение класса кс-грамматики входного языка.
Построенная грамматика входного языка должна входить в класс LL(1) – грамматик. Для этого необходимо устранить левую рекурсию и провести левую факторизацию. Получим LL(1) – грамматику:
1
2 3
4 5 6
7 8 9
10 11 12 13 14 15 16 17
18
19 20 21
22
23 24
25
26
27 28 29 30 31
32
33 34 35 36 37 38 39 |
S → Decl void main() { SOp }
SOp → Op SOp SOp → ε
Op → Lab: NOp; Op → NOp; Op → DecT;
DecT → typedef DecT’ DecT’ → Typ ID DecT’ → vector [Dim] ID
NOp → { SOp } NOp → COpG NOp → COp NOp → CycOp NOp → TrOp NOp → InOp NOp → OutOp NOp → Exp
COpG → (Exp)? Exp : Exp
COp → if (Exp) Op COp’ COp’ → else Op COp’ → ε
CycOp → for (NEx;NEx;NEx) Op
NEx → Exp NEx → ε
TrOp → goto Lab
OutOp → printf ( Pr NPr )
NPr → , Pr NPr NPr → ε Pr → Var Pr → Num Pr → Str
InOp → scanf Var
Exp → Dis Exp’ Exp’ → || Dis Exp’ Exp’ → GOp Dis Exp’ Exp’ → UnOp Exp’ Exp’ → ε Dis → Con Dis’ Dis’→ && Con Dis’ |
40
41 42 43
44 45 46
47 48 49
50 51 52 53 54
55 56
57 58 59
60 61 62 63
64 65 66
67 68 69 70
71 72 73 74 75 76 77 78
|
Dis’ → ε
Con → Rel Con’ Con’ → AddOp Rel Con’ Con’ → ε
Rel → Sm Rel’ Rel’ → RelOp Sm Rel’ Rel’ → ε
Sm → Ml Sm’ Sm’ → MOp Ml Sm’ Sm’ → ε
Ml → Num Ml → Var Ml → (Exp) Ml → UnOp Ml Ml → ! Ml
Decl → Decl1; Decl Decl → ε
Decl1 → Typ ID Decl1’ Decl1 → const Typ ID Decl1’ Decl1 → vector ID Dim Decl1’’
Decl1’ → = Num Decl1’ → ε Decl1’’ → = VecVal Decl1’’ → ε
VecVal → [ELV LNum] LNum → , ELV LNum LNum → ε
Var → ID Var’ Var → VecVal Var’ → [ Ind ] Var’ → ε
ElV → ID ElV → Num Typ → Type Typ → ID Dim → CN Ind → CN Num → CF Num → CN |
Разбор для LL(1)-грамматики можно осуществить с помощью 1-предсказывающего алгоритма разбора, который использует входную ленту, магазин и выходную ленту.
Vp – алфавит магазинных символов, Σ – алфавит терминальных символов. Работой алгоритма управляет управляющая таблица М, задающая отображение множества в множество, состоящее из следующих элементов:
(β, i), где - правая часть вывода с номеромi
ВЫБРОС
ДОПУСК
ОШИБКА
Алгоритм анализирует входную цепочку, выполняя последовательность тактов. Пусть FIRST (x) = {a}, тогда работа алгоритма в зависимости от элемента управляющей таблицы М(Х, а) определяется следующим образом:
М(Х, а)= (β, i) -
М(a, а)=ВЫБРОС -
М =ДОПУСК - - завершение работы, выходная цепочка π – левый разбор входной цепочки
М(Х, а)=ОШИБКА – разбор прекращается, выдается сообщение об ошибке.
В нижеприведенной таблице управления столбцы – терминальные символы (токены), строки – магазинные символы. Для компактности вместо пары (β, i) приводится только номер правила вывода i, цепочка β – правая часть этого правила. Выброс обозначен буквой «в», пустые ячейки – ошибка.
|
ID |
Lab |
CN |
CF |
Str |
I F |
EL SE |
MA IN |
VO ID |
FOR |
GO TO |
PRIN TF |
SCANF |
TYPEDE |
CONST |
VECTOR |
Type |
GOp |
= |
Add Op |
M Op |
Rel Op |
Un Op |
! |
|| |
&& |
( |
) |
{ |
} |
[ |
] |
, |
; |
Sep |
ε |
S |
1 |
|
|
|
|
|
|
|
1 |
|
|
|
|
|
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
Decl |
55 |
|
|
|
|
|
|
|
56 |
|
|
|
|
|
55 |
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SOp |
2 |
2 |
2 |
2 |
|
2 |
|
|
|
2 |
2 |
2 |
2 |
2 |
|
|
|
|
|
|
|
|
2 |
2 |
|
|
2 |
|
2 |
3 |
2 |
|
|
|
|
|
Op |
5 |
4 |
5 |
5 |
|
5 |
|
|
|
5 |
5 |
5 |
5 |
6 |
|
|
|
|
|
|
|
|
5 |
5 |
|
|
5 |
|
5 |
|
5 |
|
|
|
|
|
Nop |
17 |
|
17 |
17 |
|
12 |
|
|
|
13 |
14 |
16 |
15 |
|
|
|
|
|
|
|
|
|
17 |
17 |
|
|
11 |
|
10 |
|
17 |
|
|
|
|
|
DecT |
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DecT’ |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CopG |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
|
|
|
|
|
|
|
|
Cop |
|
|
|
|
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Cop' |
|
|
|
|
|
|
20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CycOp |
|
|
|
|
|
|
|
|
|
22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TrOp |
|
|
|
|
|
|
|
|
|
|
25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InOp |
|
|
|
|
|
|
|
|
|
|
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OutOp |
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NPr |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
|
|
|
|
25 |
|
|
|
Pr |
29 |
|
30 |
30 |
31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
|
|
|
|
Exp |
33 |
|
33 |
33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
33 |
|
|
33 |
|
|
|
33 |
|
|
|
|
|
Exp' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
35 |
|
|
|
36 |
|
34 |
|
|
35 |
|
37 |
|
|
|
37 |
37 |
|
Dis |
38 |
|
38 |
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
38 |
|
|
38 |
|
|
|
38 |
|
|
|
|
|
Dis' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
40 |
|
|
|
40 |
|
40 |
39 |
|
40 |
|
40 |
|
|
|
40 |
40 |
|
Con |
41 |
|
41 |
41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
41 |
|
|
41 |
|
|
|
41 |
|
|
|
|
|
Con' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
43 |
42 |
|
|
43 |
|
43 |
43 |
|
43 |
|
43 |
|
|
|
43 |
43 |
|
Rel |
44 |
|
44 |
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
44 |
|
|
44 |
|
|
|
|
|
|
|
|
|
Rel' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
46 |
46 |
|
45 |
46 |
|
46 |
46 |
|
46 |
|
46 |
|
|
|
46 |
46 |
|
Sm |
47 |
|
47 |
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
47 |
|
|
47 |
|
|
|
|
|
|
|
|
|
Sm' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
49 |
49 |
48 |
49 |
49 |
|
49 |
49 |
|
49 |
|
49 |
|
|
|
49 |
49 |
|
Ml |
51 |
|
50 |
50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
54 |
|
|
52 |
|
|
|
51 |
|
|
|
|
|
Decl1 |
57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
59 |
57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Decl1’ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
|
|
Decl1’’ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
|
Typ |
74 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dim |
|
|
75 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Var |
67 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
|
|
|
|
|
Var’ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
70 |
70 |
70 |
70 |
70 |
|
70 |
70 |
|
70 |
|
70 |
69 |
70 |
|
70 |
70 |
|
VecVal |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
|
|
|
|
Num |
|
|
78 |
77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LNum |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
65 |
|
|
|
ElV |
71 |
|
72 |
72 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ind |
|
|
76 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ID |
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Lab |
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CN |
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CF |
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Str |
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IF |
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ELSE |
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MAIN |
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VOID |
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FOR |
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GOTO |
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRINTF |
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SCANF |
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TYPEDEF |
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CONST |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VECTOR |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Type |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GOp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AddOp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MOp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RelOp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UnOp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
&& |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
Sep |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
┴ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
допуск |