词法
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
器设计
一、 问题描述
处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。
二、 实验思路
1、本实验思路很简单,就是逐个匹配测试文件的每个字符与程序中所标识的符号,总共分为几个比较模块,先是字母数字模块,可以识别出C语言程序中保留字,标识符和数字,其次是运算符和界符模块,可以识别出运算符和界符,最后一个模块就是未标识的符号,此时程序会报错,然后依次循环,直到文件结束。
2、采用结构体来存储符号的类型和符号本身:
struct point
{ char *kind;
char value[10];
};
另外采用C语言文件指针和相关
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
处理待测试文件以及测试结果文件。
3、程序中的函数名指示含义:keyword----保留字,Identifier---标识符,Digit---数字,CaculatorIdentifier---运算符,PatitionIdentifier---界符
4、程序中所定义的符号采用char类型,只能对C语言中最常见的单字符的符号进行定义,如‘+’,‘<’,而对于“<=”,”>=”及“++”,“--”则不能处理。因此本程序并不能实现对所有符号的归类。
三、 实验代码
#include
#include
char keywordtable[30][10]=
{"int","char","float","double","signed","unsigned",
"if","else","break","while","return","switch",
"case","continue","for","default","void","const",
"static","long","struct","auto","register","typedef",
"enum","extern","short","goto","sizeof","do",
};
char caculatetable[15]={'+','-','*','/','%','(',')','=','>','<','#'};
char partitiontable[10]={',',';','.',' ','{','}','"','[',']'};
struct point
{ char *kind;
char value[10];
};
int IsLetter(char ch)
{ if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') return 1;
else return 0;
}
int IsDigit(char ch)
{
if(ch>='0'&&ch<='9') return 1;
else return 0;
}
int Reserve(char strToken[30])
{
for(int i=0;i<30;i++)
if(strcmp(keywordtable[i],strToken)==0) return 1;
return 0;
}
void operate(FILE *fp,struct point a)
{
fp=fopen("d:测试结果.txt","a+");
fprintf(fp,"< %s , %s >\n",a.kind,a.value);
fclose(fp);
}
void Retract(FILE *fp)//顺序读写
{ fseek(fp,-1L,1);}
void Print(struct point a)
{ printf("< %s, \"%s\" >\n",a.kind,a.value);}
int IsCaculator(char ch)
{
int i;
for(i=0;i<15;i++)
if(caculatetable[i]==ch) return 1;
return 0;
}
int IsPatition(char ch)
{ int i;
for(i=0;i<10;i++)
if(partitiontable[i]==ch) return 1;
return 0;
}
int IsSpecial(char ch)
{
if(ch=='+'||ch=='-'||ch=='/'||ch=='%'||ch=='>'||ch=='<'||ch=='*'||ch=='=') return 1;
return 0;
}
int main()
{
int code;
struct point result;
char strToken[30];
char ch;
char *p;
FILE *fp,*fq;
fp=fopen("d:测试文件.txt","r");
if(fp==NULL)
{ printf("file does not exit!!");
return -1;
}
while(1)
{
p=strToken;
ch=fgetc(fp);
if(feof(fp))//输入输出函数,检查文件是否结束,如结束,则返回非零值,否则返回0
break;
if(ch==' ') continue;
if(IsLetter(ch))
{
while(IsLetter(ch)||IsDigit(ch))
{
*p=ch;
p++;
*p='\0';
ch=fgetc(fp);
if(feof(fp))
return -1;
}
Retract(fp);//顺序读取
code=Reserve(strToken);
if(code==1)
{ result.kind="keyword";//保留字
strcpy(result.value,strToken);
operate(fq,result);
Print(result);
}
else
{ result.kind="Identifier";//标识符
strcpy(result.value,strToken);
operate(fq,result);
Print(result);
}
}
else if(IsDigit(ch))
{
while(IsDigit(ch))
{ *p=ch;
p++;
*p='\0';
ch=fgetc(fp);
if(feof(fp)) return -1;
}
Retract(fp);
result.kind="Digit";//数字
strcpy(result.value,strToken);
operate(fq,result);
Print(result);
}
else if(IsPatition(ch)||IsCaculator(ch))
{ if(IsPatition(ch))
{ result.kind="PatitionIdentifier";//界符
*p=ch;
p++;
*p='\0';
strcpy(result.value,strToken);
operate(fq,result);
Print(result);
}
if(IsCaculator(ch))
{
char ch2;
ch2=fgetc(fp);
if(!IsCaculator(ch2)) Retract(fp);
result.kind="CaculatorIdentifier";//运算符
*p=ch;
p++;
*p='\0';
if(IsSpecial(ch)&&ch2=='=')
{ *p=ch2;
p++;
*p='\0';
}
if((ch=='>'||ch=='<'||ch=='+'||ch=='-')&&ch2==ch)
{ *p=ch2;
p++;
*p='\0';
}
strcpy(result.value,strToken);
operate(fq,result);
Print(result);
}
}
else
{ if(ch=='\n') continue;
result.kind="Error!!";//其他未声明的 均报错
strcpy(result.value,strToken);
operate(fq,result);//输出到测试结果文件
printf("Error occurs! at %c\n",ch);
}
}
return 1;
}
四、 实验结果
图1 实验结果
测试文件:
图2 测试文件
测试结果文件:
图3 测试结果文件
五、 实验
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
本实验写的较为简单,只是
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示了一些最常见的C语言符号,像是保留字,英文字母,数字,算术运算符和几个关系运算符,另外还有一些常见界符,如‘,’,‘;’,‘[’,‘]’,因为定义符号时采用char,这只适用单个字符的符号,而之后并没有再声明其他带有多个符号的符号,也就没有采用string类型或char[][]数组类型,所以像是测试文件中的注释符‘/*’,该程序就识别不出来,会提示报错;另外本实验在辨别符号时,采用穷举,没有用什么特别快捷的搜索方法,对一些较为简单的C语言程序,还是能识别出的。希望之后能改进程序。