资源描述:
《编译原理实现一个简单的计算器程序.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《编译原理》实验报告专业:学号:班级:姓名:实验题目:设计,实现一个简单的计算器程序实验时间:指导教师:实验成绩:1实验目的1.1实现一个简单计算器2实验要求2.1单词的构词规则有明确的定义;2.2编写的分析程序能够正确识别源程序中的语法符号;2.3计算器源程序的以.c格式输出2.4对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析,语法分析;2.5计算器能够实现加,减,乘,除,混合运算,多项式运算。3实验环境3.1WindowsXP3.2Flex词法分析工具3.3
2、VisualStudioC++6.04实验原理4.1多项式计算器的实现,采用后缀表达式来对输入的计算表达式进行计算4.2对后缀表达式进行符号识别,词法分析,语法分析4.3编写计算器的源程序,使用Flex工具生成计算器的C语言程序4.4对生成的程序进行相应的修改,再进行编译,连接,运行,测试得到可以用于进行多项式运算的源程序。5软件设计与编程5.1程序源代码:5.2新建文件夹5.3将Flex工具复制到该文件夹下5.4在DOS环境学生成目标源程序5.5在Visual StudioC++6.0环境下进行相应的修改,添加m
3、ain方法和打开文件的方法6程序测试结果6.1编写源代码6.2使用Flex生成C代码:6.3在VisualStudioC++6.0上运行生成的”.c”文件文件:y.ta.h#ifndefYYTOKENTYPE#defineYYTOKENTYPEenumyytokentype{CLEAR=258,EXIT=259,LIST=260,ERASE=261,DEC=262,HEX=263,OCT=264,HELP=265,NUM=266,REG=267,ADD=268,SUB=269,MUL=270,DIV=271,MOD
4、=272,LSHIFT=273,RSHIFT=274,AND=275,OR=276,NOT=277,LESS=278,MORE=279,BITAND=280,BITOR=281,BITXOR=282,BITREV=283,SIN=284,COS=285,TAN=286,ABS=287,SQRT=288,LOG=289,RMINUS=290};//前面定义过,此处省略宏定义#if!defined(YYSTYPE)&&!defined(YYSTYPE_IS_DECLARED)typedefintYYSTYPE;#def
5、ineyystypeYYSTYPE/*obsolescent;willbewithdrawn*/#defineYYSTYPE_IS_DECLARED1#defineYYSTYPE_IS_TRIVIAL1#endifexternYYSTYPEyylval;文件:calc.l核心程序%{#defineYYSTYPEdouble#defineBIGINTlong#include#include"y.tab.h"%}digit[0-9]xdigit[0-9a-fA-F]odigit[0-7]decnum(
6、0(.{digit}+)?)
7、([1-9]{digit}*(.{digit}+)?)octnum0{odigit}+hexnum0(x
8、X){xdigit}+reg[a-zA-Z]opt1"+"
9、"-"
10、"*"
11、"/"
12、"&"
13、"
14、"
15、"%"
16、"^"
17、"~"
18、"!"
19、"<"
20、">"opt2(&&)
21、(
22、
23、)
24、(<<)
25、(>>)exit((E
26、e)(X
27、x)(I
28、i)(T
29、t))
30、((Q
31、q)(U
32、u)(I
33、i)(T
34、t))clear(C
35、c)(L
36、l)(E
37、e)(A
38、a)(R
39、r)list(L
40、l)
41、(I
42、i)(S
43、s)(T
44、t)erase(E
45、e)(R
46、r)(A
47、a)(S
48、s)(E
49、e)hex(H
50、h)(E
51、e)(X
52、x)oct(O
53、o)(C
54、c)(T
55、t)dec(D
56、d)(E
57、e)(C
58、c)help(H
59、h)(E
60、e)(L
61、l)(P
62、p)sin(S
63、s)(I
64、i)(N
65、n)cos(C
66、c)(O
67、o)(S
68、s)log(L
69、l)(O
70、o)(G
71、g)tan(T
72、t)(A
73、a)(N
74、n)abs(A
75、a)(B
76、b)(S
77、s)sqrt(S
78、s)(Q
79、q)(R
80、r)(T
81、t)%%inti;BIGINTval;["";t
82、]{}{decnum}{sscanf(yytext,"%lf",&yylval);return(NUM);}{octnum}{i=1;val=0;while(i