编译原理实验二语法分析器LL(1)实现教学内容
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验二语法分析器L L(1)实现
编译原理程序设计实验报告
——表达式语法分析器的设计班级:计算机1306班姓名:张涛学号:20133967 实验目标:用LL(1)分析法设计实现表达式语法分析器实验内容:
⑴概要设计:通过对实验一的此法分析器的程序稍加改造,使其能够输出正确的表达式的token序列。然后利用LL(1)分析法实现语法分析。
⑵数据结构:
int op=0; //当前判断进度
char ch; //当前字符
char nowword[10]=""; //当前单词
char operate[4]={'+','-','*','/'}; //运算符
char bound[2]={'(',')'}; //界符
struct Token
{
int code;
char ch[10];
}; //Token定义
struct Token tokenlist[50]; //Token数组struct Token tokentemp; //临时Token变量struct Stack //分析栈定义
{
char *base;
char *top;
int stacksize;
};
⑶分析表及流程图
逆序压栈
int IsLetter(char ch) //判断ch是否为字母
int IsDigit(char ch) //判断ch是否为数字
int Iskey(char *string) //判断是否为关键字
int Isbound(char ch) //判断是否为界符
int Isboundnum(char ch) //给出界符所在token值int init(STack *s) //栈初始化
int pop(STack *s,char *ch) //弹栈操作
int push(STack *s,char ch) //压栈操作
void LL1(); //分析函数
源程序代码:(加入注释)
#include
#include
#include
#include
#include
int op=0; //当前判断进度
char ch; //当前字符
char nowword[10]=""; //当前单词
char operate[4]={'+','-','*','/'}; //运算符
char bound[2]={'(',')'}; //界符
struct Token
{
int code;
char ch[10];
}; //Token定义
struct Token tokenlist[50]; //Token数组struct Token tokentemp; //临时Token变量struct Stack //分析栈定义
{
char *base;
char *top;
int stacksize;
};
typedef struct Stack STack;
int init(STack *s) //栈初始化
{
(*s).base=(char*)malloc(100*sizeof(char)); if(!(*s).base)
exit(0);
(*s).top=(*s).base;
(*s).stacksize=100;
printf("初始化栈\n");
return 0;
}
int pop(STack *s,char *ch) //弹栈操作
{
if((*s).top==(*s).base)
{
printf("弹栈失败\n");
return 0;
(*s).top--;
*ch=*((*s).top);
printf("%c",*ch);
return 1;
}
int push(STack *s,char ch) //压栈操作
{
if((*s).top-(*s).base>=(*s).stacksize)
{
(*s).base=(char*)realloc((*s).base,((*s).stacksize+10)*sizeof(char));
if(!(*s).base)
exit(0);
(*s).top=(*s).base+(*s).stacksize;
(*s).stacksize+=10;
}
*(*s).top=ch;
*(*s).top++;
return 1;
}
void LL1();
int IsLetter(char ch) //判断ch是否为字母
{
int i;
for(i=0;i<=45;i++)
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
return 1;
return 0;
}
int IsDigit(char ch) //判断ch是否为数字
{
int i;
for(i=0;i<=10;i++)
if (ch>='0'&&ch<='9')
return 1;
return 0;
}
int Isbound(char ch) //判断是否为界符
{
int i;
for(i=0;i<2;i++)