编译原理:C语言词法分析器

编译原理的实验:完成对C语言的词法分析


先说一下整体框架:

基类:Base  封装了一些基础的字符判断函数,如下:

int charkind(char c);//判断字符类型
	int spaces(char c); //当前空格是否可以消除
	int characters(char c);//是否是字母
	int keyword(char str[]);//是否是关键字
	int signwords(char str[]);//是否是标识符
	int numbers(char c);//是否是数字
	int integers(char str[]);//是否是整数
	int floats(char str[]);//是否是浮点型


派生类 LexAn 继承Base并且封装了对行和单词处理的函数,如下:

void scanwords(); //处理每一行
		void clearnotes();//清除注释和多余的空格
		void getwords(int state);//处理出单词
		void wordkind(char str[]);//判断单词类型并且输出

函数之间调用关系如下:




好了,整体框架说完了,我们来说具体的实现:


(一)清除注释和多余的空格


(1)C语言的注释有//和/* 两种形式,所以如果当前读进的是 / 只需分情况判断下一个:

如果是/ 那么本行 //之后的肯定都是注释,只需要保存注释,更新当前行即可;

如果是* ,那么接着寻找直至 */位置,保存注释,更新当前行,然后继续这个操作(有可能有本行有多个 /* */).

不足:不能处理跨行注释。

(2)处理多余的空格这里较为草率,只处理了形如if (    a    >=   b  ),即特殊符号和字母(数字)之间的空格;只要空格两端有特殊符号,那么去掉当前空格便不会造成错误。


void LexAn::clearnotes()
{
	int i, j, k;
	int noteCount = 0;
	int flag = 0;
	char note[100];

	/*注释*/
	for (i = 0; bufferin[buffern
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值