📄 yf.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 + -