资源描述:
《编译原理实验4算符优先算法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一、实验目的与任务算术表达式和赋值语句的文法可以是(你可以根据需要适当改变):S→i=EE→E+E
2、E-E
3、E*E
4、E/E
5、(E)
6、i根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一组基本操作,每一基本操作用四元式表示。二、实验涉及的相关知识点算符的优先顺序。三、实验内容与过程如参考C语言的运算符。输入如下表达式(以分号为结束):(1)a=10;(2)b=a+20;注:此例可以进行优化后输出(不作要求):(+,b,a,20)(3)c=(1+2)/3+4-(5+6/7);四、实验结果及分析(1)输出:(=,a,10,-)(2)输出:(
7、=,r1,20,-)(+,r2,a,r1)(=,b,r2,-)(3)输出:(+,r1,1,2)(/,r2,r1,3)(/,r3,6,7)(+,r4,5,r3,)(+,r5,r2,4)(-,r6,r5,r4)(=,c,r6,-)五、实验有关附件(如程序、附图、参考资料,等)//程序功能://根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。//文法:E→E+E
8、E-E
9、E*E
10、E/E
11、(E)
12、i//其中i为无符号整数////例://输入:10;//输出:正确//输入:1+2;//输出:正确//输入:(1+2)/3+4-(5+6/
13、7);//输出:正确//输入:((1-2)/3+4;//输出:错误////输入测试数据保存在同目录的文本文件testin.txt中,保存格式://表达式行;//表达式行;//.....//预期的输出保存在同目录的文本文件testout.txt中,保存格式://表达式行;//正确/错误//表达式行;//正确/错误//...../////////////////////////////////////////////////////////////////#include"stdio.h"#include"stdlib.h"#defineTRUE
14、1#defineFALSE0//文件信息:#defineTESTIN_FILENAME"testin.txt"#defineTESTOUT_FILENAME"testout.txt"FILE*fTestIn;FILE*fTestOut;//打开文件后的柄//运算符定义:#defineO_NUMBER8//运算符个数,+-*/()i##defineO_PLUS0//加+#defineO_MINUS1//减-#defineO_TIMES2//乘*#defineO_SLASH3//除/#defineO_L_PAREN4//左括号(parenthes
15、is)#defineO_R_PAREN5//右括号#defineO_IDENT6//标识符#defineO_NUL7//语法界符#//表达式缓冲区:由专门函数操作(ReadFormula(),GetChar())#defineBUFFER_SIZE1000//表达式缓冲区大小charBuffer[BUFFER_SIZE];//表达式缓冲区,以' '表示结束intipBuffer=0;//表达式缓冲区当前位置序号//算符优先关系表:charO_Table[O_NUMBER][O_NUMBER]={{'>','>','<','<','<','>
16、','<','>'},{'>','>','<','<','<','>','<','>'},{'>','>','>','>','<','>','<','>'},{'>','>','>','>','<','>','<','>'},{'<','<','<','<','<','=','<','-'},{'>','>','>','>','-','>','-','>'},{'>','>','>','>','-','>','-','>'},{'<','<','<','<','<','-','<','='}};//优先关系表:八个字符分别是+-*/()i#,
17、其中'-'表示出错//文法:#defineOG_NUMBER6//文法个数charOG[OG_NUMBER][4]={"E+E","E-E","E*E","E/E","(E)","i"};//文法右部//单词序列存放格式定义:#defineTOKEN_MAX_LENTH100//最大的单词长度+1typedefstruct{charch;//存放字符:+-*/()i#EintNo;//存放算符优先关系表中的序号//doubleValue;//当ch==i时,且为数值时,存放值的大小}SToken;#defineMAX_TOKEN_NUMBER
18、1000//在一个表达式中允许最大的单词个数STokenToken[MAX_TOKEN_NUMBER];//单词序列,最后一个以“#”结束intTokenNumbe