欢迎来到天天文库
浏览记录
ID:18485242
大小:312.50 KB
页数:23页
时间:2018-09-18
《编译原理词法分析器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、手工设计C语言的词法分析器1.课程设计任务1.1课程设计题目手工设计C语言的词法分析器(可以是C语言的子集)1.2设计要求处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。1.3设计目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。2.设计总体方案词法分析是编译的基础,需要对程序中的单词进行划分,并生成token文件(主要存符号表的入口地址,以便获取进一步需要的信息),供语法分析阶段使用。同时要生成符号表,包括变量的和常量的,在之后的分析中会不断的查填符号表,将单词的类型
2、,值等各项信息填完整,才能进行运算等操作。采用了较为底层的C语言。1、C语言严格区分字符和字符串,%c和%s不要混用,否则造成异常。Java中经常使用String或StringBuilder,淡化了字符的概念,在C中需要注意。2、自定义的头文件要用双引号而不是尖括号。3、''光标移到下一行,在打印源程序时,头文件打印空行,看上去像多打印了一个'',其实没错。4、字符串操作不能直接赋值额,需要搞清楚char型数组和char*的不同。Strcpy是将内容进行拷贝,char型数组用Strcpy。而可以char*=字符串常量,字符串常量表示的是一个地址,可以让char型
3、的指针直接指向该地址,避免空间浪费。235、在不同的处理函数中,要生成token,并赋值,然后让token的指针的数组指向该位置。但由于函数内的token变量是局部变量,跳出函数则失效,故指针指向的位置的内容将有可能改变,导致在该函数之外往文件中写token数组时乱码。6、fgets最后读到行末尾,'添加 ,判断时'不是''7、开辟的数组空间太小导致越界,也会导致乱码。8、最费脑子的错误就是自己设计的headCh,作为每次识别的第一个字符。因为读文件的时候,文件指针会一直的向后移动,当时为了避免文件指针往回移动的时间开销,就用一个char类型的headCh来保存第
4、一个字符。但是预处理的函数中,需要根据下一个字符判断是否结束预处理,故由headCh保存下一个字符,再读到buffer中时,buffer的第一个字符为下一行的第二个字符,即headCh+buffer的内容才是完整的一行的内容。所以为了不改变程序的处理过程,还要保持headCh始终在buffer[start]之前的一位,而处理程序是根据headCh的值来判断调用哪个处理函数的,故每次处理结束后需要给headCh和start重新赋值。程序流程图:23Token:23错误处理:3.代码main.c1.5、Hei';font-size:18px;">#include "global.h" 2.#include 3.int main() 4.{ 5. char fname[FSIZE]; 6. 7. error = fopen("error.txt", "w+"); 8. if(error==NULL) 9. { 10. printf("cannot create error.txt!"); 11. } 231. out = fopen("out.txt", "w+"); 2.6、 if(out==NULL) 3. { 4. printf("cannot create out.txt!"); 5. } 6. printf("please input filename: "); 7. scanf("%s", fname); 8. in = fopen(fname, "r"); 9. if(in==NULL) 10. { 11. printf("error: cannot open file %s", fname); 12. re7、turn -1; 13. } 14. headCh = predeal(in); 15. 16. while(fgets(buf, BSIZE, in)!=NULL) 17. { 18. head = headCh; 19. int len = strlen(buf); 20. buf[len-1] = ' '; 21. // printf("buf:$%s$tline:%d", buf, line); 22. star
5、Hei';font-size:18px;">#include "global.h" 2.#include 3.int main() 4.{ 5. char fname[FSIZE]; 6. 7. error = fopen("error.txt", "w+"); 8. if(error==NULL) 9. { 10. printf("cannot create error.txt!"); 11. } 231. out = fopen("out.txt", "w+"); 2.
6、 if(out==NULL) 3. { 4. printf("cannot create out.txt!"); 5. } 6. printf("please input filename: "); 7. scanf("%s", fname); 8. in = fopen(fname, "r"); 9. if(in==NULL) 10. { 11. printf("error: cannot open file %s", fname); 12. re
7、turn -1; 13. } 14. headCh = predeal(in); 15. 16. while(fgets(buf, BSIZE, in)!=NULL) 17. { 18. head = headCh; 19. int len = strlen(buf); 20. buf[len-1] = ' '; 21. // printf("buf:$%s$tline:%d", buf, line); 22. star
此文档下载收益归作者所有