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

📄 yf.cpp

📁 用C++编写的语法分析器
💻 CPP
字号:
/*
1 、目的:通过设计、编程、调试出一个具体语义分析程序,
掌握利用语法制导翻译技术实现语义分析的方法。
2、内容:改写下面算术表达式文法,使满足LL(1)条件,构
造相应的翻译模式计算表达式的值,由翻译模式构造递归下降
翻译器。给出测试用例和分析结果。 
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|id
*/

#include <iostream.h>
#include <string.h>

#define MAX_LEN 100
#define ERROR	1
#define OK		0

char buf[MAX_LEN];                   //储存输入的语句
char ch;                             //储存当前提取符
int loc;                              //指示当前分析位置

int E();                              //E→TE'
int E1();                             //E'→+TE'|e
int T();                              //T→FT'
int T1();                             //T'→*FT'|e
int  F();                             //F→i|(E)

int num;
int Eval;
int E1val;
int Tval;
int T1val;
int Fval;

int T1_i;
int T1_s;
int E1_i;
int E1_s;

bool IsDigit()
{
	if (ch >= '0' && ch <= '9')
		return true;
	else 
		return false;
}

void GetChar()
{
	ch = buf[loc];
	while (ch == ' ')
	{
		loc++;
		ch = buf[loc];
	}
}

int GetDigit()
{
	int num = ch - '0';
	loc++;
	GetChar();
	while (IsDigit())
	{
		num = num * 10 + (ch - '0');
		loc++;
		GetChar();
	}
	return num;
}

void ADVANCE()
{
	loc++;
}

int E()
{
	if (T() == ERROR)
		return ERROR;
	E1_i = Tval;
	if (E1() == ERROR)
		return ERROR;
	Eval = E1_s;
	cout << "E->TE\'\t" << Eval << endl;
	return OK;
}

int T()
{
	if (F() == ERROR)
		return ERROR;
	T1_i = Fval;
	if (T1() == ERROR)
		return ERROR;
	Tval = T1_s;
	cout << "T->FT\'\t" << Tval << endl;
	return OK;
}

int E1()
{
	GetChar();
	if (ch == '+')
	{
		ADVANCE();
		if (T() == ERROR)
			return ERROR;
		E1_i = E1_i + Tval;
		if (E1() == ERROR)
			return ERROR;
		E1val = E1_s;
		cout << "E\'->+TE\'\t" << E1val << endl;
	}
	else if (ch == '-') 
	{
		ADVANCE();
		if (T() == ERROR)
			return ERROR;
		E1_i = E1_i - Tval;
		if (E1() == ERROR)
			return ERROR;
		E1val = E1_s;
		cout << "E\'->-TE\'\t" << E1val << endl;
	}
	E1_s = E1_i; 
	cout << "E\'->NULL" << endl;
	return OK;
}

int T1()
{
	GetChar();
	if (ch == '*')
	{
		ADVANCE();
		if (F() == ERROR)
			return ERROR;
		T1_i = T1_i * Fval;
		if (T1() == ERROR)
			return ERROR;
		T1val = T1_s;
		cout << "T\'->*FT\'" << endl;
	}
	else if (ch == '/')
	{
		ADVANCE();
		if (F() == ERROR)
			return ERROR;
		T1_i = T1_i / Fval;
		if (T1() == ERROR)
			return ERROR;
		T1val = T1_s;
		cout << "T\'->/FT\'" << endl;
	}
	T1_s = T1_i;
	cout << "T\'->NULL" << endl;
	return OK;
}

int F()
{
	GetChar();
	if (IsDigit())
	{
		num = GetDigit();
		Fval = num;
		cout << "F->i" << "\tF.val = num\t" << num << endl;
	}
	else if (ch == '(')
	{
		ADVANCE();
		if (E() == ERROR)
			return ERROR;
		if (ch == ')')
			ADVANCE();
		else
			return ERROR;
		Fval = Eval;
		cout << "F->(E)" << "\tF.val = E.val\t" << Eval << endl;
	}
	else
		return ERROR;
	return OK;
}

int main()
{
	cin.getline(buf, 100);
	if (E() == OK)
		cout << "OK!" << endl;
	else
		cout << "ERROR" << endl;
	return 0;
}

⌨️ 快捷键说明

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