目录

目标任务

设计要求

一、程序功能描述

二、正则文法

三、程序结构描述

四、代码

五、程序测试

测试用例1

测试结果1

测试用例2

测试结果2


目标任务

以下为正则文法所描述的 C 语言子集单词符号的示例,请补充单词符号:++,–, >>, <<, += , -= ,*=, /= ,&&(逻辑与),||(逻辑或),!(逻辑非)等等,给出补充后描述 C 语言子集单词符号的正则文法,设计并实现其词法分析程序。

→字母︱ 字母︱ 数字

→数字︱ 数字

→+ ︱- ︱* ︱;︱, ︱(︱) ︱{︱} →=︱=︱>︱=︱=︱*

→<

→=

→>

→/

→!

该语言的保留字 :void、int、float、double、if、else、for、do、while 等等(也可补充)。

设计要求

1)可将该语言设计成大小写不敏感,也可设计成大小写敏感,用户定义的标识符最长不超过 32 个字符;

(2)字母为 a-z A-Z,数字为 0-9;

(3)可以对上述文法进行扩充和改造;

(4)“/*……*/”和“//”(一行内)为程序的注释部分。

(5)给出各单词符号的类别编码;

(6)词法分析程序应能发现输入串中的错误;

(7)词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件;

(8)设计两个测试用例(尽可能完备),并给出测试结果。


一、程序功能描述

输入源程序,词法分析后,能发现其中的错误;

能够识别注释的开始结束、单字符分界符、双字符分界符;

分析结果为二元式序列组成的中间文件。

二、正则文法

G[]:

→|||

→字母|字母|数字

→数字|数字

→% | ; | , | ( | ) | { | } | [ | ]

→=|=|=|=|*|+|=|-|=|=|=|>|<|&|| |/|/

→<→=→> →!

→/ →+ →- →*

→& →|

三、程序结构描述

设计方法

单词符号类别编码

单词符号

类别编码

单词符号

类别编码

标识符

1

%

20

无符号整数

2

;

21

void

3

,

22

int

4

(

23

float

5

)

24

double

6

{

25

If

7

}

26

else

8

[

27

for

9

]

28

do

10

>

29

while

11

<

30

return

12

=

31

break

13

!

32

continue

14

>=

33

char

15

<=

34

+

16

!=

35

17

==

36

*

18

++

37

/

19

38

+=

39

<<

44

-=

40

&&

45

*=

41

||

46

/=

42

&

47

>>

43

|

48

状态转换图

函数定义及函数之间的调用关系

isLetter:判断是否是字母a-z,A-Z

isDigit:判断是否是数字0-9

getIdentifier_ID:返回保留字或标识符编号

getSinglechar_ID:返回单字符分界符编号

四、代码

#include #include #include int isLetter(char c){ if((c>='a'&&c='A'&&c='0'&&c'){//大于 ch=fgetc(fp);if(ch=='='){fprintf(fw,"(33,>=)");ch=fgetc(fp);}else if(ch=='>'){fprintf(fw,"(43,>>)");ch=fgetc(fp);}else{fprintf(fw,"(29,>)");}}else if(ch=='<'){//小于 ch=fgetc(fp);if(ch=='='){fprintf(fw,"(34,<=)");ch=fgetc(fp);}else if(ch=='<'){fprintf(fw,"(44,<<)");ch=fgetc(fp);}else{fprintf(fw,"(30,%c",ch);printf("错误:未定义->%c\n",ch);break;}}fclose(fp);fclose(fw);printf("二元式序列组成的中间文件已经生成!\n");return 0;}

五、程序测试

测试用例1

测试结果1

测试用例2

测试结果2


如果对你有帮助的话,可以考虑点个赞~~