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

📄 词法分析.cpp

📁 一个c语言写的词法分析器和语法分析器的简单算法
💻 CPP
字号:
#include<string.h>
#include<iostream.h>
#include<fstream.h>
#include<assert.h>
#include<ctype.h>
#include<conio.h>
#define SIZE 100

const char kind[57][12]={" ","PROGRAM","VAR","PROCEDURE","BEGIN","END","IF","THEN",
	                 "ELSE","WHILE","DO","TRUE","FALSE","OF","READ","READLN","WRITE",
	                 "WRITELN","FOR","DOWNTO","TO","ARRAY","OR","DIV","MOD","AND",
	                 "NOT","CONST",">","<=",">=","<>","<","=","EOLN","[","]","EOF",
	                 "(",")","+","-","*","/",";",":",":=",",",".","整数常数","实型常数",
	                 "字符串常数","标识符","REAL","INTEGER","CHAR","BOOLEAN"};

int check(const char* word_string,const char kind[57][12]);

int main(int argc, char *argv[])
{	
	char* file_name,*file_aim,*file_error;
	char temp_name[20];
	char line_string[100];
	char word_string[20];
	int i,j,k,line,flag;
	if(argc==2)
	{
		file_name=argv[1];
	}
	else
	{
		cout<<"请输入源程序名:";
		cin>>temp_name;	
		file_name=temp_name;
	}
	if(strstr(file_name,".pas")==NULL)
		strcat(file_name,".pas");
	ifstream f_source(file_name,ios::in|ios::nocreate);
 	assert(f_source);
	file_aim=strcat(strtok(file_name,"."),".dyd");
	ofstream f_aim(file_aim,ios::out);
    assert(f_aim);
	file_error=strcat(strtok(file_name,"."),".err");
	ofstream f_error(file_error,ios::out);
    assert(f_error);
	line=0;
	while(f_source.getline(line_string,SIZE))
	{
		line++;
		i=0; 
		while((unsigned)i<strlen(line_string))
		{
			while(line_string[i]==' '||line_string[i]==9)
				i++;
			if(isalpha(line_string[i]))
			{
				j=0;
				while(isalnum(line_string[i]))
				{
					word_string[j]=toupper(line_string[i]);
					j++;
					i++;
				}
				word_string[j]='\0';
				k=check(word_string,kind);
				if(k==0)
					f_aim<<word_string<<" "<<52<<endl;
				else
					f_aim<<word_string<<" "<<k<<endl;

			}
			else if(isdigit(line_string[i]))
			{
				j=0;
				flag=0;
				while(isdigit(line_string[i]) || (line_string[i]=='.' && isdigit(line_string[i+1]) && flag!=1))
				{
					if(line_string[i]=='.')
						flag=1;
					word_string[j]=line_string[i];
					j++;
					i++;
				}
				word_string[j]='\0';
				if(strstr(word_string,"."))
					f_aim<<word_string<<" "<<50<<endl;
				else
					f_aim<<word_string<<" "<<49<<endl;
			}
			else if(line_string[i]=='<' || line_string[i]=='>')
			{
				j=0;word_string[j]=line_string[i];
				if(line_string[i+1]=='=')
				{				
					word_string[++j]=line_string[++i];
				}
				word_string[++j]='\0';
				i++;
				f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
			}
			else if(line_string[i]=='<' && line_string[i+1]=='>')
			{
				j=0;
				word_string[j]=line_string[i];
				word_string[++j]=line_string[++i];
				word_string[++j]='\0';
				i++;
				f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
			}
			else if(line_string[i]==':' && line_string[i+1]=='=')
			{
				j=0;
				word_string[j]=line_string[i];
				word_string[++j]=line_string[++i];
				word_string[++j]='\0';
				i++;
				f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
			}
			else if(line_string[i]=='=' || line_string[i]=='[' || line_string[i]==']' 
				    || line_string[i]=='(' || line_string[i]==')' || line_string[i]=='+'
					|| line_string[i]=='-' || line_string[i]=='*' || line_string[i]=='/'
					|| line_string[i]==';' || line_string[i]=='.' || line_string[i]==','
					|| line_string[i]==':')
			{
				j=0;
				word_string[j]=line_string[i];
				word_string[++j]='\0';
				i++;
				f_aim<<word_string<<" "<<check(word_string,kind)<<endl;
			}
			else if(line_string[i]=='\'')
			{
				i++;
				j=0;
				word_string[j]=line_string[i];
				i++;
				j++;
				word_string[j]='\0';
				if(line_string[i]=='\'')
				{
					f_aim<<word_string<<" "<<51<<endl;
					i++;
				}
				else
				{
					cout<<"**LINE:"<<line<<"  "<<"字符常量定义出错"<<endl;
					f_error<<"***LINE:"<<line<<"  "<<"字符常量定义出错"<<endl;
				}
			}
			else if(line_string[i]=='\"')
			{
				i++;
				j=0;
				while(line_string[i]!='\"' && (unsigned)i<strlen(line_string))
				{
					word_string[j]=line_string[i];
					i++;
					j++;
				}
				word_string[j]='\0';
				if(line_string[i]=='"')
				{
					f_aim<<word_string<<" "<<51<<endl;
					i++;
				}
				else
				{
					cout<<"***LINE:"<<line<<"  "<<"\"号不匹配"<<endl;
					f_error<<"***LINE:"<<line<<"  "<<"\"号不匹配"<<endl;
				}
			}
			else
			{
				cout<<"***LINE:"<<line<<"  "<<"含有非法字符"<<endl;
				f_error<<"***LINE:"<<line<<"  "<<"含有非法字符"<<endl;
				i++;
			}
		}
		f_aim<<"EOLN"<<" "<<line<<endl;
	}
	f_aim<<"EOF"<<" "<<line;
	cout<<endl<<"词法分析完成!"<<endl;
	cout<<"请查看 .err 文件!"<<endl;
	f_source.close();
	f_aim.close();
	cout<<"请按任意键退出。"<<endl;
	getch();
	return 0;
}
int check(const char* word_string,const char kind[57][12])
{
	int k,flag=0;
	for(k=1;k<=56;k++)
	{
		if(strcmp(word_string,kind[k])==0)
		{
			flag=1;
			break;
		}
	}
	if(flag==1)
		return k;
	else
		return 0;
}

⌨️ 快捷键说明

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