编译原理语法分析算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二语法分析程序
一、实验目的
通过设计调试算符优先分析程序,加深对课堂教学的理解,深刻理解自底向上语法分析方法的归约过程,提高语法分析方法的实践能力。
二、实验内容及要求
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);
(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4)分析的句子为:
(i+i)*i和i+i)*i
三、程序源代码:
#include "iostream.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "string.h"
#define MAX_V ALUE 100
#define STACK_INIT_SIZE 100
char VN[MAX_V ALUE]; //非终结符数组
char VT[MAX_V ALUE]; //终结符数组
static int current=1; //当前输入符
struct CSS
{
char s[MAX_V ALUE];
struct CSS *next;
};
struct ARRAY
{
char VN;
char VT;
int value;
}F[MAX_V ALUE],L[MAX_V ALUE];//布尔数组F[A,a],L[A,a]
struct ARRAY1
{
char VT1;
char VT2;
char relation;
}PT[MAX_V ALUE]; //定义优先关系结构体数组
struct ARRAY2
{
char VN;
char VT[MAX_V ALUE];
}FIRSTVT[MAX_V ALUE],LASTVT[MAX_V ALUE]; //FIRSTVT集合和LASTVT集合
struct SElemType
{
char VN;
char VT;
};
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
void InitStack(SqStack &S) //对栈进行初始化
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base)
{
cout<<"存储分配失败!"< exit(0); } S.top=S.base; S.stacksize=STACK_INIT_SIZE; } int StackEmpty(SqStack &S) //判断栈是否为空 { if (S.top==S.base) return 0; else return 1; } void Push(SqStack &S,SElemType e)//入栈 { *S.top++=e; } void Pop(SqStack &S,SElemType &e)//出栈,并用e返回值 { if (S.top==S.base) { cout<<"栈空!"< exit(0); } e=*--S.top; } struct CSS * ReadFromFile() { struct CSS *head; struct CSS *p1,*p2; p1=p2=(struct CSS *)malloc(sizeof(struct CSS)); head=NULL; int n=0; FILE *fp; char S[MAX_V ALUE]; cout<<"请输入文件名:"; cin>>S; if((fp=fopen(S,"r"))==NULL) { cout<<"Can not open the file!"< exit(0); } else {//从文件中读取文法 char ch=fgetc(fp); while(!feof(fp)) { int i=0; while(ch!=10) //为回车键时,作为一个产生式的结束 { while(ch==32)//过滤掉空格 ch=fgetc(fp); p1->s[i++]=ch; ch=fgetc(fp); } n=n+1; if (n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct CSS *)malloc(sizeof(struct CSS)); ch=fgetc(fp); } p2->next=NULL; return(head); } } struct CSS *creat()//创建结构体链表来存储输入的文法 { struct CSS *head; struct CSS *p1,*p2; int n=0; cout<<"请输入文法:"< p1=p2=(struct CSS *)malloc(sizeof(struct CSS)); cin>>p1->s; head=NULL; while(strcmp(p1->s,"exit")) { n=n+1; if (n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct CSS *)malloc(sizeof(struct CSS)); cin>>p1->s; } p2->next=NULL; return(head); } struct CSS * Select() { struct CSS *p; cout<<"读取方式:1.从文件读取;2.从键盘读取"< cout<<"请选择:"; char sLetter;