PL/X編譯器
軟件設(shè)計(jì)說明書
1.介紹
本編譯器可以按照PLX語言語法要求進(jìn)行詞法、語法、語義、出錯(cuò)處理,并最終成生目標(biāo)代碼,通過解釋執(zhí)行得到最終結(jié)果。
2.編譯器系統(tǒng)結(jié)構(gòu)
2.1 編譯器
2.1.1 PL/X語法圖
擴(kuò)展部分:
1) 支持帶參數(shù)的函數(shù)調(diào)用,函數(shù)可平行或嵌套定義,只允許內(nèi)層訪問外層,外層不能訪問內(nèi)層
2)支持單行注釋
3)支持read語句,因此可從終端獲取輸入
4)支持for語句
5)支持空程序體
關(guān)于出錯(cuò)處理:分為詞法分析錯(cuò)誤、句法分析錯(cuò)誤、運(yùn)行時(shí)錯(cuò)誤(如除數(shù)為0)
允許變量名或函數(shù)名重復(fù),但訪問的時(shí)候以最后一次聲明的為有效
2.1.2判斷是否符合兩條限制規(guī)則
規(guī)則1:找出圖中每一個(gè)分支點(diǎn),考察每個(gè)分支點(diǎn)的各個(gè)分支的頭符號是否相異
規(guī)則2:找出圖中每一個(gè)透明結(jié)構(gòu),考察每個(gè)透明結(jié)構(gòu)的頭符號集合與其跟隨符號是否相異
判斷結(jié)果:根據(jù)兩條限制規(guī)則,發(fā)現(xiàn)該語法圖分析符合兩條限制規(guī)則
2.1.3 過程調(diào)用相關(guān)圖
2.1.5 語法出錯(cuò)表定義

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

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

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

2.2 虛擬機(jī)
2.2.1 虛擬機(jī)組織結(jié)構(gòu)
i 指令寄存器 Code 程序存儲(chǔ)器 s 數(shù)據(jù)存儲(chǔ)器 P 程序地址寄存器 b 基本地址存儲(chǔ)器 T 地址寄存器
2.2.2 虛擬機(jī)指令格式
l LIT指令,把一個(gè)常數(shù)置入棧頂
l LOD指令,把一個(gè)變量置入棧頂
l STO指令,從棧頂把數(shù)置入到一個(gè)變量單元里
l CAL指令,調(diào)用一個(gè)過程
l INT指令,預(yù)留數(shù)據(jù)存儲(chǔ)位置
l JMP指令,是無條件轉(zhuǎn)移指令
l JPC指令,是有條件轉(zhuǎn)移指令
l OPR指令,一組算術(shù)和關(guān)系運(yùn)算指令
l ADP指令,傳遞函數(shù)參數(shù)
2.2.3虛擬機(jī)指令系統(tǒng)及其解釋
1.LIT 0,a (t++;s[t]=a;)(將數(shù)a置入棧頂)
2.OPR 0,a (a = 0:t = b - 1;p = s[t + 3];b = s[t + 2];)(返回調(diào)用程序)
(a=1:s[t] = -s[t];)(取負(fù))
(a=2:t--;s[t] = s[t] + s[t + 1];)(加法)
(a=3; t--;s[t] = s[t] - s[t + 1];)(減法)
(a=4; t--;s[t] = s[t] * s[t + 1];)(乘法)
(a=5: t--;if (s[t + 1] == 0){ 報(bào)錯(cuò) }else{ s[t] = s[t] / s[t + 1]; })(除法)
(a=6; if (s[t] > 0){ s[t] = 0; }else { s[t] = 1; })(邏輯not)
(a=7; t--;if (s[t] == s[t + 1]){ s[t] = 1; }else { s[t] = 0; })(等于)
(a=8; t--;if (s[t] != s[t + 1]){ s[t] = 1; }else { s[t] = 0; })(不等于)
(a=9; t--;if (s[t] < s[t + 1]){ s[t] = 1; }else { s[t] = 0; })(小于)
(a=10; t--;if (s[t] >= s[t + 1]){ s[t] = 1; }else { s[t] = 0; })(大于等于)
(a=11; t--;if (s[t] > s[t + 1]){ s[t] = 1; }else { s[t] = 0; })(大于)
(a=12; t--;if (s[t] <= s[t + 1]){ s[t] = 1; }else { s[t] = 0; })(小于等于)
(a=13; t--;if (s[t] != 0 && s[t + 1] != 0){ s[t] = 1; }else { s[t] = 0; })(邏輯and)
(a=14; t--;if (s[t] == 0 && s[t + 1] == 0){ s[t] = 0; }else { s[t] = 1; })(邏輯or)
(a=15; t--;輸出s[t])(輸出)
(a=16;t++;s[t]=輸入)(輸入)
3. LOD l,a (t++;s[t] = s[Base(l) + a];)( 將l,a形成的棧地址變量置入棧頂)
4. STO l,a (s[Base(l) + a] = s[t];t--;)(將棧頂值存到l,a形成的棧地址變量)
5. CAL l,a (s[t + 1] = Base(l);s[t + 2] = b;s[t + 3] = p;b = t + 1;p = a - 1;)[調(diào)用子程序
SL(靜態(tài)鏈地址)DL(動(dòng)態(tài)鏈地址)RA(返回地址)]
6. INT 0,a (t = t + a;)(預(yù)留a個(gè)存儲(chǔ)位置);
7. JMP 0,a (p = a - 1;)(無條件跳轉(zhuǎn));
8. JPC 0,a (if (s[t] == 0){ p = a - 1; t--; })(條件跳轉(zhuǎn));
9.ADP 0,a (參數(shù)壓棧)
3.全局?jǐn)?shù)據(jù)結(jié)構(gòu)、常量和變量

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

40

41

42

43

44

45

46

47

48

49

50

51

4.函數(shù)原型

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

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

PL/X編譯器
軟件測試說明書
測試1:
1. 概述
u 測試描述:
通過運(yùn)行幾個(gè)不同的plx實(shí)例,來檢查PLX Compiler是否能解析plx語言,進(jìn)行基本的語法分析,以及出錯(cuò)的正確報(bào)錯(cuò)、解釋執(zhí)行等功能。
u 測試環(huán)境:
Windows XP VC++6.0
2. 測試用例描述
2
3 program
4
5 integer s ,b
6
7 begin
8
9 procedure findPrime(integer small,big)
10
11 integer i,j,k,c,t
12
13 begin
14
15 i:=small;
16
17 for i from small to big
18
19 do
20
21 j:=2;
22
23 if(i>=3) then
24
25 k:=i/2+1;
26
27 c:=0;
28
29 for j from 2 to k
30
31 do
32
33 if i=(i/j)*j then //由于沒有提供取余運(yùn)算,只能這樣了~_~
34
35 c:=c+1
36
37 end
38
39 end;
40
41 if c=0 then
42
43 write i
44
45 end
46
47 end
48
49 end
50
51 end
52
53 read s;
54
55 read b;
56
57 call findPrime s b
58
59 end.
60
報(bào)錯(cuò):
修改后運(yùn)行結(jié)果:
中間代碼:
測試2:
u 測試目標(biāo):求兩數(shù)的最大公約數(shù)
u 測試用例:

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

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

中間代碼:
結(jié)果: