⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 语法分析.cpp

📁 用C++语言编程实现语法分析器的功能,代码完整,运行正常
💻 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 + -