⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 词法分析程序.cpp

📁 词法分析程序
💻 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 + -