编译原理
因为在课本中已经对词法分析器做了很明确的分析,所以只要把代码变成真正可执行的C语言即可,我是参照课本的;
编程思路:根据书中提供的大致代码,不难把一些类似letter() digit()的函数写出来,程序中是用ch来表示字符的,可是要判断每一个读入的字符,不难想到用数组来实现(当然数据结构中的栈实现起来或许更好一些,但能力有限了),这样只要prog[p]中p++即可判断下一字符,扫描到下一字符为非类型字符时p-1即可(即retract()函数)。而判断是否为保留字还是想了不短的时间,首先想到prog[p]、p++逐个字符检查,可是逐个字符检查发现没有办法和保留字对比,或者说比起来很麻烦,查资料后发现用strcmp()函数可以比较容易的实现,只要将token和keyword[j]进行对比,如果二者相同结果返回j+1那么就是第j+1个保留字,否则返回0,之后再进行处理。用strcmp()函数时还需#include<string.h>。程序需要的一些函数基本定义完后开始写主函数,写主函数还是比较纠结的,因为虽然大体框架很清晰,但一些衔接的地方还是不知道该怎么办。就像空格的问题就想了很久,如程序输入时就有空格,程序中间出现空格,不知道该怎么处理。比较token与关键词的时候,本来是用 for(j=0;j<=4;j++) {
if(strcmp(token,keyword[j])==0) {
return j+1;
} else
return 0;
}
但执行一次只有while可以识别,剩下的关键字被return 0了,所以改成了下面的做法 if(strcmp(token,keyword[0])==0) return 1;
else if(strcmp(token,keyword[1])==0) return 2
没有把token[]置空会出现如下错误
把一个数组置空网上给出了如下方法:
也就是memset(token,0,sizeof(token)) 没见过,所以用了比较笨的方法,如下: for(i=0;i<20;i++)
token[i]=NULL; 即可清空数组