• 大小: 9KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-10-27
  • 语言: 其他
  • 标签: LL(1)语法  

资源简介

[实验项目] 实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。 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]

评论

共有 条评论