编译原理 算符优先

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

xxx大学编译原理实验报告

年级08级学号xxxxxxxxx姓名xxxx 成绩___________

专业08级计科2班实验地点B3-217 指导教师李凯

实验项目算符优先分析法分析器的设计实验日期2011.5.5

一、实验目的

设计一个算符优先分析器,理解优先分析方法的原理。

二、实验原理

优先分析方法的原理构造算符优先关系。使用算符优先分析算法分析下面的文法:

E’→#E#

E →E+T | T

T →T*F | F

F →P^F | P

P →(E) | i

其中i可以看作是一个终结符,无需作词法分析。

三、实验要求

1、如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况;

2、如果输入符号串不是正确句子,则指示出错位置。

四、实验结果(程序)与分析

#include "stdio.h"

#include "stdlib.h"

#include "iostream.h"

char data[20][20]; //算符优先关系

char s[100]; //模拟符号栈s

char lable[20]; //文法终极符集

char input[100]; //文法输入符号串

char string[20][10]; //用于输入串的分析

int k;

char a;

int j;

char q;

int r; //文法规则个数

int r1; //转化后文法规则个数

char st[10][30]; //用来存储文法规则

char first[10][10]; //文法非终结符FIRSTVT集

char last[10][10]; //文法非终结符LASTVT集

int fflag[10]={0}; //标志第i个非终结符的FIRSTVT集是否已求出

int lflag[10]={0}; //标志第i个非终结符的LASTVT集是否已求出

int deal(); //对输入串的分析

int zhongjie(char c); //判断字符c是否是终极符

int xiabiao(char c); //求字符c在算符优先关系表中的下标

void out(int j,int k,char *s); //打印s栈

void firstvt(char c); //求非终结符c的FIRSTVT集

void lastvt(char c); //求非终结符c的LASTVT集

void table(); //创建文法优先关系表

int main()

{int i,j,k=0;

printf("请输入文法规则数:");

scanf("%d",&r);

printf("请输入文法规则:\n");

for(i=0;i

{ scanf("%s",st[i]); //存储文法规则,初始化FIRSTVT集和LASTVT集*/

first[i][0]=0; /*first[i][0]和last[i][0]分别表示st[i][0]非终极

符的FIRSTVT集和LASTVT集中元素的个数*/

last[i][0]=0;

}

for(i=0;i

{ for(j=0;st[i][j]!='\0';j++)

{

if(st[i][0]<'A'||st[i][0]>'Z')

{ printf("不是算符文法!\n");

exit(-1);

}

if(st[i][j]>='A'&&st[i][j]<='Z')

{if(st[i][j+1]>='A'&&st[i][j+1]<='Z')

{ printf("不是算符文法!\n");

exit(-1);

}

}

}

}

for(i=0;i

{ for(j=0;st[i][j]!='\0';j++)

{ if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|') lable[k++]=st[i][j];

}

}

lable[k]='#';

lable[k+1]='\0';

table();

printf("每个非终结符的FIRSTVT集为:\n"); //输出每个非终结符的FIRSTVT集for(i=0;i

{ printf("%c: ",st[i][0]);

for(j=0;j

{ printf("%c ",first[i][j+1]);

}

printf("\n");

}

printf("每个非终结符的LASTVT集为:\n"); //输出每个非终结符的LASTVT集for(i=0;i

{printf("%c: ",st[i][0]);

for(j=0;j

{ printf("%c ",last[i][j+1]);

}

printf("\n");

}

printf("算符优先分析表如下:\n");

for(i=0;lable[i]!='\0';i++)

printf("\t%c",lable[i]);

printf("\n");

for(i=0;i

{ printf("%c\t",lable[i]);

for(j=0;j

{ printf("%c\t",data[i][j]);

}

printf("\n");

}

printf("请输入文法输入符号串以#结束:");

scanf("%s",input);

deal();

}

void table()

{char text[20][10];

int i,j,k,t,l,x=0,y=0;

int m,n;

x=0;

for(i=0;i

{ firstvt(st[i][0]);

lastvt(st[i][0]);

}

for(i=0;i

{ text[x][y]=st[i][0];

y++;

for(j=1;st[i][j]!='\0';j++)

相关文档
最新文档