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

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 虛擬機
2.2.1 虛擬機組織結構
i 指令寄存器 Code 程序存儲器 s 數據存儲器 P 程序地址寄存器 b 基本地址存儲器 T 地址寄存器
2.2.2 虛擬機指令格式
l LIT指令,把一個常數置入棧頂
l LOD指令,把一個變量置入棧頂
l STO指令,從棧頂把數置入到一個變量單元里
l CAL指令,調用一個過程
l INT指令,預留數據存儲位置
l JMP指令,是無條件轉移指令
l JPC指令,是有條件轉移指令
l OPR指令,一組算術和關系運算指令
l ADP指令,傳遞函數參數
2.2.3虛擬機指令系統及其解釋
1.LIT 0,a (t++;s[t]=a;)(將數a置入棧頂)
2.OPR 0,a (a = 0:t = b - 1;p = s[t + 3];b = s[t + 2];)(返回調用程序)
(a=1:s[t] = -s[t];)(取負)
(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){ 報錯 }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;)[調用子程序
SL(靜態鏈地址)DL(動態鏈地址)RA(返回地址)]
6. INT 0,a (t = t + a;)(預留a個存儲位置);
7. JMP 0,a (p = a - 1;)(無條件跳轉);
8. JPC 0,a (if (s[t] == 0){ p = a - 1; t--; })(條件跳轉);
9.ADP 0,a (參數壓棧)
3.全局數據結構、常量和變量

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.函數原型

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 測試描述:
通過運行幾個不同的plx實例,來檢查PLX Compiler是否能解析plx語言,進行基本的語法分析,以及出錯的正確報錯、解釋執行等功能。
u 測試環境:
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 //由于沒有提供取余運算,只能這樣了~_~
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
報錯:
修改后運行結果:
中間代碼:
測試2:
u 測試目標:求兩數的最大公約數
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

中間代碼:
結果: