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

📄 1926112.cpp

📁 PL/0词法分析,说明文档流程图尚未完成,
💻 CPP
字号:
//班级:计科61
//学号:1926112
//姓名:匡经霞
//////////////////////////////////////////
#include<string.h>
#include<ctype.h>
#include<stdio.h>

#define  MAX 18   //分析表的最大容量
#define  MAXBUF 255
char  ch;       // 存放读入当前的输入字符
int linenum=1;   //存放当前行号

struct reserve   //关键字结构体
{
 char lexptr[MAXBUF]; //关键字
 int token;  //标号
};

struct reserve symtable[MAX]; //关键字结构体变量
char * str[]={"program","input","output","begin","end","var","integer","real","for","to","if","then","else","do","while","write","array","proceure" };


////////////////////////////////////////////////////////////////////////////////////////////////

void init()     //对符号表进行初始化 ,第一个关键字标号为3,依次递增到第十八个关键字标号20
{
 for( int j=0; j<MAX; j++)
 { 
  strcpy(symtable[j].lexptr,str[j]);
  symtable[j].token=j+3;
 }
}
 
////////////////////////////////////////////////////////////////////////////////////////////

int judge(char *temp) //判断 temp 变量是否为关键字,若是则返回关键字相应标号,否则返回0;
{
 for(int i=0; i<MAX; i++){
  if(!strcmp(symtable[i].lexptr ,temp))  
  {
   return  symtable[i].token;
  }
 }
 return 0;
}     
//////////////////////////////////////////////////////////////////////////////////////////////

void getsym(FILE *fp)    //词法分析程序
{
 char arr[MAXBUF]; //用于存放当前读入的数值串或字符串;
 int i=0;
 int j=0;
 
 while((ch=fgetc(fp))!=EOF) //读入一个字符判断,空格、字母、数字、界符
 {

	 //////开始判断
  if(ch==' '||ch=='\t')
  {
  
  }
  else if(ch=='\n')    //如果是换行符,则行号加1
  {  
   linenum++;
  }
  ///////////////////////////////////////////////////////////////////////////数字串开头字分析
  else if(isdigit(ch))   //如果是数字开头                                 ///
  {                                                                        //
  int err=0;   //判断是否有错                                              //
	                                                                       //
   while(isdigit(ch)||isalpha(ch)) //判断和读取数字                        //
   {                                                                       //
    if(isalpha(ch)) err++;                                                 //
    arr[j]=ch;                                                             //
    j++;                                                                   //
    ch=fgetc(fp);                                                          //
   }                                                                       //
      arr[j]='\0';                                                         //
      j=0;                                                                 //
                                                                           //
     if(err)                                                               //
	 {printf("%s\t\t错误的标识符!!!\t所在行数:%d\n",arr,linenum);}         //
      else                                                                 //
	  { printf("%s\t%d\t数字\n",arr,2) ;}                                        //

  fseek(fp,-1L,SEEK_CUR);  //使文件字符指针指向当前的前一个字符,避免数字串结束时后接的一个字符被屏蔽
  }
  ///////////////////////////////////////////////////字符串开头分析
  else if (isalpha(ch))  //如果是字母
  {
   while(isalpha(ch)||isdigit(ch))
   {
    arr[j]=ch;
    j++;
    ch=fgetc(fp);
   }
   arr[j]='\0';
   j=0;
   if (judge(arr)) //如果是关键字
   {
    printf("%s\t%d\t关键字\n",arr,judge(arr));
   }
   else  
   {printf("%s\t%d\t普通标志符\n",arr,1); }//普通标志符
   fseek(fp,-1L,SEEK_CUR);//使文件字符指针指向当前的前一个字符,避免字符串结束时后接的一个字符被屏蔽
   }
   /////////////////////////////////////////////////////界符分析
  else if(ch==':')  
  {
   ch=fgetc(fp);
   if(ch=='=') 
   {
    printf("%s\t%d\t运算符\n",":=",29);    //如果是 :=
   }
   else
   {
    printf("%s\t%d\t运算符\n",":",30);   //如果是 :
    fseek(fp,-1L,SEEK_CUR);
   }
  }
  else if (ch=='>')
  {
   ch=fgetc(fp);
   if(ch=='=')    //如果是 >=
   {
    printf("%s\t%d\t运算符\n",">=",32);
   }
   else
   {
    printf("%s\t%d\t运算符\n",">",31);  //如果是 >
    fseek(fp,-1L,SEEK_CUR);
   }
  }
  else if(ch=='<')
  { 
   ch=fgetc(fp);
   if(ch=='>')
   {
    printf("%s\t%d\n","<>",35);  // 如果是 <>
   }
   else if(ch=='=')
   {
    printf("%s\t%d\t运算符\n","<=",34);   //如果是 <=
   }
   else 
   {
    printf("%s\t%d\t运算符\n","<",33);   //如果是 <
    fseek(fp,-1L,SEEK_CUR);
   }
  }
  else if(ch=='/')
  { 
   ch=fgetc(fp);
   if(ch=='*')
   {
    ch=fgetc(fp);
s:
    while(ch!='*')
    {
     ch=fgetc(fp);
    }
    while(ch=='*')
    {
     ch=fgetc(fp);
     while(ch!='/')
     {
      goto s;   //如果是注释 /*  */
     }
    }
   }
   else if(ch=='/')
   {
    ch=fgetc(fp);
    while(ch!='\n')
    {
     ch=fgetc(fp);   //如果是注释 //
    }
   }
   else 
   {  
    printf("%s\t%d\t运算符\n","/",24); 
    fseek(fp,-1L,SEEK_CUR);   //  如果不是"/"或"*",则重新指向"/"
   }
  }
  else if(ch=='+')
  {
   printf("%s\t%d\t运算符\n","+",21);
  }
  else if(ch=='-')
  {
   printf("%s\t%d\t运算符\n","-",22);
  }
  else if(ch=='*')
  {
   printf("%s\t%d\t运算符\n","*",23);
  }
  else if(ch=='(')
  {
   printf("%s\t%d\t界符\n","(",25);
  }
  else if(ch==')')
  {
   printf("%s\t%d\t界符\n",")",26);
  }
  else if(ch=='[')
  {
   printf("%s\t%d\t界符\n","[",27);
  }
  else if(ch==']')
  {
   printf("%s\t%d\t界符\n","]",28);
  }
  else if(ch=='.')
  {
   printf("%s\t%d\t界符\n",".",39);
  }
  else if(ch==';')
  {
  printf("%s\t%d\t界符\n",";",36);
  }
  else if(ch=='=')
  {
   printf ("%s\t%d\t运算符\n","=",38);
  }
  else if(ch==',')
  {
   printf("%s\t%d\t界符\n",",",40);
     }
   else if(ch==39) //判断是否是单引号
  {
   printf ("%s\t%d\t界符\n","'",41);                      
  }
  else printf("%c\t\t无法识别的字符\t所在行数:%d \n",ch,linenum)  ;
   }
} 

//////////////////////////////主函数/////////////////////////////////////////////////////////
void main()
{
 printf("***************************词法分析器*************************\n\n\n");

 
 char filenamein[40];
 printf("请输入源文件名:\n");
 scanf("%s",filenamein);
 FILE* fp;
	 fp=fopen(filenamein,"r");
	 if(fp==NULL) {printf("无法找到 %s\n" ,filenamein);return;}  
       init();     //关键字初始化
      getsym(fp);    //词法分析
	  fclose(fp);
}

⌨️ 快捷键说明

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