資源簡介
[實驗項目] 實現算符優(yōu)先分析算法,完成以下描述算術表達式的算符優(yōu)先文法的算符優(yōu)先分析過程。
G[E]:E→E+T∣E-T∣T
T→T*F∣T/F∣F
F→(E)∣i
說明:終結符號i為用戶定義的簡單變量,即標識符的定義。
代碼片段和文件信息
#include?
#include?
#include?
/***************************定義產生式******************************/
typedef?struct?Table{ //定義產生式
char?left; //產生式左部
char?right[5]; //產生式右部
char?all[10]; //產生式
}Table;
char?stack[200]; //堆棧體
char?inputstr[100]; //輸入串??????????
Table?table[12]; //產生式集
/*********************分析表初始化操作******************************/
void?init?()
{
table[0].left?=?‘E‘;??strcpy(table[0].right“TX\0“);??strcpy(table[0].all“E?->TX\0“);
table[1].left?=?‘X‘;??strcpy(table[1].right“ATX\0“);?strcpy(table[1].all“X?->ATX\0“);
table[2].left?=?‘X‘;??strcpy(table[2].right“ε\0“);??strcpy(table[2].all“X?->ε\0“);
table[3].left?=?‘T‘;??strcpy(table[3].right“FY\0“);??strcpy(table[3].all“T?->FY\0“);
table[4].left?=?‘Y‘;??strcpy(table[4].right“MFY\0“);??strcpy(table[4].all“Y?->MFY\0“);
table[5].left?=?‘Y‘;??strcpy(table[5].right“ε\0“);??strcpy(table[5].all“Y?->ε\0“);
table[6].left?=?‘F‘;??strcpy(table[6].right“(E)\0“);?strcpy(table[6].all“F->(E)\0“);
table[7].left?=?‘F‘;??strcpy(table[7].right“i\0“);??strcpy(table[7].all“F?->i\0“);
table[8].left?=?‘A‘;??strcpy(table[8].right“+\0“);?strcpy(table[8].all“A?->+\0“);
table[9].left?=?‘A‘;??strcpy(table[9].right“-\0“);?strcpy(table[9].all“A?->-\0“);
table[10].left?=?‘M‘;??strcpy(table[10].right“/\0“);?strcpy(table[10].all“M?->/\0“);
table[11].left?=?‘M‘;??strcpy(table[11].right“*\0“);?strcpy(table[11].all“M?->*\0“);
}
/*************************產生式右部入棧操作*************************/
int?StackPush?(int?*top?Table?table_)
{
int?len?i;
if?((*top)?0)
{
printf(“\n\n\t\t\t抱歉,發(fā)現未知錯誤!\n“);
exit(0);
}
len?=?strlen(table_.right);
if?(!strcmp(table_.right?“ε\0“)) //判斷產生式右邊是否為空,若為空,不進棧。
{
stack[*top]?=?‘\0‘;
(*top)--;
return?0;
}
for?(i?=?len-1;?i?>=?0;?i--) //產生式逆序入棧
{
stack[(*top)++]?=?table_.right[i];
}
stack[*top]?=?‘\0‘;
(*top)--;
return?0;
}
/**********************查表操作,選擇所用產生式*********************/
int?Selecttable(int?top?int?flag)
{
????if?(inputstr[flag]?==?‘#‘) //發(fā)現#標記,分析完畢
{
if?(stack[top]?==?‘E‘)???return?0;
if?(stack[top]?==?‘X‘)???return?2;
if?(stack[top]?==?‘T‘)???return?3;
if?(stack[top]?==?‘Y‘)???return?5;
if?(stack[top]?==?‘F‘)???return?7;
if?(stack[top]?==?‘A‘)???return?10;
if?(stack[top]?==?‘M‘)???return?12;
//return?12;
}
if?(inputstr[flag]?==?‘i‘)
{
if?(stack[top]?==?‘E‘)???return?0;
if?(stack[top]?==?‘X‘)???return?2;
if?(stack[top]?==?‘T‘)???return?3;
if?(stack[top]?==?‘Y‘)???return?5;
if?(stack[top]?==?‘F‘)???return?7;
if?(stack[top]?==?‘A‘)???return?10;
if?(stack[top]?==?‘M‘)???return?12;
return?13; //否則(以上情況均不滿足),分析失敗
}
if?(inputstr[flag]?==?‘(‘)
{
if?(stack[top]?==?‘E‘)???return?0;
if?(stack[top]?==?‘X‘)???return?2;
if?(stack[top]?==?‘T‘)???return?3;
if?(stack[top]
評論
共有 條評論