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

📄 词法分析1.cpp

📁 本程序用C语言编写
💻 CPP
字号:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <process.h>

//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。
//如果想增加保留字,可继续添加,并修改保留字数目
#define keywordSum  13
char *keyword[keywordSum]={ "begin","if","end","else","then","for","while","to","do","and","not","or","write"};
//下面定义纯单分界符,如需要可添加
char singleword[50]="+-*()[]{};,:=";
//下面定义双分界符的首字符
char doubleword[10]="><!";
char Scanin[300], Scanout[300]; //用于接收输入输出文件名
FILE *fin,*fout; //用于指向输入输出文件的指针
void TESTscan()//词法分析函数
{
   
   char ch=' ',token[40]; //ch为每次读入的字符,token用于保存识别出的单词
   int j,n; //j,n为临时变量,控制组合单词时的下标等
   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");
     
   }
   fprintf(fout,"%c本程序规定:\n");
   fprintf(fout,"%c输出用KeyWord代表关键字\n");
   fprintf(fout,"%c输出用Word代表普通标识符\n");
   fprintf(fout,"%c输出用Digit代表阿拉伯数字\n");
   fprintf(fout,"%c输出用SingleWord代表单分界符\n");
   fprintf(fout,"%c输出用DoubleWord代表双分界符\n");
   fprintf(fout,"%c输出用ERROR代表无法识别的字符\n");
   ch=getc(fin);
   while(ch!=EOF)
   {
      
	  while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);
	  if (ch==EOF) break;
      if (isalpha(ch))   //如果是字母,则进行标识符处理
      {
		 token[0]=ch; j=1;
		 ch=getc(fin);
		 while(isalnum(ch))  //如果是字母数字则组合标识符;如果不是则标识符组合结束
		 {
			token[j++]=ch;  //组合的标识符保存在token中
			ch=getc(fin);  //读下一个字符
		 }
	
		 token[j]='\0';  //标识符组合结束	 
		 
		 //查保留字
		 n=0;
		 while ((n<keywordSum) && strcmp(token,keyword[n])) n++;
		 if (n>=keywordSum)  //不是保留字,输出标识符
			fprintf(fout,"%s\t\t\t%s\n","Word",token);  //输出标识符符号
		else//是保留字,输出保留字
			fprintf(fout,"%s\t\t\t%s\n","KeyWord",token);  //输出保留字符号
	  } else if (isdigit(ch))//数字处理
      {
		 token[0]=ch; j=1;
		 ch=getc(fin);  //读下一个字符
		 while (isdigit(ch))  //如果是数字则组合整数;如果不是则整数组合结束
		 {
			token[j++]=ch;  //组合整数保存在token中
			ch=getc(fin);  //读下一个字符
		 }
		 
		 token[j]='\0';  //整数组合结束		 
		 fprintf(fout,"%s\t\t\t%s\n","Digit",token);  //输出整数符号
      } else if (strchr(singleword,ch)>0)  //单分符处理
      {
		 token[0]=ch; token[1]='\0';
		 ch=getc(fin);//读下一个符号以便识别下一个单词
		 fprintf(fout,"%s\t\t%s\n","SingleWord",token);  //输出单分界符符号
      }else if (strchr(doubleword,ch)>0)  //双分界符处理
      {
		 token[0]=ch;
		 ch=getc(fin);  //读下一个字符判断是否为双分界符
		 if (ch=='=')  //如果是=,组合双分界符
		 {
			token[1]=ch;token[2]='\0';  //组合双分界符结束
		   	ch=getc(fin);  //读下一个符号以便识别下一个单词
		 } else//不是=则为单分界符
			token[1]='\0';
		 fprintf(fout,"%s\t\t%s\n","DoubleWord",token);  //输出单或双分界符符号
      } else if (ch=='/')  //注释处理
      {
		 ch=getc(fin);  //读下一个字符
		 if (ch=='*')  //如果是*,则开始处理注释
		 {  char ch1;
			ch1=getc(fin);  //读下一个字符
			do
			{  ch=ch1;ch1=getc(fin);}  //删除注释
			while ((ch!='*' || ch1!='/')&&ch1!=EOF);  //直到遇到注释结束符*/或文件尾
			ch=getc(fin);//读下一个符号以便识别下一个单词
		 } 
		 else if (ch=='/')  //如果是/,则开始处理注释
		 {  char ch1;
			ch1=getc(fin);  //读下一个字符
			do
			{  ch=ch1;ch1=getc(fin);}  //删除注释
			while ((ch!='\n'));            //直到本行注释结束
			fseek(fin,-1L,SEEK_CUR);   /*输入指针回退一个字符*/
			ch=getc(fin);//读下一个符号以便识别下一个单词
		 } 
		 else  //不是*则处理单分界符/
		 {
			 token[0]='/'; token[1]='\0';
			 fprintf(fout,"%s\t\t%s\n","SingleWord",token);  //输出单分界符/
		 }
	} else//错误处理
	  {
		 token[0]=ch;token[1]='\0';
		 ch=getc(fin);  //读下一个符号以便识别下一个单词
		 
		 fprintf(fout,"%s\t\t\t%s\n","ERROR",token);  //输出错误符号
      }
   }
   fclose(fin);//关闭输入输出文件
   fclose(fout);
  
}

//主程序
void main()
{
	

	TESTscan();//调词法分析
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -