Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа3 / Курсовик.doc
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
1.6 Mб
Скачать
    1. Построение атрибутной транслирующей грамматики

Очевидно, что для синтаксического анализа транслирующей грамматики недостаточно, так как неизвестны операнды для построения тетрад операционными элементами. Она должна быть расширена до 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, R3GOp t Dis q {GOp} t1, p1, q1, R Exp’R1,R2

R3 ← R2

p1 ← p

q1 ← q

t1 ← t

R1 ← R

Exp’ p, R3UnOp 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, RAddOp 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, RRelOp 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, RMOp 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 pUnOp 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 ε

Decl1Typ 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