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

📄 词法分析.cpp

📁 编译原理词法分析程序。对一个简单语言的子集编制一个一遍扫描的编译程序
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include"ctype.h"
char prog[80],token[8];     //token用来存放构成单词符号的字符串
char ch;
int syn,p,m,n,sum;       //syn用来存放单词符号的种别码,sum用来存放整形单词,*p是缓冲区prog的指针,m是token的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner()                       //词法扫描程序
{
	for(n=0;n<8;n++)token[n]=NULL;
	m=0;
	ch=prog[p];
	while(ch==' ')ch=prog[++p];
	if(isalpha(ch))
	{
		while(isalpha(ch)||isdigit(ch))
		{
			token[m++]=ch;
			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(isdigit(ch))
		{
			sum=0;
			while(isdigit(ch))
			{
				sum=sum*10+ch-'0';
				ch=prog[++p];
			}
			syn=11;
		}
		else
			switch(ch)
		{
			case'<':m=0;token[m++]=ch;
				    ch=prog[++p];
				    if(ch=='>')
					{
						syn=21;
						token[m++]=ch;
						p++;
					}
					else if(ch=='=')
					{
						syn=22;
						token[m++]=ch;
						p++;
					}
					else
						syn=20;
					break;
			case'>':m=0;token[m++]=ch;
				    ch=prog[++p];
					if(ch=='=')
					{
						syn=24;
						token[m++]=ch;
						p++;
					}
					else
						syn=23;
					break;
			case':':m=0;token[m++]=ch;
					ch=prog[++p];
					if(ch=='=')
					{
						syn=18;
						token[m++]=ch;
						p++;
					}
					else
						syn=17;
					break;
			case'+':p++;syn=13;token[0]=ch;break;
			case'-':p++;syn=14;token[0]=ch;break;
			case'*':p++;syn=15;token[0]=ch;break;
			case'/':p++;syn=16;token[0]=ch;break;
			case'=':p++;syn=25;token[0]=ch;break;
			case';':p++;syn=26;token[0]=ch;break;
			case'(':p++;syn=27;token[0]=ch;break;
			case')':p++;syn=28;token[0]=ch;break;
			case'#':syn=0;token[0]=ch;break;
			default:p++;syn=-1;
		}
}
void main()
{
	p=0;
	cout<<"please input string:"<<endl;
	do
	{
		ch=getchar();
		prog[p++]=ch;
	}while(ch!='#');
	p=0;
	do
	{
		scaner();
		switch(syn)
		{
		case 11:cout<<"("<<11<<","<<sum<<")";break;
		case -1:cout<<"error!";break;
		default:cout<<"("<<syn<<","<<token<<")";break;
		}
	}while(syn!=0);
	cout<<endl;
}

⌨️ 快捷键说明

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