编译原理实验——算符优先算法

这是一个使用C语言实现的算符优先算法,用于处理和验证算符优先文法。程序包括了初始化堆栈、计算FIRSTVT和LASTVT集、构造优先关系表等功能,可以分析输入的文法并判断其是否符合算符优先规则。
摘要由CSDN通过智能技术生成

 /*本实验参照学校实验报告册的算法所作,行事仓促,有很多不足,望加指正*/

/*验证文法1:
  E->E+T|T
  T->T*F|F
  F->(E)|a
  语句示例:a+a$

  验证文法2:
  S->a|b|(T)
  T->T,S|S
  语句示例:(a,(a,a))$

  因未加入对'|'的拆分,所以输入文法是需手动拆分产生式.
  本程序所输文法,必须为算符优先文法
*/

/*结束符号是$;
  vn[]中第一个字符是开始符号;
  FIRST集、FOLLOW集和优先分析表T的字符顺序和vt[]及vn[]一致
*/

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<malloc.h>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define N 200
#define Y 10
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

int vtnum,vnnum,pronum;//依次是终结符、非终结符、产生式个数
int FIRST[N][N];//FIRSTVT集     
int LAST[N][N];//LASTVT集       
int T[N][N];//优先关系表        
char vt[N];           
char vn[N]; //终结符和非终结符集
char old[N][N];//用于存储产生式

typedef struct{
  char VN;
  char VT;
}SqE;

typedef struct{
  SqE *base;
  SqE *top;
  int  stacksize;
}SqStack;//定义堆栈用于求FIRSTVT和LASTVT

void InitStack(SqStack &);
void Push(SqStack &,char,char);
int Pop(SqStack &,char &,char &);
bool Empty(SqStack &);
void first();
int test(char);
void insertf(char,char,SqStack &);
void last();
int tail(int);
void insertl(char,char,SqStack &);
void printf_ff();
void table();
void printf_t();
int control();

void main()
{
   int i,j;
   ifstream in("input1.txt",ios_base::in);
   for(i=0;i<N;i++)
      for(j=0;j<N;j++)
      old[i][j]='/0';
   in>>pronum>>vnnum>>vtnum;
   in>>vn;
   in>>vt;
  
   for(i=0;i<pronum;i++)
      in>>old[i];//从文件中读入pronum,vtnum,vnnum以及产生式

   for(i=0;i<vnnum;i++)
      for(j=0;j<vtnum;j++)
      FIRST[i][j]=0;
   for(i=0;i<vnnum;i++)
      for(j=0;j<vtnum;j++)
      LAST[i][j]=0;//初始化FIRSTVT和LASTVT,0意味着不存在
   for(i=0;i<N;i++)
      for(j=0;j<N;j++)
      T[i][j]=3;//初始化T[][],3意味着不存在
  
   first();
   last();
   printf_ff();
   table();
   printf_t();
   control();
 

}

void InitStack(SqStack &S1)//堆栈操作,分别是初始化堆栈,压栈,弹出栈顶元素和判断是否为空
{ <

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值