编译原理简单计算器的编写

表达式计算器的设计与实现

一、            字符集定义

1. <字符> → <数字>│<单界符>│.

2. <数字> → 0│<非零数字>

3. <非零数字>→ 1│2│…│9

4. <单界符> →<运算符>│(│)

5. <运算符> → +│-│*│/

二、            单词集定义

6.<单词> → <单界符>│<常数>

7.<常数> → <无符号整数>│<无符号浮点数>

8.<无符号整数> →0│<非零整数>

9.<非零整数> → <非零数字> <数字串>

10.<数字串> → <数字> <数字串>│NULL

11.<无符号浮点数> →<无符号整数>. <数字> <数字串>

三、            数据类型定义

12.<类型> → intdouble

四、            表达式定义

13.<算术表达式> → <项> + <算术表达式>│<项> - <算术表达式>│<项>

14.<项> → <因子> * <项>│<因子> / <项>│<因子>

15.<因子> → <算数量>│- <因子>

16.<算术量> → <常数>│( <算术表达式> )

五、            表达式计算器的单词编码

单  词

种别码

 

单  词

种别码

 

单  词

种别码

+

1

/

4

(

6

-

2

无符号整数

5

)

7

*

3

无符号浮点数

8

 

 

实验一:表达式计算器的词法分析器的设计与实现

1、   根据上面给出的单词集定义,设计构造出该表达式计算器的DFA。(第一次上机课4学时,时间不够的课下完成)

2、   根据自己所设计构造的DFA,参考教材P39 3.2的内容,编写代码实现该DFA。(第二上机课4学时,时间不够的课下完成)

检查要求:

a)        启动程序后,先输出作者姓名、班级、学号(可用汉语、英语或拼音);

b)       请求输入测试程序名,键入程序名后自动开始词法分析并输出结果(输入为字符流,输出为单词串,即每个单词为一个节点,每个节点有种别码、字符串原貌、Value和Type等属性值,供语法分析和语义分析使用);

c)        输出结果为单词的多元(种别码,字符串原貌,Value属性,Type属性)式序列(样式见样板输出1);

d)       要求能发现下列词法错误和指出错误性质和位置:(样式见样板输出2)

非法字符,即不是表达式计算器字符集的符号;

发现错误后要能够继续编译下去,不能只报一个错误;

 

 

测试程序1程序文件名TEST1

10/((1.56-4)+0*-4+0.0000)

样板输出1:(要求在屏幕上显示)

( 5,10,10,int)

(4,/,NULL,NULL)

(6,(,NULL,NULL)

(6, (,NULL,NULL)

( 8,1.56,1.56,double)

(2,-,NULL,NULL)

( 5,4,4,int)

(7,),NULL,NULL)

(1,+,NULL,NULL)

(5,0,0,int)

(3,*,NULL,NULL)

(2,-,NULL,NULL)

(5,4,4,int)

(1,+,NULL,NULL)

(8,0.0000,0.0,double)

(7,),NULL,NULL)

 

 

测试程序2:程序文件名TEST2

8-4

10*[4.0/(3+-1.0)]

 

样板输出2:(要求在屏幕上显示)

(5,8,8,int)

(2,-,NULL,NULL)

(5,4,4,int)

(5,10,10,int)

(3,*,NULL,NULL)

(8,4.0,4.0,double)

(4,/,NULL,NULL)

(6,(,NULL,NULL)

(5,3,3,int)

(1,+,NULL,NULL)

(2,-,NULL,NULL)

(8,1.0,1.0,double)

(7,(,NULL,NULL)

ERROR:

Error1:2*后面存在非法字符“[”;

Error2:2行)后面存在非法字符“]

实验二:表达式计算器的语法、语义分析器的设计与实现(输出四元式的中间结果和最终的运算结果)。

在实验一词法分析的基础上,以词法分析输出结果(单词串或者成为多元式序列)作为该语法语义分析器的输入,最后输出中间代码四元式序列,并计算出表达式最后的结果。(共8个上机学时,时间不够的请自己课下找时间补完)

实现方法上,建议大家采用算符优先分析法或者LR分析方法,进行语法制导翻译。先根据上述文法中的“表达式定义”构造算符优先关系表或者LR分析表进行语法分析。

检查要求:

e)        启动程序后,先输出作者姓名、班级、学号(可用汉语、英语或拼音)。

f)        请求输入测试程序名,键入程序名后自动开始编译。

g)       输出四元式中间代码(样式见样板输出3)。

h)       能发现程序的语法错误并输出出错信息(样式见样板输出4)。

 

 

测试程序3:程序文件名TEST3

10/((1.56-4)+0*-4+0.0000)

 

样板输出3:(要求在屏幕上显示

( 0)  (-,1.56,4,t1)

( 1)  (@,4,NULL ,t2)

( 2)  (*,0,t2,t3)

( 3)  (+ ,t1,t3,t4)

( 4)  (+ ,t4,0.0000,t5)

( 5)  (/,10 ,t5 ,t6)

 

 

测试程序4:程序文件名TEST4

10/(1.56-4)+0*-4+0.0000)

样板输出4:(要求在屏幕上显示)

ERROR

Error1:1行右括号不匹配


解答和分析过程点击编译原理实验一分析


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值