?? yf.cpp
字號(hào):
/*
1 、目的:通過(guò)設(shè)計(jì)、編程、調(diào)試出一個(gè)具體語(yǔ)義分析程序,
掌握利用語(yǔ)法制導(dǎo)翻譯技術(shù)實(shí)現(xiàn)語(yǔ)義分析的方法。
2、內(nèi)容:改寫下面算術(shù)表達(dá)式文法,使?jié)M足LL(1)條件,構(gòu)
造相應(yīng)的翻譯模式計(jì)算表達(dá)式的值,由翻譯模式構(gòu)造遞歸下降
翻譯器。給出測(cè)試用例和分析結(jié)果。
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]; //儲(chǔ)存輸入的語(yǔ)句
char ch; //儲(chǔ)存當(dāng)前提取符
int loc; //指示當(dāng)前分析位置
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;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -