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

📄 haha.cpp

📁 编译原理-词法分析器-定义单词符号的种类
💻 CPP
字号:
#include<ctype.h>
#include<stdlib.h>
#include<iomanip>
#include<string>
#include<iostream.h>
struct danci
  {
	  int id;			//单词种别
	  char name[10];	//单词属性值
  };

int n=0;
danci word[20];

void error()
{
	cout<<"词法错误,标志符不能以数字开头"<<endl;
	exit(0);
}

int  lex(char * buf)//词法分析
{
	int i=0,j=0;
	int n=0;
	char Temp_name[10];
	while(buf[i]!='\0')
	{
		if(buf[i]==' '||buf[i]=='\n')
			i++;
		else if(isalpha(buf[i])||buf[i]=='_')//标志符判断
		{
			Temp_name[j]=buf[i];
			i++;
			while(isalnum(buf[i]))
			{
				j++;
				Temp_name[j]=buf[i];
				i++;
			}
		  	memcpy(word[n].name,Temp_name,j+1);
			word[n].name[j+1]='\0';
			if(strcmp(word[n].name,"and")==0)
				word[n].id=1;
			else if(strcmp(word[n].name,"or")==0)
				word[n].id=2;
			else if(strcmp(word[n].name,"not")==0)
				word[n].id=3;
			else if(strcmp(word[n].name,"begin")==0)
				word[n].id=4;
			else if(strcmp(word[n].name,"if")==0)
				word[n].id=5;
			else if(strcmp(word[n].name,"then")==0)
				word[n].id=6;
			else if(strcmp(word[n].name,"while")==0)
				word[n].id=7;
			else if(strcmp(word[n].name,"do")==0)
				word[n].id=8;
			else if(strcmp(word[n].name,"end")==0)
				word[n].id=9;
			else 
				word[n].id=0;
			n++;
			j=0;
		}
		else if(isdigit(buf[i]))//数字判断
		{
			while(isdigit(buf[i]))
			{
			Temp_name[j]=buf[i];
			i++;
			j++;
			word[n].id=26;
			}
			if(isdigit(buf[0]))
				error();
			memcpy(word[n].name,Temp_name,j+1);
			word[n].name[j]='\0';
			n++;
			j=0;
		}
		else//运算符号判断
		{
			switch(buf[i])
			{
				case '>':if(buf[i+1]=='=')
						 {
							  i++;
						   	  word[n].id=10;
							  strcpy(word[n].name,">=");
						 }
						 else
						 {
							 word[n].id=11;
							 strcpy(word[n].name,">");
						 }
						 n++;break;
				case '<':if(buf[i+1]=='=')
						 {
							  i++;
						   	  word[n].id=12;
							  strcpy(word[n].name,"<=");
						 }
					     else 
						 {
							 word[n].id=13;
							 strcpy(word[n].name,"<");
						 }
						 n++;break;
				case '=': word[n].id=14;strcpy(word[n].name,"=");n++;break;
				case '!': if(buf[i+1]=='=')
						  {
							  i++;
						   	  word[n].id=15;strcpy(word[n].name,"!=");
						  }
					      else 
						  {
							  word[n].id=16;strcpy(word[n].name,"!");
						
						  }
						   break;
				case '(': word[n].id=17;strcpy(word[n].name,"(");n++;break;
				case ')': word[n].id=18;strcpy(word[n].name,")");n++;break;
				case '+': word[n].id=19;strcpy(word[n].name,"+");n++;break;
				case '-': if(buf[i+1]=='>')
						  {
							  i++;
						   	  word[n].id=20;strcpy(word[n].name,"->");
							  n++;
						  }
					      else 
						  {
							  word[n].id=21;
							  strcpy(word[n].name,"-");
						  }
						  n++;
						  break;
				case '*': word[n].id=22;strcpy(word[n].name,"*");n++;break;
				case '/': word[n].id=23;strcpy(word[n].name,"/");n++;break;
				case ';': word[n].id=24;strcpy(word[n].name,";");n++;break;
				case ':': word[n].id=25;strcpy(word[n].name,":");n++;break;
			}
			i++;
		}
	}
	return n;
}


void main()
{
	char buffer[30];
	int i=0;
	int length;
	char *inword;
	cout<<"输入表达式,以#结束 :"<<endl;
	cin>>buffer[i];
	while(buffer[i]!='#')
	{
		i++;
		cin.get(buffer[i]);
	}
	buffer[i]='\0';
	length=i+1;
	inword=new char[length];
	memcpy(inword,buffer,length);
	length=lex(inword);
	cout<<"词法分析结果如下:"<<endl;
	cout<<'('<<"属性"<<' '<<"值"<<')';
	for( i=0;i<length;i++)
	{	cout<<'('<<word[i].id<<' '<<word[i].name<<')'; cout<<' ';}
	cout<<endl;
}
  
  
 

⌨️ 快捷键说明

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