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

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 ε

Decl1Typ 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

TypType

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 ε

Decl1Typ 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 – алфавит магазинных символов, Σ – алфавит терминальных символов. Работой алгоритма управляет управляющая таблица М, задающая отображение множества в множество, состоящее из следующих элементов:

  1. (β, i), где - правая часть вывода с номеромi

  2. ВЫБРОС

  3. ДОПУСК

  4. ОШИБКА

Алгоритм анализирует входную цепочку, выполняя последовательность тактов. Пусть FIRST (x) = {a}, тогда работа алгоритма в зависимости от элемента управляющей таблицы М(Х, а) определяется следующим образом:

  1. М(Х, а)= (β, i) -

  2. М(a, а)=ВЫБРОС -

  3. М =ДОПУСК - - завершение работы, выходная цепочка π – левый разбор входной цепочки

  4. М(Х, а)=ОШИБКА – разбор прекращается, выдается сообщение об ошибке.

В нижеприведенной таблице управления столбцы – терминальные символы (токены), строки – магазинные символы. Для компактности вместо пары (β, 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

в

допуск