📄 词法分析程序.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXKEYWORD 9 //关键字数
char scanin[50],scanout[50];
FILE *fin,*fout;
char buffer[500]; //缓冲区
void test(void);
int error=0; //错误标志,0表示无错误,非0表示有错误
typedef enum{ //单词种别
ENDFILE=1,ERROR,ID,NUM,
IF=11,THEN,ELSE,BEGIN,END,DO,WHILE,
READ,WRITE,INT,REAL,
ADD=31,SUB,MUL,DIV,
AND=41,OR,NOT,
EQ=51,LT,GT,LE,GE,NE,
ASSIGN=61,
SEMI=71,LPAR,RPAR,DOT,COMMA,LLPAR,RLPAR
}TokenType;
struct{ //关键字表
char *str;
TokenType tok;
}keywords[MAXKEYWORD]={
{"if",IF},
{"then",THEN},
{"else",ELSE},
{"do",DO},
{"while",WHILE},
{"read",READ},
{"write",WRITE},
{"int",INT},
{"real",REAL}
};
void TESTscan()
{
char c;
int i;
printf("请输入源程序文件名(包括路径):");
scanf("%s",scanin);
printf("请输入词法分析输出文件名(包括路径):");
scanf("%s",scanout);
if((fin=fopen(scanin,"r"))==NULL)
{
printf("\n打开词法分析输入文件出错!\n");
}
if((fout=fopen(scanout,"w"))==NULL)
{
printf("\n创建词法分析输出文件出错!\n");
}
for(i=0;i<500;i++) //将文件拷贝到缓冲区
{
c=getc(fin);
if(c!=EOF)
buffer[i]=c;
else
break;
}
test(); //调用词法分析函数
}
void test(void)
{
int i=0,j,n,es=0,line=1;
char ch='a',token[40];
while(ch!='\0')
{
ch=buffer[i++];
if(ch=='\n')
line=line+1;
while(ch==' '||ch=='\n'||ch=='\t')
ch=buffer[i++];
if(ch=='\0')
return;
else if(isalpha(ch)) //判断字符ch是否为英文字母
{
token[0]=ch;
j=1;
ch=buffer[i++];
while(isalnum(ch))//判断字符ch是否为字母或数字
{
token[j++]=ch;
ch=buffer[i++];
}
i--;
token[j]='\0';
n=0;
while((n<MAXKEYWORD) && strcmp(token,keywords[n].str))
n++;
if(n>=MAXKEYWORD)
fprintf(fout,"%d\t%s\n",ID,token);
else
fprintf(fout,"%d\t%s\n",keywords[n].tok,token);
}
else if(isdigit(ch))//判断字符ch是否为数字
{
token[0]=ch;
j=1;
ch=buffer[i++];
while(isdigit(ch))
{
token[j++]=ch;
ch=buffer[i++];
}
token[j]='\0';
fprintf(fout,"%d\t%s\n",NUM,token);
}
else if(ch=='/') //消去注释
{
ch=buffer[i++];
if(ch=='*')
{
char ch1;
ch1=buffer[i++];
do
{
ch=ch1;
ch1=buffer[i++];
}while((ch!='*' || ch1!='/')&&ch1!='\0');
ch=buffer[i++];
}
else if(ch=='/')
{
do
{
ch=buffer[i++];
}while(ch!='\n');
}
else
{
token[0]='/'; token[1]='\0';
fprintf(fout,"%d\t%s\n",DIV,token);
}
}
else
{
switch(ch)//符号判断
{
case '+':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",ADD,token);break;
case '-':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",SUB,token);break;
case '*':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",MUL,token);break;
case '&':token[0]=ch;ch=buffer[i++];
if(ch=='&')
{
token[1]=ch;
token[2]='\0';
fprintf(fout,"%d\t%s\n",AND,token);
}
else
{
token[1]='\0';
fprintf(fout,"%d\t%s\tNO.%d line error\n",ERROR,token,line);
error=2;
}break;
case '|':token[0]=ch;ch=buffer[i++];
if(ch=='|')
{
token[1]=ch;
token[2]='\0';
fprintf(fout,"%d\t%s\n",OR,token);
}
else
{
token[1]='\0';
fprintf(fout,"%d\t%s\tNO.%d line error\n",ERROR,token,line);
error=3;
}break;
case '!':token[0]=ch;ch=buffer[i++];
if(ch=='=')
{
token[1]=ch;
token[2]='\0';
fprintf(fout,"%d\t%s\n",NE,token);
}
else
{
fprintf(fout,"%d\t%s\n",NOT,token);
}break;
case '=':token[0]=ch;ch=buffer[i++];
if(ch=='=')
{
token[1]=ch;
token[2]='\0';
fprintf(fout,"%d\t%s\n",EQ,token);
}
else
{
fprintf(fout,"%d\t%s\n",ASSIGN,token);
}break;
case '<':token[0]=ch;ch=buffer[i++];
if(ch=='=')
{
token[1]=ch;
token[2]='\0';
fprintf(fout,"%d\t%s\n",LE,token);
}
else
{
fprintf(fout,"%d\t%s\n",LT,token);
}break;
case '>':token[0]=ch;ch=buffer[i++];
if(ch=='=')
{
token[1]=ch;
token[2]='\0';
fprintf(fout,"%d\t%s\n",GE,token);
}
else
{
fprintf(fout,"%d\t%s\n",GT,token);
}break;
case ';':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",SEMI,token);break;
case '(':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",LPAR,token);break;
case ')':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",RPAR,token);break;
case '.':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",DOT,token);break;
case ',':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",COMMA,token);break;
case '{':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",LLPAR,token);break;
case '}':token[0]=ch;token[1]='\0';
fprintf(fout,"%d\t%s\n",RLPAR,token);break;
default:token[0]=ch;token[1]='\0';
error=1;
fprintf(fout,"%d\t%s\n",ERROR,token);
}
}
}
fclose(fin);
fclose(fout);
}
void main()
{
int es=0;
TESTscan();
if (error>0) printf("词法分析有错!\n");
else printf("词法分析成功!\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -