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

📄 sm.cpp

📁 这是一个大学教学用的编绎程序,集语法分析和语法制导翻绎为一体,其中语法分析采用算符优先分析算法.
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
char sm();
int entry();
void intput();
void out(char *,int);
void getchar();
void getbc();
void concat();
bool isletter();
bool isdigit();
int reserve();
void retract();
int insertid();
int insertconst();
void error();
char ch,d[100];
int j=0,m=0,n=0;
char strtoken[10];
static char key[5][10]={"begin","if","then","else","end"};
char name[20][10];
char const1[20][10]; 
char sm()
{

	int code,value;
	strtoken[0]='\0';
	getchar();
	getbc();
	if(ch=='#')
		return '#';
	if(isletter())
	{
		while(isletter()||isdigit())
		{
			concat();
			getchar();
		}
		retract();
		code=reserve();
		if(code==0)
		{
			value=insertid();
			out("id",value);
			return 'i';

		}
		else
			out(key[code-1],code);
	}
		else if(isdigit())
		{
			while(isdigit())
			{
				concat();
				getchar();
			}
			retract();
			value=insertconst();
			out("INT",value);
			return 'c';
		}
		else if(ch=='='){
			concat();
			out("ASSIGN",0);
			return '=';
		}
		else if(ch=='+'){
			concat();
			out("PLUS",0);
			return '+';
		}
		else if(ch=='*')
		{
			concat();
			getchar();
			if(ch=='*'){
				concat();
				out("POWER",0);
				return '^';
			}else{
				retract();
				out("STAR",0);
				return '*';
			}
		}
		else if(ch==';'){
			concat();
			out("SEMICOLON",0);
			return ';';
		}
		else if(ch=='('){
			concat();
			out("LPAR",0);
			return '(';
		}
		else if(ch==')'){
			concat();
			out("RPAR",0);
			return ')';
		}
		else if(ch=='{'){
			concat();
			out("LBRACE",0);
			return '{';
		}
		else if(ch=='}'){
			concat();
			out("RBRACE",0);
			return '}';
		}
		else {
			error();
			if(ch=='\n')
				return '?';

		}
		return '|';
}
void intput()
{
	cout<<"please input the string"<<endl;
	int i=0;
	while(1)
	{
		d[i]=cin.get();
		if(d[i]=='#')
			break;
		i++;
	}
};
void out(char *p,int v)
{

}
void getchar()
{
	ch=d[j];
	j=j+1;
}
void getbc()
{
	while(ch==' ')
	{
		getchar();
	}
}
void concat()
{
	char p[2];
	p[0]=ch;
	p[1]='\0';
	strcat(strtoken,p);
}
bool isletter()
{
	if((ch>='a')&&(ch<='z'))
		return 1;
	else return 0;
}
bool isdigit()
{
	if((ch>'0')&&(ch<'9'))
		return 1;
	return 0;
}
int reserve()
{
	for(int k=0;k<5;k++)
		if(strcmp(strtoken,key[k])==0)
			return (k+1);
		return 0;
}
void retract()
{
	j=j-1;
	ch=' ';
}
int insertid()
{
	
	strcpy(name[m],strtoken);
	m=m+1;
	return(m-1);
}
int insertconst()
{
	strcpy(const1[n],strtoken);
	n=n+1;
	return (n-1);
}
void error()
{
	if(ch!='\n')
	cout<<"the "<<j<<"th are illegal"<<endl;
}
int entry()
{
	for(int k1=0;k1<20;k1++)
		if(strcmp(strtoken,name[k1])==0)
			return (k1+100);
	return -1;
}


	
	

⌨️ 快捷键说明

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