编译原理实验二语法分析器LL(1)实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理程序设计实验报告

——表达式语法分析器的设计班级:计算机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++)

相关文档
最新文档