当前位置:
文档之家› 编译原理实验二语法分析器LL(1)实现
编译原理实验二语法分析器LL(1)实现
int op=0;//当前判断进度
char ch;//当前字符
char nowword[10]="";//当前单词
char operate[4]={'+','-','*','/'};//运算符
char bound[2]={'(',')'};//界符
struct Token
{
int code;
char ch[10];
{
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;
int i,flagpoint=0;
for(i=0;ivq;i++)
int op=0;//当前判断进度
char ch;//当前字符
char nowword[10]="";//当前单词
char operate[4]={'+','-','*',7'};//运算符
char bound[2]={'(',')'};//界符
struct Token
{
int code;
char ch[10];
编译原理程序设计实验报告
表达式语法分析器的设计
班级:计算机1306班 姓名:张涛学号:20133967
实验目标:用LL(1)分析法设计实现表达式语法分析器 实验内容:
⑴概要设计:通过对实验一的此法分析器的程序稍加改造,
使其能够输出正确的表达式的token序列。然后利用LL(1)
分析法实现语法分析。
⑵数据结构:
};//Token定义
struct Token tokenlist[50]; //Token数组
struct Token tokentemp;//临时Token变量
struct Stack//分析栈定义{
char *base;
char *top;
int stacksize;
};
⑶分析表及流程图
LL(1)分析表:
if(isspace(ch=fgetc(fp)));
else{
sour[q]=ch;
q++;
}
}
}
int p=0;
printf("输入句子为:\n");
for(p;pv=q;p++)
printf("%c",sour[p]);
}
printfC'n");
int state=0,nowlen=0;
BOOLEAN OK=TRUE,ERR=FALSE;
for(i=0;iv2;i++)
{
if(ch==bound[i])
{
return i+1;
}
}
return 0;
}
int lsoperate(char ch) //判断是否为运算符
{
int i;
for(i=0;iv4;i++)
n i+3;
}
}
return 0;
};//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 main()
{
FILE *fp;
int q=O,m=O;
char sour[200]="";
printf("请将源文件置于以下位置并按以下方式命名:
if((fp=fopen("F:\\2.txt","r"))==NULL) {
printf("文件未找到!\n");
}
else{
while(!feof(fp)){
Begi n
⑷关键函数:
int lsLetter(char ch) //判断ch是否为字母
int IsDigit(char ch)〃判断ch是否为数字
int lskey(char *string)〃判断是否为关键字
int lsbound(char ch) //判断是否为界符
int lsboundnum(char ch) //给出界符所在token值
return 1;
return 0;
}
int IsDigit(char ch) //判断ch是否为数字
{
int i;
for(i=0;iv=10;i++)
if (ch>='0'&&chv='9')
return 1;
return 0;
}
int Isbound(char ch) //判断是否为界符
{
int i;
}
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)//压栈操作
(*s).stacksize+=10;
}
*(*s).top=ch;
*(*s).top++;
return 1;
}
void LL1();
int IsLetter(char ch)//判断ch是否为字母
{
int i;
for(i=0;iv=45;i++)
if ((ch>='a'&&chv='z' )|| (ch>='A‘&&chv='Z'))
int init(STack *s)//栈初始化
int pop(STack *s,char *ch)//弹栈操作
int push(STack *s,char ch)〃压栈操作
void LL1();//分析函数
源程序代码:(加入注释)
#includevstdio.h> #includevstring.h> #includevctype.h> #includevwindows.h> #include vstdlib.h>