编译原理之算符优先文法分析
——**学院1105班
安 雨 雅
班级:11** 学号:11****
1
实验 语法分析实验报告
一、实验题目
算符优先文法分析程序
二、实验内容及要求
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕和文件); (2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:(OPG文件中还有其他文法可作为测试)
B~BoT|T T~TaF|F F~nF|(B)|t|f (4)分析的句子为:
ntofat# 三、设计思想之重点:
? 构造算符优先表:①求FirstVT集和LastVT集
②判断是否是算符文法 ③判断是否是算符优先文法
? 算符优先分析: I、求最左素短语
II、根据算符优先分析表分析 (“<”或”=”时移进;“>”时归约)
2
stack
四、程序源代码(C语言)
#include \#include \#include \
#define STR_MAX 80 //串的最大长度 #define MAX_NUM 100 //符号的最大个数 #define MAX 32767 //文件中符号的最大个数 #define N 20 //栈的长度 class stack{ private: char s[N]; int top; public: stack(); void push(char); void pop(); int TOP(); char *S(); }; stack::stack() { top=-1; } void stack::push(char ch) { s[++top]=ch; s[top+1]='\\0'; } void stack::pop() { top--; } int stack::TOP() { return top; } char * stack::S() { return s; } //符号栈 //返回top的值 //返回s的值 //进栈操作 //出栈操作 //返回top的值 //返回s的值 3
stack
4
OG & OPG
char M[MAX_NUM][MAX_NUM]; struct PRO { //产生式类型 char left;
char right[STR_MAX]; };
struct VNstru { char vn;
char firstVT[MAX_NUM]; char lastVT[MAX_NUM]; };
char SOUR[STR_MAX]; //源文件名 char OBJ[STR_MAX]; //目标文件名 char ERR[STR_MAX]; //错误信息文件名 FILE *INF; //源程序文件指针 FILE *OUTF; //分析结果文件指针 FILE *ERRF; //错误信息文件指针
char OG[MAX]; //存放上下文无关文法 int OGlen; //上下文无关文法长度 VNstru VN[MAX_NUM]; //非终结符数组 int VN_CNT; //非终结符个数 char VT[MAX_NUM]; //终结符数组 int VT_CNT; //终结符个数 char S0; //开始符号 PRO P[MAX_NUM]; //产生式数组 int P_CNT; //产生式个数
bool isIN(char ch,VNstru arr[]); //判别符号ch是否在arr数组中 int isVN(char ch); //判别符号ch是否在VN数组中,存在则返回下标,否则返回-1 int isVT(char ch); //判别符号ch是否在VT数组中,存在则返回下标,否则返回-1 void getOG(); //从源文件取得OG文法串 void getVN_VT_S_P(); //从OG文法提取VN,VT,S,P void FirstVT(char ch,char firstVT[]); //求FirstVT[]集firstVT void LastVT(char ch,char lastVT[]); //求LastVT[]集lastVT bool O_G(); //判别是否是OG文法 bool O_P_G(); //判别是否是OPG文法
void leftphase(char str[],char substr[],char a); //求最左素短语substr void left_str(char w[],char subw[],int ip); //求剩余输入串subw
5