- •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 Неформальное описание перевода
- •Построение транслирующей грамматики
- •Построение атрибутной транслирующей грамматики
- •Построение атрибутного дмп-процессора
- •Тестирование атрибутного дмп-процессора
Построение атрибутной транслирующей грамматики
Очевидно, что для синтаксического анализа транслирующей грамматики недостаточно, так как неизвестны операнды для построения тетрад операционными элементами. Она должна быть расширена до L - атрибутной транслирующей грамматики, имеющей форм простого присваивания. Для этого добавим к элементам правил вывода синтезированные и унаследованные атрибуты. Будем использовать для создания новых строк в таблице переменных функцию NewVar, а в таблице меток – функцию NewLab.
1
2 3
4
5 6
7 8
9
10 11 12 13 14 15 16 17
18
19
20
35
36
37
38
39
40
41
42
43
44
45
62
63
64
65
66
67
68 |
S → Decl void main() { SOp }
SOp → Op SOp SOp → ε
Op → Labp: NOp; {NLab}q q ← p Op → NOp; Op → DecT;
DecT → typedef DecT’ DecT’ → Typ p ID q {NType} p1,q1,n p1← p q1 ← q n ← 0 DecT’ → vector [Dim]n IDq {NType} p, q1,n1 p← 3 q1 ← q n1← n
NOp → { SOp } NOp → COpG NOp → COp NOp → CycOp NOp → TrOp NOp → InOp NOp → OutOp NOp → Exp
COpG → (Exp R)? {BFL} p, R1 Exp{BRL} q {DEFL} p1 : Exp {DEFL} q1 p, p1← NewLab q, q1← NewLab R1 ← R
COp → if (Exp R) {BFL } p, R1 Op COp’ p1, p2 {DEFL} p3 p, p1 ← NewLab p3 ← p2 R1 ← R
COp’p2, p3 → {BRL} p {DEFL} p1 else Op p, p3 ← NewLab p1 ← p2
Exp’ p, R3 → GOp t Dis q {GOp} t1, p1, q1, R Exp’R1,R2 R3 ← R2 p1 ← p q1 ← q t1 ← t R1 ← R
Exp’ p, R3 → UnOp t {UnOp} t1, p1, R Exp’ R1,R2 R3 ← R2 p1 ← p t1 ← t R1 ← R
Exp’ p, R → ε R ← p
Dis R → Con p Dis’ p1, R1 R, ←R1 NewVar p1 ← p
Dis’ p, R → && Con q {AndOp} p1, q1, R1 Dis’ R2, R3 R ← R3 p1 ← p q1 ← q R2 ← R1
Dis’ p, R → ε R ← p
Con R → Rel p Con’ p1, R1 R1, R ← NewVar p1 ← p
Con’ p, R → AddOp t Rel q {AddOp} t1, p1, q1, R1 Con’ R2, R3 R ← R3 p1 ← p q1 ← q t1 ← t R2 ← R1 Con’ p, R → ε R ← p
Rel R → Sm p Rel’ p1, R1 R1, R ← NewVar p1 ← p
Rel’ p, R → RelOp t Sm q {RelOp} t1, p1, q1, R1 Rel’ R2, R3 R ← R3 p1 ← p q1 ← q t1 ← t R2 ← R1 Decl1’’p, n → = VecVal p1, n1 p1 ← p n1 ← n
VecVal p, n → [ELVt {PEl} p1, s, t1, LNum p2, s1 ] p1, p2 ← p n ← n1+1 t1 ← t s, s1 ← 1
Decl1’’p, n → ε
LNum p, s → , ELVt {PEl} p1, s1, t1 LNum p2, s2 p1, p2 ← p n ← n1+1 t1 ← t s1, s2 ← s+1
LNum → ε
Var R → ID p Var’ p1, R1 R1, R ← NewVar p1 ← p
Var R → VecVal p, n {NVec} p1, n1, R1 p1 ← p R← R1 n1← n+1 |
21
22
23
24
25
26
27
28
29
30
31
32
33
34
46
47
48
49
50
51
52
53
54
55 56
57
58
59
60
61
69
70
71
72
73
74
75
76
77
78
|
COp’ p1, p2 → ε p2 ← p1
CycOp → for (NEx; {DEFL} p NEx R; {BFL} q, R1 {BRL} s {DEFL} t NEx {BRL} p1 {DEFL} s1) Op {BRL} t1 {DEFL} q1 p1 ← p R1 ← R q1 ← q s1 ← s t1 ← t
NEx R1 → Exp R R1← R NEx → ε
TrOp → goto Lab p {BRL} p1 p1 ← p
OutOp → printf ( Pr p {Printf } q NPr ) q ← p
NPr → , Prp {Printf } q NPr q ← p NPr → ε
Prp1 → Varp p1 ← p Prp1 → Nump p1 ← p Prp1 → Strp p1 ← p
InOp → scanf Var p {Scanf} q q ← p
Exp R1 → Dis p Exp’ p1, R R, R1 ← NewVar p1 ← p
Exp’ p, R3 → || Dis q {OrOp} p1, q1, R Exp’ R1, R2 R3 ← R2 p1 ← p q1 ← q R1 ← R
Rel’ p, R → ε R ← p
Sm R → Ml p Sm’ p1, R1 R1, R ← NewVar p1 ← p
Sm’ p, R → MOp t Ml q {MOp} t1, p1, q1, R1 Sm’ R2, R3 R ← R3 p1 ← p q1 ← q t1 ← t R2 ← R1
Sm’ p, R → ε R ← p
Ml p → Num p1 p ← p1
Ml p → Var p1 p ← p1
Ml p → (Exp p1) p ← p1
Ml p → UnOp t Ml q {UnOp} t1, q1, p1 q1 ← q t1 ← t p ← p1
Ml p → ! Ml q {NotOp} q1, p1 q1 ← q p ← p1
Decl → Decl1; Decl Decl → ε
Decl1 → Typ t ID p {NVar} t1, p1 Decl1’ p2 t1 ← t p1, p2 ← p
Decl1 → const Typ t ID p {NConst} t1, p1 Decl1’ p2 t1 ← t p1, p2 ← p
Decl1 → vector ID p [Dim n]{NVec} p1, n1 Decl1’’ p2,n2 n1, n2 ← n p1, p2 ← p
Decl1’ p → = Num q {GOp} t, p1, q1 p1 ← p q1 ← q t ← 1 Decl1’ p→ ε
Var’ p, R → [ Ind n ] {REl} p1, n1, R1 p1 ← p n1 ← n R ← R1
Var’ p, R → ε R ← p
ElV p1 → ID p p1 ← p
ElV p1 → Num p p1 ← p
Typ p1 → Type p p1 ← p Typ p1 → ID p p1 ← p
Dim p1 → CN p p1 ← p
Ind p1 → CN p p1 ← p
Num p1 → CF p p1 ← p Num p1 → CN p p1 ← p |
Описание операционных символов. Типы атрибутов соответствует типам операндов в тетрадах.
Операционный символ |
Описание |
Формируемая тетрада | |||
{NLab}q |
|
NLab |
q |
|
|
{Printf } q |
|
Printf |
q |
|
|
{Scanf } q |
|
Scanf |
|
|
q |
{OrOp} p, q, R |
|
|| |
p |
q |
R |
{GOp} t, p, q |
В зависимости от кода tформирует тетрады =,+=, -=, *=, /= |
+= |
p |
q |
p |
= |
q |
|
p | ||
{UnOp} t, p, R |
В зависимости от кода tформирует тетрады ++, --, ~~ (в случае ++, --R=p) |
++ |
p |
1 |
p |
~~ |
p |
|
R | ||
{AndOp} p, q, R |
|
&& |
p |
q |
R |
{AddOp} t, p, q, R |
В зависимости от кода tформирует тетрады +, - |
+ |
p |
q |
R |
{RelOp} t, p, q, R |
В зависимости от кода tформирует тетрады >, <, >=, <=, ==, != |
> |
p |
q |
R |
{MOp} t, p, q, R |
В зависимости от кода tформирует тетрады *, /.pиqмогут быть и числами, и векторами (один из них вектор –R-вектор, оба –R-число) |
* |
p |
q |
R |
{NotOp} q, p |
|
! |
q |
|
p |
{NVar} t, p |
|
NVar |
t |
p |
|
{NConst} t, p |
|
NConst |
t |
p |
|
{NVec} p, n |
|
NVec |
p |
n |
|
{NType} p, q, n |
|
NType |
p |
q |
n |
{REl} p, n, R |
|
Rel |
p |
n |
R |
{PEl} p, s, t, n |
Если s<=nформирует тетраду |
PEl |
t |
s |
p |
{BFL } p, R |
|
BFL |
p |
R |
|
{BRL} p |
|
BRL |
p |
|
|
{DEFL} p |
|
DEFL |
p |
|
|