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

📄 1.cpp

📁 自己编的词法分析程序,含有实验报告,有详细的数据结构和程序流程说明。
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>

#define NULL 0

char *keyWords[13]={"program","var","procedure","begin","end","if",
                    "then","else","while","do","call","integer","real"};  //保留字

char *operatorChs[7]={"+","-","*","/","~","∧","∨"};   //运算符

char *comparison[6]={"<","<=",">",">=","=","<>"};   //比较符 

char *interpunction[7]={":=",";",".",",","(",")",":"};  //标点符 


FILE *fp;
char ch;
int number;
int max=0;
int str_count=0;
int error_count=0;


struct Recode
{
 char idName[8];
 int idAddr;
}stringRecode[50];     //定义标识符结构体


bool search(char searchStr[],int wordType)
{
 int i;
 switch(wordType)
 {
 case 1:{
	     for(i=0;i<=12;++i)
			{
			 if(strcmp(keyWords[i],searchStr)==0)
				{number=i+3;
				 return(true);}
			}
		 break;
		}
 case 2:{
		 for(i=0;i<=6;i++)
			{
			 if(strcmp(operatorChs[i],searchStr)==0)
				{number=i+16;
			     return(true);}
			}
		 break;
		}
 case 3: {
		  for(i=0;i<=5;i++)
			 {
			  if(strcmp(comparison[i],searchStr)==0)
				 {number=i+23;
				  return(true);}
			}
		  break;
		 }
 case 4: {
		  for(i=0;i<=6;i++)
			{
			 if(strcmp(interpunction[i],searchStr)==0)
				{number=i+29;
				 return(true);}
			}
		  break;
		 }
 }
 return(false);
}


char letterProcess(char ch)  //字母处理函数
{
 int i=-1;
 char letter[20];
 while(isalnum(ch)!=0)
	{
     letter[++i]=ch;
	 ch=fgetc(fp);
	}
 letter[i+1]='\0';  //添加字符串结束符
 if(search(letter,1))
	printf("(%d,0)%s\n",number,letter);
 else
	{
     if(i>7)
		{printf("**error**\n",error_count);
	     printf("标识符长度溢出!\n");}
	 else
	 {
	 int j; 
	 bool flag=false;
      for(j=0;j<str_count;++j)
		{
	     if(strcmp(stringRecode[j].idName,letter)==0)
			{
		     stringRecode[str_count].idAddr=stringRecode[j].idAddr;
			 flag=true;
			 break;
			}
		 }
	  if(flag==false)
           stringRecode[str_count].idAddr=max+1;
     strcpy(stringRecode[str_count].idName,letter);
	 printf("(1,%d)%s\n",stringRecode[str_count].idAddr,stringRecode[str_count].idName);
     if(stringRecode[str_count].idAddr>max)
		  max=stringRecode[str_count].idAddr;
	 ++str_count;
	 }
	 }
 return ch;
}


char numberProcess(char ch)  //数字处理函数 
{
 int i=-1;
 char num[20];
 while (isdigit(ch)!=0)
 {
  num[++i]=ch;
  ch=fgetc(fp);
 }
 if(isalpha(ch)!=0)         //出错判断
 {
  ++error_count;
  while(isspace(ch)==0)
  {
   num[++i]=ch;
   ch=fgetc(fp);
  }
  num[i+1]='\0';
  printf("**error**\n",error_count);
  printf("标识符不能以数字开头!\n");
  goto u;
 }      
 num[i+1]='\0';
 printf("(2,%s)%s\n",num,num);
 u: return(ch);
}


char otherProcess(char ch)  //其它字符处理函数
{
 int i=-1;
 char other[20];
 if (isspace(ch)!=0)
 {
  ch=fgetc(fp);
  goto u;
 }
 while ((isspace(ch)==0)&&(isalnum(ch)==0))
 {
  other[++i]=ch;
  ch=fgetc(fp);
 }
 other[i+1]='\0';
 if(search(other,2))
	printf("(%d,0)%s\n",number,other);
 else
	{
	 if(search(other,3))
	   printf("(%d,0)%s\n",number,other);
     else
		{
		 if(search(other,4))
			printf("(%d,0)%s\n",number,other);
		 else
			{
			 ++error_count;
			 printf("**error**\n",error_count);
			 printf("未定义符号!\n");}
		}
	}
u: return (ch);
}

int main()
{
 char str,c;
 char filename[20];
 printf("请输入文件名:\n");
 scanf("%s",filename);
 printf("*********************************\n");
 if((fp=fopen(filename,"r"))==NULL)
    printf("*********无法打开源程序!*********\n");
 else
	{
     printf("             词法分析            \n");
	 printf("*********************************\n");
	 str=fgetc(fp);
	 while(str!=EOF)
		{
	     if(isalpha(str)!=0)
			 str=letterProcess(str);
		 else
			{
		     if(isdigit(str)!=0)
				 str=numberProcess(str);
			 else
				 str=otherProcess(str);
			}
		}
 fclose(fp);
 printf(" ********按任意键退出*********\n");
 c=getch();
	}
 
 return 0;
}

⌨️ 快捷键说明

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