编译原理-实验3算符优先分析法

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

实验3《算符优先分析法设计与实现》实验学时: 2 实验地点:实验日期:

一、实验目的

加深对语法分析器工作过程的理解;加强对算符优先分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。

二、实验内容

在实验1的基础上,用算符优先分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。

三、实验方法

先在算符栈置“$”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操作数栈,然后继续读下一个单词符号。分析过程从头开始,并重复进行;若读来的是运算符θ2则将当前处于运算符栈顶的运算符θ1的入栈优先数f与θ2的比较优先函数g进行比较。

四、实验步骤

1.定义目标语言的语法规则;

2.求解预测分析方法需要的符号集和分析表;

3.依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源程序结

束;

4.对遇到的语法错误做出错误处理。

五、实验结果

六、实验结论

#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;

int m,n,N; //转化后文法规则个数

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(); //创建文法优先关系表

void 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

{

相关文档
最新文档