编译原理-实现识别标识符的词法分析器——沐雨先生

实验任务:

实现识别标识符的词法分析器

实验要求:

根据编译原理理论课教材中图2.3“标识符的转换图”,用C语言编写识别标识符的词法分析器,以文本文件为输入,控制台(或文件)输出识别出的每个标识符。

实验内容:

将txt文件里的内容作为输入的字符串,去除掉文本中的空格后,按照种别码进行识别判断,用自定义函数数字判断、字母判断和符号判断作为标识符和关键字的判断工具。
运行结果如图:
在这里插入图片描述
主要代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源代码

输入

intd+asd,j48494h>jkasinteia2main31012><-=07,0x16

输出

关键字:int
标识符:d
标识符:asd
标识符:j48494h
标识符:jkasinteia2main31012
标识符:x16

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void main(){
	FILE *in,*out;
    char w;
	int flag;
	char str;
	char words[100][100]={'\0'};//最多存放长度为100的100个单词
	int i=0,j=0;
	char letter[10000];//存放文件取出的字符,最长10000 
	int length=0;//所有字符的长度
	int num=0;//当前所在位置
    if( (in=fopen("example.txt","r")) ==NULL ){
		printf("can't open file!\n");
		exit(0);
	}
	else
		printf("打开文件成功\n");

	if( (out=fopen("result.txt","w")) ==NULL ){
		printf("can't open file!\n");
		exit(0);
	}
	else
		printf("打开文件成功\n");
	
    while( !feof(in) ){
		w=fgetc(in);
        if(w!=' '){
            letter[length]=w;
            length++;
        }   //去掉程序中的空格
    }

    flag=1;
	while(flag){
		for(j=0;num<length;num++,j++){
			str=letter[num];
			if( str>='a' && str<='z' || str>='A' && str<='Z' || str=='_' || (j!=0 && str>='0' && str<='9') ){
				words[i][j]=letter[num];
				if( !(strcmp(words[i],"main")&&strcmp(words[i],"int")&&strcmp(words[i],"if")&&strcmp(words[i],"else")&&strcmp(words[i],"while")&&strcmp(words[i],"do")&&strcmp(words[i],"then")) ){//若以此首字母开头 先组成了关键字 则先输出该关键字 
					fputs("关键字:",out);
					fputs(words[i],out);
					fputs("\n",out);
					i++;
					num++;
					break;
				}
			}
			else
				if(words[i][0]=='\0'){
					num++;
					break;
				}
				else{
					fputs("标识符:",out);
					fputs(words[i],out);
					fputs("\n",out);
					num++;
					i++;
					break;
				}
		}
		if(num==length)
			flag=0;
	}
    fclose(in);//关闭文件 
    fclose(out);//关闭文件 
	printf("完成,请查看!\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨先生

如果真的帮助到你了再打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值