修改以下代码 让它正常运行 #include "stdio.h" #include "string.h" char stack[80]="#E"; /* 符号堆栈描述为stack ,#为符号堆栈栈底符*,E为文法开始符*/ char sym[80]={"i*i+i#"}; /* 输入串描述,以表达式i*i+i,#为输入串结束符 */ char str[80]=""; /* 记录所用产生式 */ void push(char ch) /* 实现将CH中的字符压入stack栈 */ { .......} char pop() /* 实现将stack栈栈顶的字符弹出给CH,并返回CH值 */ { .....} void E() /* 关于产生式 E->TM 的描述*/ { push('M'); push('T'); strcpy(str,"E->TM");} void M( )/* 关于产生式 M->+TM | ε的描述*/ { ......} void T( )/* 关于产生式 T->FK 的描述*/ { .....} void K()/* 关于产生式 K->*FK | ε的描述*/ { ......} void F()/* 关于产生式 F->(E) | i的描述*/ { .....} void main() { char ch; strcpy(str,""); int i,j=0; printf("\n递归下降分析算法\n"); printf("\n%-6d%-20s%20s%10s",j,stack,sym,str); j=j+1; ch=pop(); while(ch!='#') {strcpy(str,""); if(ch=='i' || ch=='*' || ch=='+' || ch=='(' || ch == ')') /* 如果栈顶字符为文法终结符集VT*/ if(ch == sym[0]) {i=0; while(sym[i]) sym[i++]=sym[i+1];} else printf("\n EERROR "); else/* 如果栈顶字符为文法非终结符集VN*/ switch(ch) {case 'E':E();break; case 'M':M();break; case 'T':T();break; case 'K':K();break; case 'F':F();break; default : printf("\n error!\n");} printf("\n\n %-6d%-20s%20s%10s",j,stack,sym,str); j++; ch=pop();} }
时间: 2024-03-21 21:37:37 浏览: 111
由于push和pop函数的具体实现并未给出,这里用假设的方式实现它们,同时修正了注释中的错误:
```c
#include <stdio.h>
#include <string.h>
char stack[80] = "#E"; // 符号堆栈描述为stack,#为符号堆栈栈底符号,E为文法开始符
char sym[80] = "i*i+i#"; // 输入串描述,以表达式i*i+i,#为输入串结束符
char str[80] = ""; // 记录所用产生式
void push(char ch) { // 实现将ch中的字符压入stack栈
stack[strlen(stack)] = ch;
}
char pop() { // 实现将stack栈栈顶的字符弹出给ch,并返回ch值
char ch = stack[strlen(stack) - 1];
stack[strlen(stack) - 1] = '\0';
return ch;
}
void E() { // 关于产生式 E->TM 的描述
push('M');
push('T');
strcpy(str, "E->TM");
}
void M() { // 关于产生式 M->+TM | ε的描述
char ch = sym[0];
if (ch == '+') {
pop();
push('M');
push('T');
push('+');
strcpy(str, "M->+TM");
} else {
strcpy(str, "M->ε");
}
}
void T() { // 关于产生式 T->FK 的描述
char ch = sym[0];
if (ch == 'i' || ch == '(') {
push('K');
push('F');
strcpy(str, "T->FK");
} else {
printf("\nEERROR");
}
}
void K() { // 关于产生式 K->*FK | ε的描述
char ch = sym[0];
if (ch == '*') {
pop();
push('K');
push('F');
push('*');
strcpy(str, "K->*FK");
} else {
strcpy(str, "K->ε");
}
}
void F() { // 关于产生式 F->(E) | i 的描述
char ch = sym[0];
if (ch == 'i') {
pop();
push('i');
strcpy(str, "F->i");
} else if (ch == '(') {
pop();
push(')');
push('E');
push('(');
strcpy(str, "F->(E)");
} else {
printf("\nEERROR");
}
}
int main() {
char ch;
printf("\n递归下降分析算法\n");
int i, j = 0;
printf("\n%-6d%-20s%20s%10s", j, stack, sym, str);
j = j + 1;
ch = pop();
while (ch != '#') {
strcpy(str, "");
if (ch == 'i' || ch == '*' || ch == '+' || ch == '(' || ch == ')') { // 如果栈顶字符为文法终结符集VT
if (ch == sym[0]) {
i = 0;
while (sym[i]) {
sym[i] = sym[i + 1];
i++;
}
}
} else { // 如果栈顶字符为文法非终结符集VN
switch (ch) {
case 'E':
E();
break;
case 'M':
M();
break;
case 'T':
T();
break;
case 'K':
K();
break;
case 'F':
F();
break;
default:
printf("\nerror!\n");
return 1;
}
}
printf("\n\n%-6d%-20s%20s%10s", j, stack, sym, str);
j++;
ch = pop();
}
return 0;
}
```
阅读全文