实验任务:
实现识别无符号数的词法分析器
实验要求:
根据编译原理理论课教材中图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;
}