内容发布更新时间 : 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
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;