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

📄 getsym.cpp

📁 pl/0的词法分析器
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
#include <iostream.h>
#include <string.h>

const numbermax=5;
char* sym[18]={"procedure","call","begin","end","if",
				"then","while","do","odd","int"
				,"char","long","double","even","continue","break","else","var"};
char* ope[8]={"+","-","*","/","<",">","=","#"};
char* ope2[4]={"<=",">=","<>",":="};
char line[80];							//记录单行字符串
char a[10];								//记录sym
int cc=0;
char ch;
int flags=0;							//字符范围标记
void getch()								//获取字符
{
	ch=line[cc];
	cc++;
}
void iniArra()								//初始化数组a
{
	int i=0;
	while(i<sizeof(a))
	{
		a[i]='\0';
		i++;
	}
}
void iniArrline()								//初始化数组line
{
	int i=0;
	while(i<sizeof(line))
	{
		line[i]='\0';
		i++;
	}
}
void error(int type)						//编译错误
{
	if(type==30)
	{
		cout<<"数字长度超出范围!\n";
	}
	if(type==10)
	{
		cout<<"标示符定义错误!\n";
	}
	if(type==100)
	{
		cout<<"无法识别的字符!\n";
	}
}
void getsym()
{
	ifstream fin("sam.txt");
	int i=1;
	do
	{
		iniArrline();
		fin.getline(line,sizeof(line));		//读取下一行
		cout<<i<<"  "<<line<<"\n";
		do
		{
			getch();
		}while(ch==' ');
		while(line[cc-1]!='\0')				//若一行未读完,循环
		{
			flags=0;
			iniArra();						//清空数组a
			while(ch==' ')
			{
				getch();
				flags=true;
			}
			if(ch>='a'&&ch<='z')			//第一个为字符
			{
				int k=0;					//a长度记录
				int i=0;					//关键字表记录长度
				bool flag=false;			//关键字标记
				do							//读取变量或关键字
				{
					if(k<sizeof(a))
					{
						a[k]=ch;
						k++;
					}
					getch();
				}while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
				while(sym[i])				//比较是否关键字
				{
					if(strcmp(sym[i],a)==0)
					{
						flag=true;
						break;
					}else{
						flag=false;
						i++;
					}
				}
				if(flag)
				{
					cout<<"基本字    "<<a<<"\n";
				}else{
					cout<<"标示符    "<<a<<"\n";
				}
				flags=1;
			}
			if(ch>='0'&&ch<='9')			//第一个为数字
			{
				int num=0;
				int k=0;
				do
				{
					num=num*10+(ch-'0');
					k++;
					getch();
				}while(ch>='0'&&ch<='9');
				if(ch>='a'&&ch<='z')
				{
					while(ch>='a'&&ch<='z')
					{
						cout<<"错误      "<<num<<ch<<"      ";
						error(10);
						getch();
					}
				}else if(k>numbermax){
					error(30);
				}else{
					cout<<"常数      "<<num<<"\n";
				}
				flags=1;
			}
			if(ch==','||ch==';'||ch==')'||ch=='('||ch==':'||ch=='.')//界符判断
			{
				do
				{
					cout<<"界符      "<<ch<<"\n";
					getch();
				}while(ch==','||ch==';'||ch==')'||ch=='('||ch==':'||ch=='.');
				flags=1;
			}
			if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='*')//一元运算符判断
			{
				do
				{
					cout<<"运算符    "<<ch<<"\n";
					getch();
				}while(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='*');
				flags=1;
			}
			if(ch=='<')											//二元运算符判断
			{
				char tmp[3]={'\0','\0','\0'};
				int i=0;
				tmp[i]=ch;
				getch();
				if(ch=='>'||ch=='=')
				{
					i++;
					tmp[i]=ch;
					getch();
					cout<<"运算符    "<<tmp<<"\n";
				}else{
					cout<<"运算符    "<<tmp<<"\n";
				}
				flags=1;
			}
			if(ch=='>')
			{
				char tmp[3]={'\0','\0','\0'};
				int i=0;
				tmp[i]=ch;
				getch();
				if(ch=='=')
				{
					i++;
					tmp[i]=ch;
					getch();
					cout<<"运算符    "<<tmp<<"\n";
				}else{
					cout<<"运算符    "<<tmp<<"\n";
				}
				flags=1;
			}
			if(flags==0)										//判断错误
			{
				cout<<"错误      "<<ch;
				error(100);
				getch();
			}
		}
		i++;
		cc=0;
		cout<<"\n";
	}while(!fin.eof());
}
void main()
{
	getsym();
}

⌨️ 快捷键说明

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