al.cpp

来自「一个编译原理的词法分析程序,功能都已经完备了,可以从文件读入,输出分析完成的各个」· C++ 代码 · 共 455 行

CPP
455
字号
#include<stdio.h>
#include<string.h>
#include<process.h>  
#include<iostream.h>
//#include<fstream>
//#include<limits.h>
//using namespace std;
#define MAX 100000  //如果需要更大的空间可以随时增加

int main()
{
	int count=0;
	int errcount=0;

	FILE *in,*out;    //存放输入字符串和输出单词串的文件
	char arr[MAX];    //arr数组存放单词符号
	char currentchar;  //currentchar存放当前输入字符
	int i=0;    //arr数组的一个指针
	
	/*//以读方式打开输入文件
	//输入的文本之关键字没区别大小写
	if((in=fopen("a.txt","r"))==NULL)
	{
		printf("can not open file\n");
		exit(0);
	}

	//以写方式打开输出文件
	if((out=fopen("outfilea.txt","w"))==NULL)
	{
		printf("cannout open outfile\n");
		exit(1);
	}*/

	//以读方式打开输入文件
	//输入的文本之关键字区别了大小写
	if((in=fopen("b.txt","r"))==NULL)
	{
		printf("can not open file\n");
		exit(0);
	}

	//以写方式打开输出文件
	if((out=fopen("outfileb.txt","w"))==NULL)
	{
		printf("cannout open outfile\n");
		exit(1);
	}
	
	//去掉开头空格
	currentchar=fgetc(in);
	while(currentchar==' ')
	{ 
		currentchar=fgetc(in);
	}
	int ch;

	fprintf(out,"%s\n","关键字 符号 标识符 数字");
	fprintf(out,"%s\n","  0      1     2    3  ");

	while(currentchar!='@')   //此处的结束有问题,FOPEN不能使用EOF结束,所以在文件末尾添加一标记量@,做结束文件的FOPEN操作
	{
		/*常数部分判断*/
		if((currentchar>='a'&&currentchar<='z')||(currentchar>='A'&&currentchar<='Z')||
			(currentchar>='0'&&currentchar<='9')||currentchar=='('||currentchar==')'||currentchar=='{'||currentchar=='}'||
			currentchar=='>'||currentchar=='<'||currentchar==';'||currentchar==':'||currentchar=='+'||currentchar=='-'||
			currentchar=='*'||currentchar=='/'||currentchar=='='||currentchar=='!'||currentchar=='&'||
			(ch=currentchar)=='\n'||currentchar==' '||currentchar=='['||currentchar==']')
		{
			i=0;//清空arr字符数组
			if(currentchar>='0'&&currentchar<='9')
			{
				arr[i++]=currentchar;
				currentchar=fgetc(in);//再读入下一个字符
				while(currentchar>='0'&&currentchar<='9')
				{
					arr[i++]=currentchar;
					currentchar=fgetc(in);
				}
				if(currentchar!='.')//如果当前读入的符号不为小数点,则常数读完毕,输出此常数
				{
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",3,'"',arr,'"',")");
					count++;
					//格式化输出到目标文件,0,1,2,3分别代表4种别码, arr为内码值,规定用数字本身代表
				}
				
				else//当前字符为小数点则继续向下读入
				{
					arr[i++]=currentchar;
					currentchar=fgetc(in);
					while(currentchar>='0'&&currentchar<='9')
					{
						arr[i++]=currentchar;
						currentchar=fgetc(in);
					}
					
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",3,'"',arr,'"',")");
					count++;
				}
				
				while(currentchar==' ')
				{ 
					currentchar=fgetc(in);
				}
			}
			
			/*判断标识符和关键字部分*/
			if((currentchar>='a'&&currentchar<='z')||(currentchar>='A'&&currentchar<='Z'))
			{
				i=0;//清空arr字符数组
				while((currentchar>='a'&&currentchar<='z')||(currentchar>='0'&&currentchar<='9')||
					(currentchar>='A'&&currentchar<='Z'))
				{
					arr[i++]=currentchar;
					currentchar=fgetc(in);
				}
				
				//把字符数组arr和关键字表比较,判断单词串是关键字还是标识符
				arr[i++]='\0';
				if(strcmp(arr,"if")==0 || strcmp(arr,"else")==0 || strcmp(arr,"while")==0 ||
					strcmp(arr,"do")==0 || strcmp(arr,"var")==0 || strcmp(arr,"integer")==0
					 || strcmp(arr,"begin")==0 || strcmp(arr,"then")==0 || 
					 strcmp(arr,"procedure")==0 || strcmp(arr,"end")==0)
				{
					fprintf(out,"%s%d,%c%s%c%s\n","(",0,'"',arr,'"',")");
					count++;
				}
				else if(strcmp(arr,"IF")==0 || strcmp(arr,"ELSE")==0 || strcmp(arr,"WHILE")==0 ||
					strcmp(arr,"DO")==0 || strcmp(arr,"VAR")==0 || strcmp(arr,"INTEGER")==0
					 || strcmp(arr,"BEGIN")==0 || strcmp(arr,"THEN")==0 ||
					 strcmp(arr,"PROCEDURE")==0 || strcmp(arr,"END")==0)
				{
					fprintf(out,"err of upper: %s%d,%c%s%c%s\n","(",0,'"',arr,'"',")");
					errcount++;
				}

				else
				{
					fprintf(out,"%s%d,%c%s%c%s\n","(",2,'"',arr,'"',")");
					count++;
				}
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			
			//判断标识符包括:+, -, *, /, (, ), {, }, <, >, ;, :, !=, >=, <=, ==, =.
			if(currentchar=='+')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='-')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			
			if(currentchar=='*')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			
			if(currentchar=='/')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			
			if(currentchar=='=')
			{
				i=0;
				arr[i++]=currentchar;
				currentchar=fgetc(in);
				if(currentchar=='=')
				{
					arr[i++]=currentchar;
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
					currentchar=fgetc(in);
				}
				else
				{
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
				}
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			
			if(currentchar==';')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}

			if(currentchar==',')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}

			if(currentchar=='.')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}

			if(currentchar=='{')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='}')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='[')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar==']')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='(')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar==')')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar==':')
			{
				i=0;
				arr[i++]=currentchar;
				currentchar=fgetc(in);
				
				if(currentchar==':')
				{
					arr[i++]=currentchar;
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
					currentchar=fgetc(in);
				}
				else
				{
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
				}
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='>')
			{
				i=0;
				arr[i++]=currentchar;
				currentchar=fgetc(in);
				if(currentchar=='=')
				{
					arr[i++]=currentchar;
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
					currentchar=fgetc(in);
				}
				else
				{
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
				}
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			
			if(currentchar=='<')
			{
				i=0;
				arr[i++]=currentchar;
				currentchar=fgetc(in);
				if(currentchar=='=')
				{
					arr[i++]=currentchar;
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
					currentchar=fgetc(in);
				}
				else
				{
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
				}
			}
			
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='!')
			{
				i=0;
				arr[i++]=currentchar;
				currentchar=fgetc(in);
				if(currentchar=='=')
				{
					arr[i++]=currentchar;
					arr[i++]='\0';
					fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
					count++;
					currentchar=fgetc(in);
				}
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			if(currentchar=='&')
			{
				fprintf(out,"%s%d,%c%c%c%s\n","(",1,'"',currentchar,'"',")");
				count++;
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{ 
				currentchar=fgetc(in);
			}
			while((ch=currentchar)=='\n')
			{
				currentchar=fgetc(in);
			}
			while(currentchar==' ')
			{
				currentchar=fgetc(in);
			}
		}
		else
		{
			fprintf(out,"%s,%c%c%c\n","error",'"',currentchar,'"');
			errcount++;
			currentchar=fgetc(in);
		}
	}
	//结束开头while语句
	/*关闭文件退出*/
	printf("%s\n","output successfully.");
	//printf("%s\n","output file is \"outfilea.txt\".");
	printf("%s\n","output file is \"outfileb.txt\".");
	printf("the number of the right factor: %d\n",count);
	printf("the number of the error factor: %d\n",errcount);
	if(errcount==0)
		printf("%s","No error factor.\n");
	else
		printf("%s","Some factor get wrong.\n");
	cout<<"关键字 "<<"符号 "<<"标识符 "<<"数字"<<endl;
	cout<<"  0    "<<"  1    "<<"  2  "<<" 3  "<<endl;
	fclose(in);
	fclose(out);
	return 0;
}

⌨️ 快捷键说明

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