词法分析器源代码词法分析器源代码
#include
#include
#include "ctype.h"
#include "string.h"
/**************************************判断字符区域*开始********************************************/
int characters_exist=0; /*用来判断是否是纯数字*/
int countoffinal=0; /*finalresult函数执行的次数*/
int word( ...
词法分析器源代码
#include
#include
#include "ctype.h"
#include "string.h"
/**************************************判断字符区域*开始********************************************/
int characters_exist=0; /*用来判断是否是纯数字*/
int countoffinal=0; /*finalresult
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
执行的次数*/
int word( char ch) /*判断是否为字母*/ {
int ch_exist=0;
if(isalpha(ch))
{
ch_exist=1;
characters_exist=1;
}
return(ch_exist);
}
int digit(char ch) /*判断是否为数字*/
{
int dig_exist=0;
if(isdigit(ch))
dig_exist=1;
return (dig_exist);
}
int delimiter(char ch) /*判断是否是分界符*/
{
int del_exist=0;
int i;
char delimiters[14]={'+','-','*','/',';','(',')','{','}','<','>','!','=',' '};
for(i=0;i<14;i++)
{
if(ch==delimiters[i])
{
del_exist=1;
break;
}
}
return(del_exist);
}
int keywordcompare(char key[],char keyword[]) /*比较关键字*/ {
int m=0;
int equal=1;
while(keyword[m]!='#')
{
if(key[m]==keyword[m]) m++;
else
{
equal=0;
break;
}
}
return(equal);
}
int keyword(char key[]) /*判断是否是关键字 */
{
char ifkeyword[3]={'i','f','#'};
char elsekeyword[5]={'e','l','s','e','#'};
char thenkeyword[5]={'t','h','e','n','#'};
char forkeyword[4]={'f','o','r','#'};
char whilekeyword[6]={'w','h','i','l','e','#'};
char dokeyword[3]={'d','o','#'};
char andkeyword[4]={'a','n','d','#'};
char notkeyword[4]={'n','o','t','#'};
char orkeyword[3]={'o','r','#'};
int keyword_exist=0;
if
(keywordcompare(key,ifkeyword)||keywordcompare(key,elsekeyword)||keywordcompare(key,then
keyword)||keywordcompare(key,forkeyword)||keywordcompare(key,whilekeyword)||keywordcom
pare(key,dokeyword)||keywordcompare(key,andkeyword)||keywordcompare(key,notkeyword)||key
wordcompare(key,orkeyword))
keyword_exist=1;
return(keyword_exist);
}
/**************************************判断字符区域*结束********************************************/
/**************************************写入文件区域*开始********************************************/
void writetofile(char cha[]) /*将数组cha[]写入文件Dualistic_formula*/
{
int i=0;
int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/
FILE * fpa;
if((fpa=fopen("Dualistic_formula","a"))==NULL)
{
printf("cannot open file Dualistic_formula\n");
exit(0);
}
while(cha[i]!='#'&&numberofspace<=1) /*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]==' ') numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
void keywordtofile(char cha[]) /*将关键字写入文件keyword*/
{
int i=0;
int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/
FILE * fpa;
if((fpa=fopen("keyword","a"))==NULL)
{
printf("cannot open file keyword\n");
exit(0);
}
while(cha[i]!='#'&&numberofspace<=1) /*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]==' ') numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
void wordstofile(char cha[]) /*将标识符写入文件words*/
{
int i=0;
int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/
FILE * fpa;
if((fpa=fopen("words","a"))==NULL)
{
printf("cannot open file words\n");
exit(0);
}
while(cha[i]!='#'&&numberofspace<=1) /*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]==' ') numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
void digittofile(char cha[]) /*将数字写入文件
digit*/
{
int i=0;
int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/
FILE * fpa;
if((fpa=fopen("digit","a"))==NULL)
{
printf("cannot open file digit\n");
exit(0);
}
while(cha[i]!='#'&&numberofspace<=1) /*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]==' ') numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
void singletofile(char cha[]) /*将单分界符写入文件single*/
{
int i=0;
int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/
FILE * fpa;
if((fpa=fopen("single","a"))==NULL)
{
printf("cannot open file single\n");
exit(0);
}
while(cha[i]!='#'&&numberofspace<=1) /*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]==' ') numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
void doubletofile(char cha[]) /*将双分界符写入文件double*/
{
int i=0;
int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/
FILE * fpa;
if((fpa=fopen("double","a"))==NULL)
{
printf("cannot open file double\n");
exit(0);
}
while(cha[i]!='#'&&numberofspace<=1) /*数组不结束且连续空格数最多为2时满足循环条件*/
{
if(cha[i]==' ') numberofspace++;
else
numberofspace=0;
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
void errortofile(char cha[]) /*将非法字符写入文件error*/
{
int i=0;
FILE * fpa;
if((fpa=fopen("error","a"))==NULL)
{
printf("cannot open file error\n");
exit(0);
}
while(cha[i]!='#')
{
fputc(cha[i],fpa);
i++;
}
fclose(fpa);
}
/**************************************写入文件区域*结束
********************************************/
/************************************显示及数组处理区域*结束
*****************************************/
void displayw(char ch,char cha[]) /*立即显示遇到的
字符*/
{
if(ch=='y'||ch=='Y')
{
int i=0;
while(cha[i]!='#')
{
printf("%c",cha[i]);
i++;
}
printf("\n");
}
}
void finalresult(int df,char filen[],FILE *fpp,FILE *fpt) /*显示统计信息并将二元
式写入文件Dualistic_formula*/
{
int i,j,k,n,mj,equ,spa;
char cha=' ';
char Dua_form[]="\n\n\n\n二元式:\n ";
char resultofsat[]="统计结果:\n ";
char memory[50][15];
char temp[15];
countoffinal++;
for(j=0;j<50;j++)
for(i=0;i<15;i++)
{
memory[j][i]=' ';
temp[i]=' ';
}
i=0;j=0;k=0;n=0;mj=0,spa=0;
rewind(fpp);
while(!feof(fpp))
{
cha=fgetc(fpp);
equ=0;
if(cha!=' '&&cha!=EOF)
{
temp[i]=cha;
i++;
spa=0;
}
else
if(i==0&&spa!=1)
{
cha=fgetc(fpp);
if(cha!=EOF)
{
temp[i]=cha;
i++;
}
else
break;
}
else
{
if((cha==' '||cha==EOF)&&spa!=1)
{
spa=1;
for(j=0;j<50;j++)
{
if(n==i&&memory[j-1][i+1]==' ')
{
equ=1;
break;
}
if(memory[j][0]==' ') break;
n=0;
for(k=0;k0)
{
if(countoffinal==0||countoffinal==7)
writetofile(Dua_form);
for(j=0;j<50;j++)
{
if(memory[j][0]==' ') break;
writetofile(filen);
writetofile(memory[j]);
}
}
}
void cleararray(int n,char cha[]) /*清空数组*/ {
int i;
for(i=0;i',':','#'};
char filen2[]={10,13,'W','o','r','d','-','>',':','#'};
char filen3[]={10,13,'D','i','g','i','t','-','>',':','#'};
char filen4[]={10,13,'S','i','n','g','l','e','W','o','r','d','-','>',':','#'};
char filen5[]={10,13,'D','o','u','b','l','e','W','o','r','d','-','>',':','#'};
char filen6[]={10,13,'E','R','R','O','R','-','>',':','#'};
/*相关变量*/
char ch; /*接受从文件
中读出的单个字符*/
int unknown=0; /*判断是否
出现无法识别的字符*/
int numofword=0; /*字母数组
中的字母个数*/
int numofdigit=0; /*数字数组中
的数字个数*/
int numofsingle=0; /*连续出现的
单分界符个数*/
int catchdoubleword=0; /*是否出现双
分界符*/
int enddelimit=10; /*末尾是否存
在分界符*/
int numofspace=0; /*限制遇到过
多的空格*/
char yorn=' '; /*是否单独显示
结果,接受输入的Y或N*/
char totalyorn=' '; /*是否统计显示
结果,接受输入的Y或N*/
fpw=fopen("Dualistic_formula","w"); /*存放二元式的
文件Dualistic_formula*/
fpkey=fopen("keyword","w+");
fpwords=fopen("words","w+");
fpdigit=fopen("digit","w+");
fpsinglew=fopen("single","w+");
fpdoublew=fopen("double","w+");
fperrorw=fopen("error","w+");
if((fpr=fopen("sourcecode.txt","r"))==NULL) /*打开存放待分析程序的文件sourcecode*/
{
printf("cannot open file\n");
exit(0);
}
printf("Print legal characters immediately when this program is reading them(Y/N).\n");
printf("If you entered a wrong word carelessly, you should carry on.\n");
printf("是否在程序读到合法字符时立即显示它们,(Y/N):");
scanf("%c",&yorn);
if(yorn!='y'&&yorn!='Y'&&yorn!='n'&&yorn!='N') printf("如果不小心输入出错,请继续输入:");
while(yorn!='y'&&yorn!='Y'&&yorn!='n'&&yorn!='N')
scanf("%c",&yorn);
while(!feof(fpr)) /*逐个读字符*/
{
ch=fgetc(fpr);
if(word(ch)||digit(ch)) /*遇到字母或数字*/
{
if(numofsingle==1&&catchdoubleword!=1) /*写入单分界符*/
{
singletofile(singleword); /*写入单分界符到文件single*/
if(yorn=='y'||yorn=='Y')
printf("SingleWord:");
displayw(yorn,singleword); /*遇到合法字符则立即显示*/
}
words[numofword]=ch;
numofword++;
enddelimit=0;
if(digit(ch)) /*遇到数字*/
{
number[numofdigit]=ch;
numofdigit++;
enddelimit=1;
}
cleararray(2,singleword); /*遇到标识符后,清空暂存分界符的数组*/
cleararray(3,doubleword);
numofsingle=0;
catchdoubleword=0;
}
else
if(delimiter(ch)) /*遇到分界符*/
{
enddelimit=2;
/*enddualist=2表示存在分界符*/
if(ch==' ') numofspace+=1; /*
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
连续出现的空格数量 */
else
numofspace=0;
if(unknown==0) /*判断标识符是否与无法识别的字符混杂一起*/
{
if(characters_exist==0&&number[0]!=' ')
{
digittofile(number); /*写入数字到文件digit*/
if(yorn=='y'||yorn=='Y')
printf("Digit:");
displayw(yorn,number); /*遇到合法字符则立即显示*/
}
else
if(word(words[0]))
{
if(keyword(words))
{
keywordtofile(words); /*写入关键字到文件keyword*/
if(yorn=='y'||yorn=='Y')
printf("KeyWord:");
displayw(yorn,words); /*遇到合法字符则立即显示*/
}
else
{
wordstofile(words); /*写入普通字符到文件words*/
if(yorn=='y'||yorn=='Y')
printf("Word:");
displayw(yorn,words); /*遇到合法字符则立即显示*/
}
}
}
cleararray(20,words); /*遇到分界符后,清空暂存其它字符的数组*/
cleararray(15,number);
numofword=0; /*遇到分界符后,其它类型的字符个数复位0*/
numofdigit=0;
characters_exist=0;
unknown=0;
if(numofspace<=1) /*遇到连续空格时,只处理第一个,其它跳过*/
{
singleword[numofsingle]=ch; /*暂时存放单分界符*/
doubleword[numofsingle]=ch;
numofsingle++;
if(numofsingle==2)
{
if((doubleword[0]=='>'||doubleword[0]=='<'||doubleword[0]=='!'||doubleword[0]=='=')&&double
word[1]=='=') /*判断是否满足双分界符*/
{
doubletofile(doubleword);
if(yorn=='y'||yorn=='Y')
printf("DoubleWord:");
displayw(yorn,doubleword);
doubleword[0]=doubleword[1];
numofsingle=1; /*仍然需要
判断两者中的后一个是否在将来可以满足双分界符*/
catchdoubleword=1; /*成功分析到一个双分界符*/
}
else
if(catchdoubleword!=1) /*当前字符的前两个字符不满足双分界符*/
{
char singlesecond=singleword[1];
singleword[1]=' ';
singletofile(singleword); /*写入单分界符到文件single*/
if(yorn=='y'||yorn=='Y')
printf("SingleWord:");
displayw(yorn,singleword); /*遇到合法字符则立即显示*/
singleword[0]=singlesecond;
doubleword[0]=doubleword[1];
numofsingle=1; /*两者中的后一个是否在将来可以满足双分界符*/
}
else
if(catchdoubleword==1) /*当前字符的前两个字符满足双分界符*/
{
doubleword[0]=doubleword[1];
singleword[0]=singleword[1];
singleword[1]=' ';
numofsingle=1;
catchdoubleword=0;
}
}
}
}
else
{
unknown+=1;
error[0]=ch;
errortofile(error); /*写入无法识别的字符到文件error*/
if(numofsingle==1&&catchdoubleword!=1) /*写入单分界符到文件single*/
{
singletofile(singleword);
if(yorn=='y'||yorn=='Y')
printf("SingleWord:");
displayw(yorn,singleword); /*遇到合法字符则立即显示*/
}
numofsingle=0;
catchdoubleword=0;
cleararray(2,singleword); /*清空暂时存放字符的数组*/
cleararray(3,doubleword);
}
}
/*while循环语句结束*/
if(enddelimit!=2&&unknown==1) /*末尾无分界符时,记录标识符;文件结束符是不可识别的,故这里unknown==1*/
{
if(word(words[0]))
{
if(keyword(words))
{
keywordtofile(words); /*写入关键字到文件keyword*/
if(yorn=='y'||yorn=='Y')
printf("KeyWord:");
displayw(yorn,words); /*遇到合法字符则立即显示*/
}
else
{
wordstofile(words); /*写入普通标识符到文件words*/
if(yorn=='y'||yorn=='Y')
printf("Word:");
displayw(yorn,words); /*遇到合法字符则立即显示*/
}
}
else
{
digittofile(number); /*写入数字到文件digit*/
if(yorn=='y'||yorn=='Y')
printf("Digit:");
displayw(yorn,number); /*遇到合法字符则立即显示*/
}
}
printf("\n词法分析完毕...\n");
printf("\n");
printf("统计结果如下:");
printf("\n");
/*显示结果及二元式的写入*/
printf("\nKeyWord:");
finalresult(0,filen1,fpkey,fpr);
printf("\nWord:");
finalresult(0,filen2,fpwords,fpr);
printf("\nDigit:");
finalresult(0,filen3,fpdigit,fpr);
printf("\nSingleWord:");
finalresult(0,filen4,fpsinglew,fpr);
printf("\nDoubleWord:");
finalresult(0,filen5,fpdoublew,fpr);
printf("\nERROR:");
finalresult(0,filen6,fperrorw,fpr);
printf("\n");
finalresult(1,filen1,fpkey,fpr);
finalresult(1,filen2,fpwords,fpr);
finalresult(1,filen3,fpdigit,fpr);
finalresult(1,filen4,fpsinglew,fpr);
finalresult(1,filen5,fpdoublew,fpr);
finalresult(1,filen6,fperrorw,fpr);
printf("\n程序结束~\n");
printf("\n二元式已经写入文件Dualistic_formula\n");
printf("\n");
fclose(fpr);
fclose(fpw);
fclose(fpkey);
fclose(fpwords);
fclose(fpdigit);
fclose(fpsinglew);
fclose(fpdoublew);
fclose(fperrorw);
}
/**************************************主函数区域**结束********************************************/
本文档为【词法分析器源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。