编译原理文法分析【已解决】

构造文法G[E]的LL(1)分析表:
G[E]:
E®TM
M®+TM|e
T®FN
N®*FN|e
F®(E)|i
代码实现

 

运行结果:

 

网友的代码实现有些问题,经我修改后,实现如下:(大部分均由原作者编写)

 

 

// grammar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

char * spush(char *stack,char *pt);
bool analyse(char *p);

void main()
{
 //将分析串存放在二维数组中
 char input[5][10]={"i+i#",
  "i*(i+i)#",
  "i*i+i#",
  "i+*#",
  "+i*i#"};
 bool flag; //定义一个布尔型的标记量
 for(int h=0;h<5;++h)
 {
  flag=analyse(input[h]);
  if(flag) cout<<"恭喜你!"<<input[h]<<"语法分析成功,合法!"<<endl;
  else cout<<"对不起!"<<input[h]<<"语法分析失败,非法!"<<endl;
 }
 int aaa;
 cin>>aaa;
}
//定义各一将串逆序入栈的函数
char * spush(char *stack,char *pt)
{
 int l=0;
 //while循环的作用是将指针指向字符串的末尾,然后再由后向前入栈,从而实现逆序
 while(*pt!='/0')
 {
  pt++;
  l++;
 }
 
 if (*stack == '#')
 {
  stack++;
 }
 while(l)
 {
  pt--;
  char cTempIntoStack = (*pt);
  *stack=cTempIntoStack;
  stack++;
  l--;
 }
 stack--;  //由于前面向前加了一位,要返回
 
 return stack;
 ///

}

/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/

//分析函数
bool analyse(char *p){
 char analyseTable[5][6][4]={
  "TM", "", "", "TM", "", "",
  "i", "", "", "(E)", "", "",
  "", "+TM", "", "", "e", "e",
  "", "e", "*FN", "", "e", "e",
  "FN", "", "", "TN", "", ""
 };
 char *stack = new char[50]; //定义一个栈空间
 for (int iStack = 0;iStack<50 ;iStack++)
 {
  stack[iStack] = 0;
 }
 char *s=stack; //用指针*s指向栈的起始地址
 *s='#'; //将“#”入栈
 s++; //指针加1
 *s='E'; //将“E”入栈
 //下面的while循环实现字符串的词法分析操作


 while(*s!='#' || *p!='#'){

  int x,y;
  //若果栈顶数据和分析串的字符匹配,则将符号栈的栈顶数据出栈(即将栈顶指针减1)
  if(*s==*p){
   s--;
   p++;
  }
  //当符号栈和分析串的字符不匹配时,查分析表
  else {
   switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
   }
   switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
   }
  //若果对应的为空,则分析串非法,退出
  if(analyseTable[x][y][0]=='/0') return false;
  //若查表所对应的为'e',则将符号栈的栈顶数据出栈
  else if(analyseTable[x][y][0]=='e') s--;
  //其它,这时将查表所得的项逆序入符号栈
  else {
   s=spush(s,analyseTable[x][y]);
   }
  }
 }
  return true; //分析成功,返回
}

实验2 文法的读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法在计算机内的表示方法。 二、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件中读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号集合,在实验中用大写的英文字母表示; Vt 文法的终结符号集合,在实验中用小写的英文字母表示; S 开始符号,在实验中是Vn集合中的一个元素; P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件中读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值