#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define LEN 180
int syn,p,m,n;
char token[10],ch;
char *keyword[32]={"double","int","struct","break","else","long","switch","case",
"enum","register","typedef","char","extern","return","union","const","float","short",
"unsigned","continue","for","signed","void","default","goto","sizeof","volatile",
"do","auto","while","static","if"};
struct wordline//定义结构体
{
char word[10];
int line;
struct wordline *next;
};
struct wordline *creat(struct wordline *head,char token[10],int numofLine)//建立链表
{
struct wordline *p1;
p1=(struct wordline*)malloc(sizeof(struct wordline));
head->next=p1;
strcpy(p1->word,token);
p1->line=numofLine;
p1->next=NULL;
return (p1);
}
Pickword(char str[LEN])
{
for (m=0;m<10;m++)token[m++]='/0';
ch=str[p++];
m=0;
while((ch==' ')||(ch=='/n')||(ch=='/t'))ch=str[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))||(ch=='_')||(ch=='.'))
{
token[m++]=ch;
ch=str[p++];
}
p--;
syn=33;
for(n=0;n<32;n++)
if(strcmp(token,keyword[n])==0)
{
syn=n+1;
break;
}
}
else if ((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
token[m++]=ch;
ch=str[p++];
}
p--;
syn=34;
}
else switch (ch)
{
case'+':token[m++]=ch;
ch=str[p++];
if (ch=='+')
{
syn=36;
token[m++]=ch;
}
else
{
syn=35;
p--;
}
break;
case '-':token[m++]=ch;
ch=str[p++];
if(ch=='-')
{
syn=38;
token[m++]=ch;
}
else
{
syn=37;
p--;
}
break;
case ':':token[m++]=ch;
ch=str[p++];
if(ch=='=')
{
syn=44;
token[m++]=ch;
}
else
{
syn=43;
p--;
}
break;
case '<':token[m++]=ch;
ch=str[p++];
if(ch=='>')
{
syn=46;
token[m++]=ch;
}
else if (ch=='=')
{
syn=47;
token[m++]=ch;
}
else
{
syn=45;
p--;
}
break;
case '>':token[m++]=ch;
ch=str[p++];
if(ch=='=')
{
syn=49;
token[m++]=ch;
}
else
{
syn=48;
p--;
}
break;
case '*':token[m++]=ch;
ch=str[p++];
if(ch=='/')
{
syn=40;
token[m++]=ch;
}
else
{
syn=39;
p--;
}
break;
case '/':token[m++]=ch;
ch=str[p++];
if(ch=='*')
{
syn=42;
token[m++]=ch;
}
else
{
syn=41;
p--;
}
break;
case '=':token[m++]=ch;
ch=str[p++];
if(ch=='=')
{
syn=51;
token[m++]=ch;
}
else{
syn=50;
p--;
}
break;
case '!':token[m++]=ch;
ch=str[p++];
if(ch=='=')
{
syn=59;
token[m++]=ch;
}
else
{
syn=58;
p--;
}
break;
case ';':token[m++]=ch;
syn=52;
break;
case '(':token[m++]=ch;
syn=53;
break;
case ')':token[m++]=ch;
syn=54;
break;
case '{':token[m++]=ch;
syn=55;
break;
case '}':token[m++]=ch;
syn=56;
break;
case '#':token[m++]=ch;
syn=57;
break;
case '&':token[m++]=ch;
ch=str[p++];
if(ch=='&&')
{
syn=61;
token[m++]=ch;
}
else
{
syn=60;
p--;
}
break;
case '%':token[m++]=ch;
syn=62;
break;
case '[':token[m++]=ch;
syn=63;
break;
case ']':token[m++]=ch;
syn=64;
break;
case '|':token[m++]=ch;
ch=str[p++];
if(ch=='|')
{
syn=66;
token[m++]=ch;
}
else
{
syn=65;
p--;
}
break;
case '"':token[m++]=ch;
syn=67;
break;
case ',':token[m++]=ch;
syn=68;
break;
default :
if(ch=='/0')
{
syn=0;
}
else
{
token[m++]=ch;
syn=-1;
}
break;
}
token[m++]='/0';
}
main(){
char chr[10],chr1;
FILE *fp,*fw; char filename[80],str[LEN],fileget[80];
int numofLine=0;
struct wordline *head,*end;
system("color 1E");
printf("*******************************欢迎使用此软件*********************************/n/n/n/n");
printf("★★★★★★★★★★★★★★★此软件为C语言词法分析器★★★★★★★★★★★★★/n");
printf("其功能为:从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。同时输出各单词所在的行号,且具有保存输出内容的功能。/n/n/n/n/n");
printf("是否开始读入源程序?/n""请按“1”开始输入或按其他键退出!!/n");
chr1=getchar();
if(chr1=='1')
system("CLS");
else
exit(1);
l1: printf("请输入源文件所在路径/n");
numofLine=0;
scanf("%s",filename);
if ((fp=fopen(filename,"r"))==NULL)
{
printf("打开文件失败!!/n""请按“1”重新输入或按其他键退出!!/n");
getchar();
chr1=getchar();
if(chr1=='1') goto l1;
else
exit(1);
}
system("CLS");
while(!feof(fp))
{
fgets(str,LEN,fp);
numofLine++;
printf("line%-8d%s",numofLine,str);
}
printf("/n");
fclose(fp);
getchar();
printf("是否打印各行信息??/n""是请按“1”继续,按“2”清屏重新读取其他源文件,按其他键退出/n");
chr1=getchar();
if (chr1=='2'){
system("CLS");
goto l1;
}
else if (chr1!='1') exit(1);
fp=fopen(filename,"r");
numofLine=0;
printf("( word line)/n");
head=end=(struct wordline*)malloc(sizeof(struct wordline));
while(!feof(fp))
{
p=0;
fgets(str,LEN,fp);
numofLine++;
do{
Pickword(str);
if(syn==0) break;
switch(syn)
{
case -1:
break;
default: printf("( %-10s%5d )/n",token,numofLine);
end=creat(end,token,numofLine);
break;
}
}while(1);
}
fclose(fp);
printf("是否将输入内容保存/n""是按“1”继续,按“2”清屏重新读取其他源文件,按其他键退出/n");
getchar();
chr1=getchar();
if (chr1=='2')
{
system("CLS");
goto l1;
}
else if (chr1!='1') exit(1);
l2: printf("请输入保存的文件名/n");
scanf("%s",fileget);
if ((fw=fopen(fileget,"at+"))==NULL)
{
printf("无法打开%s/n",fileget);
printf("是否重新输入?/n""是按“1”,否按其他键退出/n");
getchar();
chr1=getchar();
if (chr1=='1')
goto l2;
else
exit(1);
}
head=head->next;
while(head!=NULL)
{
itoa(head->line, chr, 10);
fputs(head->word,fw);
fputs(" line=",fw);
fputs(chr,fw);
fputs("/n",fw);
head=head->next;
}
fclose(fw);
printf("保存完毕是否清屏继续操作/n""是按“1”继续,否按其他键退出/n");
getchar();
chr1=getchar();
if(chr1=='1')
{
system("CLS");
goto l1;
}
else
exit(1);
}