算符优先分析法实验报告
算符优先报告及代码
实验任务:
对下述描述算符表达式的算符优先文法G[E],给出算符优先分析的实验结果。
E-E+T|E-T|T T-T*F|T/F|FF-(E)|i
说明:
优先关系矩阵的构造过程:
(1) = 关系
由产生式 F-(E) 知 ‘(’=‘)’
FIRSTVT集
FIRSTVT(E)={ +,-,*,/,(,i }
FIRSTVT(F)={ (,i }
FIRSTVT(T)={ *,/,(,i }
LASTVT(E)={ +,-,*,/,),i }
LASTVT(F)={ ),i }
LASTVT(T)={ *,/,),i }
(2) 关系
+T 则有:+ FIRSTVT(T)
-T 则有:- FIRSTVT(T)
*F 则有:* FIRSTVT(F)
/F 则有:/ FIRSTVT(F)
(E 则有:( FIRSTVT(E)
(3) 关系
E+ 则有: LASTVT(E) +
E- 则有: LASTVT(E) -
T* 则有: LASTVT(T) *
T/ 则有: LASTVT(T) /
E) 则有: LASTVT(E) )
(4)优先关系矩阵
+ - */( ) i#
+
-
*
/
( =
)
i
# =
终结符之间的优先关系是唯一的,所以该文法是算符优先文法。
程序的功能描述:
程序由文件读入字符串(以#结束),然后进行算符优先分析,
分析过程中如有错误,则终止程序并报告错误位置,最终向屏幕
输出移近——规约过程。
程序结构描述
程序测试方案 测试用例一: b-b*a+7#
运行结果一:
测试用例二: a+b*c-b*(a-b)#
运行结果二:
分析成功。
篇二:C.4 算符优先分析法 实验报告
实 验 报 告
实验
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目:C.4 算符优先分析法
课程名称:编译原理
主讲教师: 班 级: 实验日期: 提交日期:
篇三:编译原理-实验3算符优先分析法
实验3《算符优先分析法
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
与实现》
实验学时: 2实验地点: 实验日期:
一、实验目的
加深对语法分析器工作过程的理解;加强对算符优先分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。 二、实验内容
在实验1的基础上,用算符优先分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。
三、实验
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
先在算符栈置“,”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操作数栈,然后继续读下一个单词符号。分析过程从头开始,并重复进行;若读来的是运算符θ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;ir;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;ir;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;ir;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); for(i=0;ir;i++)
{ printf(%c: ,st[i][0]); for(j=0;jfirst[i][0];j++) {printf(%c ,first[i][j+1]); } printf(\n); }
printf(每个非终结符的LASTVT集为:\n); for(i=0;ir;i++)
{ printf(%c: ,st[i][0]); for(j=0;jlast[i][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;ik+1;i++) { printf(%c\t,lable[i]); for(j=0;jk+1;j++) {printf(%c\t,data[i][j]); } printf(\n); }
//输出每个非终结符的FIRSTVT集//输出每个非终结符的LASTVT
集