编译原理词法分析程序实验报告.doc

编译原理词法分析程序实验报告.doc

ID:53264745

大小:394.75 KB

页数:20页

时间:2020-04-02

编译原理词法分析程序实验报告.doc_第1页
编译原理词法分析程序实验报告.doc_第2页
编译原理词法分析程序实验报告.doc_第3页
编译原理词法分析程序实验报告.doc_第4页
编译原理词法分析程序实验报告.doc_第5页
资源描述:

《编译原理词法分析程序实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、正规文法:E→LB

2、N

3、SS→+

4、*

5、(

6、)

7、,

8、.

9、:=

10、;

11、>

12、<

13、=

14、>=

15、<=

16、<>N→DN

17、DD→0

18、1

19、2

20、3

21、4

22、5

23、6

24、7

25、8

26、9L→A

27、B

28、C

29、...

30、Y

31、Z

32、a

33、b

34、c

35、...

36、y

37、zB→LB

38、DB

39、L

40、D状态图:空白字母与数字210字母非字母与数字*4数字非数字5+6*...87:=1001109>=.*.非=.120其他其中一个圆圈的是非终态,两个圆圈的是终态,两个圆圈且带一个*的是终态且多读了一个字符。单词种别定义:单词符号种别编码单词符号种别编码program1+16begin2*17end3(18var4)19int5,20and6.21or7:

41、=22not8;23if9>24then10<25else11=26while12>=27do13<=28标示符14<>29常数(整)15运行环境介绍:采用C++语言编写,VS2010编译调试。关键算法描述:ch=fgetc(fp1);lineNum++;if(ch=='/'){ch=fgetc(fp1);lineNum++;if(ch=='/'){ch=fgetc(fp1);while(ch!=EOF&&ch!=''){ch=fgetc(fp1);}if(ch==''){rowNum++;lineNum=0;}elsebreak;}elseif(ch=='*'&&M

42、ark!=1){longlen=ftell(fp1);intrn=rowNum;intln=lineNum;intsign=0;ch=fgetc(fp1);lineNum++;while(ch!=EOF&&sign!=2){if(ch==''){rowNum++;lineNum=0;}if(ch=='/'&&sign==1)sign=2;elsesign=0;if(ch=='*')sign=1;ch=fgetc(fp1);lineNum++;}if(sign==2){fseek(fp1,-1L,1);lineNum--;}else{Mark=1;fseek(fp1,len

43、-2,0);lineNum=ln-2;rowNum=rn;ch='';}}else{Error_Handle(rowNum,lineNum-1);fseek(fp1,-1L,1);lineNum--;}}此段代码主要用于对注释的处理,当读到一个字符是'/',继续读其下一位字符,如果下一位字符是'/',则其后整行内容作为注释,不对其进行词法分析,一直往后读直到遇到换行符''。如果下一位字符是'*',则一直往后读,直到遇到一个连续的*/,其中间内容作为注释,不对其进行词法分析;如果读到文件结尾也没用遇到一个连续的*/,则将字符指针移回'/'处,并将Mark变量置为1。如果下一

44、位字符不是'/',也不是'*'或Mark为1,则对/进行报错处理。此过程的状态转换图如下:3214/非*76/**/5非/不是'/',也不是'*'或Mark为1状态3表示为行注释,本行'//'后面的内容都是注释;状态7表示为/**/注释,/*和*/中间的内容为注释;状态5表示既不是行注释,也不是/**/注释,要进行其他处理(如:报错)。由于报错需要准错的指出错误的行号和列号,在程序中定义了两个变量rowNum和lineNum,每当读一个字符时,lineNum加1,当读到换行符时,rowNum加1,并将lineNum置0,在对注释进行处理的时候也遵循这样的操作。这样,即使有注释

45、也可以准确的指出错误的行和列了。elseif(IsLetter(ch)){while(IsLetter(ch)

46、

47、IsDigit(ch)){Concat(ch);ch=fgetc(fp1);lineNum++;}fseek(fp1,-1L,1);lineNum--;intcode=Reserve();if(code==0){intId_Num=0;vector::size_typei;for(i=0;i

48、Num==0){Id.push_back(strToken);Tuplet;t.i=14;t.j=Id.size();returnt;}else{Tuplet;t.i=14;t.j=Id_Num;returnt;}}else{Tuplet;t.i=code;t.j=-1;returnt;}}此段代码主要是对标识符的处理,若读到一个字母,则一直往后读,直到读到的字符不是一个字母或数字,然后调用Reserve()函数判断此字符串是不是关键字,若是关键字则返回此关键字的种别编码;若是标识符,则查标识符表,若标

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。