编译原理 算符优先
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++)