📄 pl.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 + -