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

实验任务:

实现识别无符号数的词法分析器

实验要求:

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

实验内容:

在实验一识别标识符的词法分析器的基础上,通过修改设计一个能识别无符号数的词法分析器。在example.txt文件中选取符合无符号数特征的符号串进行循环判断,将无符号数所包含的符号全部识别并输出。
输入:由字母数字符号构成的无序语句。
输出:符合无符号数的字符串。(通过文件输出)

运行结果示例:

在这里插入图片描述

主要代码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验小结:识别标识符和识别无符号数有一定的相同点,但也具有不同,实验一只需要识别letter/digit,而实验二在循环识别完digit后,还需要识别‘.’,然后继续识别digit,还可能有‘E’,然后又是digit,在这个过程中增加了实验的难度。

源代码

输入

hda32190.21+_,3478E65dajkEE…5637+3126.2E-31

输出

32190.21 无符号数
3478E65 无符号数
5637 无符号数
3126.2E-31 无符号数

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define   MAX 100              /*分析表的最大容量*/
#define   MAXBUF 255           /*缓冲区的大小*/
char letter[100];
char   ch ='\0';             //存放读入当前的输入字符

int IsLetter(char c){  //判断是否为字母
	if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z')))
		return 1;
	else
		return 0;
}

int IsDigit(char c){  判断是否为数字
    if(c>='0'&&c<='9')
		return 1;
    else
		return 0;
}
void Analyse(FILE *in,FILE *out){   //分析程序
     char arr[MAXBUF];	 //输入缓冲区,存放一个单词符号
     int j=0;
     while((ch=fgetc(in))!=EOF){
		if(IsLetter(ch)){      //字符串的处理
			while(IsLetter(ch)||IsDigit(ch)||ch=='_'){
				if((ch>='A')&&(ch<='Z'))     
					{}
				arr[j]=ch;
				j++;
				ch=fgetc(in);
			}
			fseek(in,-1L,SEEK_CUR);
			arr[j]='\0';
			j=0;
		}
		else if(IsDigit(ch)){ //数字的处理
			int s=0;
			while(IsDigit(ch)||IsLetter(ch)||ch=='.'||ch=='-'){
			     arr[j]=ch;
                 j++;
                 ch=fgetc(in);
			}
			fseek(in,-1L,SEEK_CUR);
			arr[j]='\0';
			j=0;
			if(s==0)
				fprintf(out,"%s\t无符号数\n",arr) ; 
		}
	 }
}

int main(){
	char w;
	int length=0;
    FILE *in,*out;
    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++;
        }   //去掉程序中的空格
    }
    Analyse(in,out);
    fclose(in);
    fclose(out);
	printf("完成,请查看!\n");
    return 0;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐雨先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值