📄 语法分析.cpp
字号:
#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 *p=stack;
while(*p) p++;
*p++=ch;
*p='\0';}
char pop() /* 实现将stack栈栈顶的字符弹出给CH,并返回CH值 */
{ char *p=stack,ch;
while(*p) p++;
p=p-1;
ch=*p;
*p='\0';
return ch;}
void E() /* 关于产生式 E->Te 的描述*/
{ push('e');
push('T');
strcpy(str,"E->te");}
void e( )/* 关于产生式 e->+te | ε的描述*/
{ char *p;
p=sym;
strcpy(str,"e->ε");
if (*sym=='+')
{push('e');
push('T');
push('+');
strcpy(str,"e->+te");}
}
void T( )/* 关于产生式 T->Ft 的描述*/
{ push('t');
push('F');
strcpy(str,"T->Ft");}
void t()/* 关于产生式 t->*Ft | ε的描述*/
{ char *p;
p=sym;
strcpy(str,"t->ε");
if(*sym=='*')
{ push('t');
push('F');
push('*');
strcpy(str,"t->*Ft");}
}
void F()/* 关于产生式 F->(E) | i的描述*/
{ char *p;
p=sym;
if(*p=='(') { push(')');
push('E');
push('(');
strcpy(str,"F->(E)");}
else if(*p=='i') {push('i'); strcpy(str,"F->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 ERROR ");
else/* 如果栈顶字符为文法非终结符集VN*/
switch(ch)
{case 'E':E();break;
case 'e':e();break;
case 'T':T();break;
case 't':t();break;
case 'F':F();break;
default : printf("\n error!\n");}
printf("\n %-6d%-20s%20s%10s",j,stack,sym,str);
j++;
ch=pop();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -