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

📄 1.cpp

📁 词法分析,里面有一个bug,")"后面不能跟其他符号,但是这个更像是自己作的,程序很简单,我自己做了大修改,加了很多注释
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>

#define NULL 0

char *keyWords[21]={"and","begin","const","div","do","else",
                    "end","function","if","integer","not","or",
					"procedure","program","read","real","then",
					"type","var","while","write"};  //保留字

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

char *operatorChs[6]={"++","--","+","-","*","/"};   //运算符

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




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<=20;++i)
			{
			 if(strcmp(keyWords[i],searchStr)==0)
				{number=i;
				 return(true);}
			}
		 break;
		} //保留字编号
 case 2:{    
		 for(i=0;i<=8;i++)
			{
			 if(strcmp(interpunction[i],searchStr)==0)
				{number=i+23;
			     return(true);}
			}
		 break;
		} //标点符编号
 case 3: {
		  for(i=0;i<=5;i++)
			 {
			  if(strcmp(operatorChs[i],searchStr)==0)
				 {number=i+32;
				  return(true);}
			}
		  break;
		 } //运算符编号
 case 4: {
		  for(i=0;i<=9;i++)
			{
			 if(strcmp(comparison[i],searchStr)==0)
				{number=i+38;
				 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("(21,%d)   %s\n",stringRecode[str_count].idAddr,stringRecode[str_count].idName);//标志符编号为21
     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("(22,%s)   %s\n",num,num); //无符号整数编号为22
 u: return(ch);
}


char otherProcess(char ch)  //其它字符处理函数
{
 int i=-1;
 int j=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);
	other[i+1]='\0';}
 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 + -