- •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.5 Неформальное описание перевода
Оператор |
Формат оператора | |||
Код операции |
Операнд1 |
Операнд2 |
Результат | |
5*b |
* |
5 |
R2 |
R1 |
a || d |
|| |
R1 |
R3 |
R |
a=b[i] |
REl |
b |
i |
R1 |
= |
R1 |
|
a | |
int a |
AddVar |
a |
int |
|
if <выражение>
< оператор>
else < оператор> |
<выражение >(результат в R) | |||
BFL |
Lelse |
R |
| |
перевод <оператор> | ||||
BRL |
Lend |
|
| |
DEFL |
Lelse |
|
| |
перевод <оператор> | ||||
DEFL |
Lend |
|
| |
if <выражение>
< оператор> |
перевод <выражение > (результат в R) | |||
BFL |
Lend |
R |
| |
перевод <оператор> | ||||
DEFL |
Lend |
|
| |
(<выражение>)?
< выражение>:
< выражение> |
перевод <выражение> (результат в R1) | |||
BFL |
Lelse |
R1 |
| |
перевод <выражение> (результат в R) | ||||
BRL |
Lend |
|
| |
DEFL |
Lelse |
|
| |
перевод <выражение> (результат в R) | ||||
DEFL |
Lend |
|
| |
for(<выражение1>;
<выражение2>;
<выражение3>)
<оператор> |
перевод <выражение1> | |||
DEFL |
Lcheck |
|
| |
перевод <выражение2> (результат в R1) | ||||
BFL |
Lend |
R1 |
| |
BRL |
Lbegin |
|
| |
DEFL |
Lchange |
|
| |
перевод <выражение3> | ||||
BRL |
Lcheck |
|
| |
DEFL |
Lbegin |
|
| |
перевод <оператор> | ||||
BRL |
Lchange |
|
| |
DEFL |
Lend |
|
|
Построение транслирующей грамматики
Для построения транслирующей грамматики введем в LL(1)-грамматику, построенную в п. 3.2 операционные символы, производящие формирование и вывод тетрад. Tетрады будем обозначать только кодом операции в фигурных скобках, например, {AddOp}.
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 33
32
33 34 35 36 37 |
S → Decl void main() { SOp }
SOp → Op SOp SOp → ε
Op → Lab: NOp; {NLab} Op → NOp; Op → DecT;
DecT → typedef DecT’ DecT’ → Typ ID {NType} DecT’ → vector [Dim] ID {NType}
NOp → { SOp } NOp → COpG NOp → COp NOp → CycOp NOp → TrOp NOp → InOp NOp → OutOp NOp → Exp
COpG → (Exp)? {BFL} Exp {BRL} {DEFL}: Exp {DEFL}
COp → if (Exp) {BFL } Op COp’ {DEFL} COp’ → {BRL }{DEFL} else Op COp’ → ε
CycOp → for (NEx; {DEFL} NEx; {BFL}{BRL}{DEFL}NEx {BRL}{DEFL}) Op {BRL}{DEFL}
NEx → Exp NEx → ε
TrOp → goto Lab {BRL}
OutOp → printf ( Pr {Printf} NPr )
NPr → , Pr NPr NPr → ε Pr → Var Pr → Num Pr → Str
InOp → scanf Var {Scanf}
Exp → Dis Exp’ Exp’ → || Dis {OrOp} Exp’ Exp’ → GOp Dis {GOp} Exp’ Exp’ → UnOp {UnOp} Exp’ Exp’→ ε |
38 39 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 Dis’ Dis’ → && Con {AndOp} Dis’ Dis’ → ε
Con → Rel Con’ Con’ → AddOp Rel {AddOp} Con’ Con’ → ε
Rel → Sm Rel’ Rel’ → RelOp Sm {RelOp} Rel’ Rel’ → ε
Sm → Ml Sm’ Sm’ → MOp Ml {MOp} Sm’ Sm’ → ε
Ml → Num Ml → Var Ml → (Exp) Ml → UnOp Ml {UnOp} Ml → ! Ml {NotOp}
Decl → Decl1; Decl Decl → ε
Decl1 → Typ ID {NVar} Decl1’ Decl1 → const Typ ID {NConst} Decl1’ Decl1 → vector ID Dim {NVec} Decl1’’
Decl1’ → = Num {GOp} Decl1’ → ε Decl1’’ → = VecVal Decl1’’→ ε
VecVal → [ELV {PEl} LNum] LNum → , ELV {PEl} LNum LNum → ε
Var → ID Var’ Var → VecVal {NVec} Var’ → [ Ind ] {REl} Var’ → ε
ElV → ID ElV → Num Typ → Type Typ → ID Dim → CN Ind → CN Num → CF Num → CN |