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

📄 pl.cpp

📁 c语言实现的PL/0词法分析器
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define START -1//定义数组下表从0开始
#define MAXSIZE 20//PL/0 最大的字符串,保留字等 

FILE *fp;//pascal源程序文件 
FILE *fp1 = fopen("PL词法分析结果.txt","w");//把词法分析结果写到文件" PL分析结果.txt"中

char *keyWord[] = { "const","do","begin","end","call","if","else","then","procedure","read","write","var","while","odd"};//pascal基本字
char *Operators[] = {"+","-","*","/"};//pascal运算符
char *compareOperators[] = {"<","<=","=",">",">=","<>"};//pascal比较符
char *endOperators[] = { "," , ":" , ";" , ":=" , "." , "(" , ")" , "'" };//pascal界符

/////////////////////////////////////////////////////////////////////////////////////////
//函数名:Compare 
//参数:char SearchStr[],int type
//功能: 分析源程序中处理过后的字符串,按照基本字,运算符,比较符,界符进行分析
//返回值: true / false
bool Compare(char SearchStr[],int type)
{
 switch (type) // 字符串类型
 {
 case 1:{//pascal基本字
	 for(int i = 0;i <= 13;i++)
     {
      if (strcmp(keyWord[i],SearchStr) == 0)//字符串在keyWord中
       return true;
     }
	   break;
	}
 case 2:{//pascal运算符
      for(int i = 0;i <= 3;i++)
      {
        if(strcmp(Operators[i],SearchStr) == 0)//字符串在Operators中
        return true;
      }
       break;
     }
 case 3: {//pascal比较符
	   for(int i = 0;i <= 5;i++)
      {
       if(strcmp(compareOperators[i],SearchStr)==0)//字符串在compareOperators中
       return true;
      }
      break;
	}
 case 4: {//pascal界符
	  for( int i = 0;i <= 7;i++)
      {
       if(strcmp(endOperators[i],SearchStr) == 0)//字符串在endOperators中
       return true;
      }
     break;
  }
 default: break;
 }
 return false;
}
/////////////////////////////////////////////////////////////////////////////////////////
//函数名:LetterProcess
//参数:char ch
//功能:分析源程序中的字符,把空格前的一个字符串或者字符串保存到数组中,
//调用Compare进行分析,输出结果到控制台,并存放结果到文件 
//返回值: char
char LetterProcess (char ch)//字符处理
{
 int i = START;//数组下标从0开始
 char letter[MAXSIZE];//存放字符或者字符串
 while (isalnum(ch)!=0)//是字母或者数字
 {
  letter[++i] = ch;//字符或者字符串
  ch = fgetc(fp);//继续从源文件中读取字符
 };
 letter[i+1] = '\0';//空白,供Compare处理时好操作
 if (Compare(letter,1))//是保留字
 {
	 printf("基本字: %s\n",letter);//到控制台
	 fprintf(fp1,"基本字:\t\t%s\n",letter);//到文件
 }
 else//是标识符
 {
     printf("标识符: %s\n",letter);//到控制台
	 fprintf(fp1,"标识符:\t\t %s\n",letter);//到文件
 }
 return ch;//返回不是字符或者数字的字符,继续读取文件进行下一个字符分析
}
/////////////////////////////////////////////////////////////////////////////////////////
//函数名:NumberProcess
//参数:char ch
//功能:分析源程序中的数字,把空格前的一个字符串或者字符串保存到数组中,
//调用Compare进行分析,输出结果到控制台,并存放结果到文件 
//返回值: char
char NumberProcess(char ch)//数字处理
{
 int i = START;//数组下标从0开始
 char number[MAXSIZE];//存放字符或者字符串
 while (isdigit(ch)!=0)//字符是数字
 {
  number[++i] = ch;//存放数字
  ch = fgetc(fp);//继续从源文件中读取字符
 }
 if(isalpha(ch)!=0)//是英文字母
 {
  while(isspace(ch) == 0)//不是空格
  {
   number[++i] = ch;//存放字符
   ch = fgetc(fp);//继续从源文件中读取字符
  }
  number[i+1] = '\0';
  printf("非法标识符:%s\n",number);//到控制台
  fprintf(fp1,"非法标识符:\t %s\n",number);//到文件
  return ch;//返回当前字符
 }
  number[i+1]='\0';//空白,供Compare处理时好操作
  printf("数字: %s\n",number);//到控制台
  fprintf(fp1,"数字:\t\t %s\n",number);//到文件
 return ch;//返回当前字符
}
/////////////////////////////////////////////////////////////////////////////////////////
//函数名:OtherProcess
//参数:char ch
//功能:对不是字符,数字的字符进行处理
//返回值: char

char OtherProcess(char ch)//其他字符处理
{
 int i = START;//数组下标从0开始
 char otherChar[MAXSIZE];//存放其他字符
 if (isspace(ch)!=0)//空格处理
 {
   ch = fgetc(fp);//读取空格后的字符
   return ch;//跳过空格,返回空格后的字符
 }
 while ((isspace(ch) == 0) && ( isalnum(ch) == 0))//不是空格也不是字母或者数字
 {
  otherChar[++i] = ch;//存放该字符到数组
  ch = fgetc(fp);//继续读取
 }
 otherChar[i+1]='\0';
 if (Compare(otherChar,2))//是运算符
   {
	 printf("运算符: %s\n",otherChar);//到控制台
    fprintf(fp1,"运算符:\t\t %s\n",otherChar);//到文件
   }
 else if (Compare(otherChar,3))//是比较符
   {
	printf("比较符: %s\n",otherChar);//到控制台
    fprintf(fp1,"比较符:\t\t %s\n",otherChar);//到文件
   }
	
 else if (Compare(otherChar,4))//是界符
	{
	  printf("界符:%s\n",otherChar);//到控制台
     fprintf(fp1,"界符:\t\t%s\n",otherChar);//到文件
    }
 else //非法标示符
	{
	 printf("非法标示符:%s\n",otherChar);//到控制台
     fprintf(fp1,"非法标识符:\t\t%s\n",otherChar);//到文件
	}
  return ch;//返回当前字符
}

int main()
{
  char str;//保存文件当前字符
  printf("词法分析结果如下:\n\n");
 if ((fp = fopen("PL源程序.txt","r")) == NULL)//打开文件
 {
	 printf("can not open the file!\n");
	 exit(0);//打不开文件,退出 
 }
 else//打开文件 
 {
  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);//其他字符处理
  }//while
  printf("词法分析结束\n");
  printf("词法分析结果已写入文件\n");
 }//else
 fclose(fp);//关闭文件
 fclose(fp1);
  getchar();//等待结束
   return 0;
}

⌨️ 快捷键说明

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