资源简介
[实验项目] 实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。
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抱歉,发现未知错误!\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] == ‘#‘) //发现#标记,分析完毕
{
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]
评论
共有 条评论