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

内容发布更新时间 : 2024/11/14 15:36:22星期一 下面是文章的全部内容请认真阅读。

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

——表达式语法分析器的设计

班级:计算机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; };

⑶分析表及流程图

BeginPUSH(#),PUSH(E)NEXT(w)yPOP(x)x=wnerrx∈VNnnW=#空?yenderrx∈VTny查LL(1)分析表PUSH(i)逆序压栈

⑷关键函数:

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(\ 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;

return 0; }

int IsDigit(char ch) //判断ch是否为数字 { int i;

for(i=0;i<=10;i++)

return 1; return 0; }

int Isbound(char ch) //判断是否为界符 { int i;

for(i=0;i<2;i++)

if (ch>='0'&&ch<='9') for(i=0;i<=45;i++)

if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

return 1;