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

📄 compile.cpp.bak

📁 c++ pl/0语言分析程序
💻 BAK
字号:
#include <cstdio>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

int allnum(char *str)
{
	int count;
	int max;
	max=strlen(str);
	for (count=0;count<max;++count)
	{
		if (*(str+count)<'0'||*(str+count)>'9')
		{
			return 0;
		}
	}
	return 1;
}

int main(int argc, char *argv[])
{
	fstream infile;
	infile.open(argv[1],ios::in);
	char buffer[10]={"         "};
	char var[25][10];
	char resve[36][10]={"","","","program","var","procedure","begin","end","if","then","else","while","do","call","integer","real","+","-","*","/","~","^","&","<","<=",">",">=","=","<>",":=",";",".",",","(",")",":"};
	char *ch1 = new char [80];
	char *vartemp = new char[9];
	char *chbuffer = new char [3];
	int ch1count,buffercount,rescount,errflag=0,charflag=0,pointcount=0,varcount=0,clearcount=0,clearstart=0,clearend=0,clearflag=0,copycount=0,showflag=1;
	for (varcount=0;varcount<25;++varcount)
	{
		strcpy(var[varcount],buffer);
	}
	
	while(infile.getline(ch1,80))
	{
		errflag=0;
		ch1count=0;
		while (ch1[ch1count]!='\0')
		{
			for (clearcount=0;clearcount<80;++clearcount)
			{
				if (ch1[clearcount]=='/'&&ch1[clearcount+1]=='*')
				{
					clearstart=clearcount;
					clearflag=1;
					showflag=0;
					break;
				}
			}
			for (clearcount=0;clearcount<80;++clearcount)
			{
				if (clearflag==0&&ch1[clearcount]=='*'&&ch1[clearcount+1]=='/')
				{
					cout<<"**error(1)** ";
					break;
				}
				if (ch1[clearcount]=='*'&&ch1[clearcount+1]=='/')
				{
					clearend=clearcount+2;
					showflag=1;
					break;
				}
			}
			for (;clearstart<clearend;++clearstart)
			{
				if (clearflag==1)
					ch1[clearstart]=' ';
			}
			clearflag=0;
			char buffer[10]={"         "};
			errflag=0;
			for (;ch1[ch1count]==' ';++ch1count)
			{}
				
			for (buffercount=0,charflag=0;ch1[ch1count]!=' ';++ch1count,++buffercount)
			{
				buffer[buffercount]=ch1[ch1count];
				if (ch1[ch1count]=='+'||ch1[ch1count]=='-'||ch1[ch1count]=='*'||ch1[ch1count]=='/'||ch1[ch1count]==':'||ch1[ch1count]=='='||ch1[ch1count]=='>'||ch1[ch1count]=='<'||ch1[ch1count]==';'||ch1[ch1count]==','||ch1[ch1count]=='.')
				{
					if (ch1[ch1count+1]=='='||ch1[ch1count+1]=='>')
						{
							charflag=1;
							chbuffer[0]=ch1[ch1count];
							chbuffer[1]=ch1[ch1count+1];
							chbuffer[2]='\0';
							ch1count+=2;
							break;
						}
						else
						{
							charflag=1;
							chbuffer[0]=ch1[ch1count];
							chbuffer[1]='\0';
							++ch1count;
							break;
						}
				}
						if (ch1[ch1count]==' '||ch1[ch1count]=='\0')
						{
							break;
						}
			}
			
			buffer[buffercount]='\0';
		
			if (buffer[0]>='0'&&buffer[0]<='9'&&allnum(buffer))
			{
				if(showflag)cout<<"(2,"<<buffer<<")"<<buffer<<" ";
			}
			if (buffer[0]>='0'&&buffer[0]<='0'&&allnum(buffer)==0)
			{
				if(showflag)cout<<"**error(1)** ";
			}
			for (rescount=3;rescount<36;++rescount)
			{
				errflag=1;
				if ((buffer[0]>='a'&&buffer[0]<='z')||(buffer[0]>='A'&&buffer[0]<='Z'))
				{
					if (strcmp(buffer,resve[rescount])==0)
					{
						errflag=1;
						if(showflag)cout<<"("<<rescount<<",0)"<<buffer<<" ";
						break;
					}
					if (rescount>34)
					{
						for (copycount=0;copycount<8;++copycount)
						{
							vartemp[copycount]=buffer[copycount];
						}
						vartemp[copycount]='\0';
						for (varcount=1;varcount<25;++varcount)
						{
							if (strcmp(vartemp,var[varcount])==0)
							{
								if(showflag)cout<<"(1,"<<varcount<<")"<<vartemp<<" ";
								break;
							}
						}
						if (varcount>24)
						{
							for (varcount=1;varcount<25;++varcount)
							{
								if (var[varcount][0]==' ')
								{
									pointcount=varcount;
									break;
								}
							}
							if(showflag)
								{
									strcpy(var[pointcount],vartemp);
									cout<<"(1,"<<pointcount<<")"<<var[pointcount]<<" ";
								}
						}
					}
					
				}
			}
			if (charflag==1)
			{
				for (int chcount=0;chcount<36;++chcount)
				{
					if (strcmp(chbuffer,resve[chcount])==0)
					{
						if(showflag)cout<<"("<<chcount<<",0)"<<chbuffer<<" ";
					}
				}
			}
			if (buffer[0]=='?'||buffer[0]=='!'||buffer[0]=='@'||buffer[0]=='#'||buffer[0]=='%'||buffer[0]=='$'||buffer[0]=='_'||buffer[0]=='{'||buffer[0]=='}'||buffer[0]=='['||buffer[0]==']')
			{
				errflag=0;
			}

			if (errflag==0)
			{
				if(showflag)cout<<"**error(1)** ";
			}
		}
	}
	cout<<'\n';
	varcount=1;
	while (var[varcount][0]!=' ')
	{
		cout<<varcount<<" "<<var[varcount]<<" 0"<<endl;
		++varcount;
	}
	infile.close();
	return 0;
}

⌨️ 快捷键说明

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