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

📄 cifafenxi.cpp

📁 编译原理--词法分析 功能: 输入:所给文法的源程序字符串 输出:二元组(syn,token或sum)构成的序列
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<iostream.h>

char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
void scaner();
char *rwtab[6]={"begin","if","then","while","do","end"};

void main()
{   
	p=0;
	cout<<"输入字符串:"<<endl;        //输入字符串
	
	prog[p]=getchar();                //把字符串放入字符串数组prog[]   
	while(prog[p]!='#')
	{
		p++;
		prog[p]=getchar();
	}
	cout<<"存入prog[]中的字符串为:"<<endl;
	for(int i=0;i<=p;i++)              //输出已输入字符串
		putchar(prog[i]);
	cout<<endl;
	
	p=0;
	ch=prog[p];
	do                                //输出二元组
	{
		scaner();                     //词法扫描
		switch(syn)
		{
		case 11:cout<<"(11,"<<sum<<")"<<endl;
			break;
		case -1:cout<<"error"<<endl;
			break;
		default:cout<<"("<<syn<<",";
			for(int i=0;i<8;i++)
				cout<<token[i];
			cout<<")"<<endl;
		}
	}
	while(syn!=0);
}


//词法扫描
void scaner()
{
   	for(n=0;n<8;n++)
		token[n]=NULL;
	while(ch==' ')
	{
		p++;
		ch=prog[p];
	}
	m=0;
	if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
	{
		while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))  //标识符 syn=10
		{  
			token[m]=ch;
			m++;
			p++;
			ch=prog[p];
		}
		token[m++]='\0';
		syn=10;
		for(n=0;n<6;n++)                         //关键字
			if(strcmp(token,rwtab[n])==0)
			{
				syn=n+1;
				break;
			}
			
	}
	
	else
	{
		if(ch>='0'&&ch<='9')               //整型常数
		{
			sum=0;
			while(ch>='0'&&ch<='9')
			{
				sum=sum*10+ch-'0';
				p++;
                ch=prog[p];
			}
            
			syn=11;
		}
		
		else                               //运算符、 界符
		{
			switch(ch)             
			{
			case'<': m=0;
				token[m++]=ch; 
				ch=prog[++p];
				if(ch=='>')                // < >的种别码为21 
				{
					syn=21;
					token[m++]=ch;
				}
				else                        // <=的种别码为22
				{
					if(ch=='=')
					{
						syn=22;
						token[m++]=ch;
					}
					else                    // <的种别码为20
					{
						syn=20;
						p--;
						ch=prog[p];
					}
					
				}
				break;
			case'>': token[m++]=ch;
				ch=prog[++p];
				if(ch=='=')                 // >=种别码为24
				{
					syn=24;                 
					token[m++]=ch;
				}
				else                        // >的种别码为23
				{
					syn=23;
					p--;
					ch=prog[p];
				}
				break;
			case':':token[m++]=ch;
				ch=prog[++p];
				if(ch=='=')                 // :=的种别码为18
				{ 
					m+=1;
					syn=18;
					token[m++]=ch;
				}
				else
				{                           // :的种别码为17
					m+=1;
					syn=17;
					p--;
					ch=prog[p];
				}
				break;
			case'+': syn=13;                // +的种别码为13
				token[0]=ch;
				break;
			case'-': syn=14;                // -的种别码为14 
				token[0]=ch;                
				break; 
			case'*': syn=15;                // *的种别码为15
				token[0]=ch;
				break;
			case'/': syn=16;                // /的种别码为16
				token[0]=ch;
				break;
            case'=': syn=25;                // =的种别码为25
			    token[0]=ch;
				break;
		    case';': syn=26;                // ;的种别码为26
				token[0]=ch;
				break;
			case'(': syn=27;                // (的种别码为27
				token[0]=ch;
				break;
			case')': syn=28;                // )的种别码为28
				token[0]=ch;
				break;
            case'#': syn=0;                 // #的种别码为0
				token[0]=ch;
				break;
			default:syn=-1;		
			}
			p++;
			ch=prog[p];
		}
	}
}

⌨️ 快捷键说明

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