Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа3 / Курсовик.doc
Скачиваний:
21
Добавлен:
01.05.2014
Размер:
2 Мб
Скачать
☆
    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, 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