编译原理可编程计算器.docx
- 文档编号:4495132
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:12
- 大小:186.91KB
编译原理可编程计算器.docx
《编译原理可编程计算器.docx》由会员分享,可在线阅读,更多相关《编译原理可编程计算器.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理可编程计算器
郑州大学软件学院
可编程计算器(项目报告)
专业:
计算机辅助设计专业
院(系):
软件学院
学生姓名:
古双军学号:
20097720219
学生姓名:
孔德汉学号:
20097720225
学生姓名:
孟晓帆学号:
20097720240
学生姓名:
周干学号:
20097720267
完成时间:
2012年6月18日
年月日
1、编译器的功能
支持数值运算、逻辑运算和字符串运算,不区分大小写。
其中优先级定义
+-
*/%mod
>>=<<====<>!
=
&&&|||andornotxor
^
sincosminmaxleftrightabsifroundpi
可实现自顶向下的词法运算。
1)词法分析
TokenKeywordFactory:
用于处理关键字
TokenSymbolFactory:
用于处理运算符
TokenStringFactory:
用于处理字符串
TokenNumberFactory:
用于处理数字
这里的处理过程是
1.取字符“1”,转到TokenNumberFactory,把分析取到的字符串“123.3”转换为TokenNumber并存到TokenList中
2.取字符“*”,转到TokenSymbolFactory,把“*”转换成TokenMultiply并存到TokenList中
3.取字符“2”,转到TokenNumberFactory,把分析取到的字符串“2”转换为TokenNumber并存到TokenList中
4.取字符“-”,转到TokenSymbolFactory,把“-”转换成TokenMinus并存到TokenList中
5.取字符“(”,转到TokenSymbolFactory,把“(”转换成TokenLeftBracket并存到TokenList中
6.取字符“2”,转到TokenNumberFactory,把分析取到的字符串“24”转换为TokenNumber并存到TokenList中
7.取字符“+”,转到TokenSymbolFactory,把“+”转换成TokenPlus并存到TokenList中
8.取字符“3”,转到TokenNumberFactory,把分析取到的字符串“34”转换为TokenNumber并存到TokenList中
9.取字符“)”,转到TokenSymbolFactory,把“)”转换成TokenRightBracket并存到TokenList中
2)语法分析
1.列表分析状态:
TokenValue(3)
TokenMultiplay
TokenValue(7)
…...
TokenValue(3)
栈底
堆栈分析:
当前堆栈为空,将当前分析的TokenRecord压栈。
对应列表
2.列表分析状态:
TokenValue(3)
TokenMultiply
TokenValue(7)
…...
TokenMultiply
栈底
堆栈分析:
栈顶为TokenValue,当前TokenRecord为TokenMultiply,TokenValue优先级最高。
遵循高出低入原则,将TokenValue弹栈并添加到TokenMultiply的ChildList中,然后将TokenMultiplay压栈。
3.列表分析状态
...
TokenMultiply
TokenValue(7)
TokenPlus
…...
堆栈分析:
栈顶为TokenMultiplay,当前TokenRecord为TokenValue,TokenMultiply优先级高于TokenValue,则将TokenValue加入TokenMultiplay的ChildList中。
4.列表分析状态
……
TokenValue(7)
TokenPlus
TokenValue(56)
…...
TokenPlus
栈底
堆栈对应视图
5.列表分析状态
…
TokenPlus
TokenValue(56)
TokenDivide
…...
TokenValue(56)
TokenPlus
栈底
堆栈分析:
栈顶为TokenPlus,当前TokenRecord为TokenValue,TokenPlus优先级低于TokenValue。
遵循高出低入原则,不需要弹栈,直接将TokenValue压栈。
堆栈对应视图
6.列表分析状态
……
TokenValue(56)
TokenDivide
TokenValue(8)
…...
TokenDivide
TokenPlus
栈底
堆栈分析:
栈顶为TokenValue,当前TokenRecord为TokenDivide,TokenValue优先级高于TokenDivide。
遵循高出低入原则,将TokenValue弹栈并加入TokenDivide的ChildList中。
此时栈顶为TokenPlus,TokenDivide优先级高于TokenPlus,遵循高出低入原则,将TokenDivide压栈。
堆栈对应视图
7.列表分析状态
……
TokenDivide
TokenValue(8)
TokenMinus
…...
TokenDivide
TokenPlus
栈底
堆栈分析:
栈顶为TokenDivide,当前TokenRecord为TokenValue,TokenDivide优先级高于TokenValue。
遵循高出低入原则,将TokenValue加入TokenDivide的ChildList中
堆栈对应视图
8.列表分析状态
…
TokenValue(8)
TokenMinus
TokenValue
(2)
……
堆栈分析:
栈顶为TokenDivide,当前TokenRecord为TokenMinus,TokenDivde优先级高于TokenMinus。
遵循高出低入原则,将TokenDivide弹栈到临时变量。
检测到堆栈不为空,此时栈顶为TokenPlus,TokenPlus优先级和TokenMinus一样。
这里相同优先级的按高优先级处理,遵循高出低入原则,则将临时变量中的TokenDivide加入高优先级TokenPlus的ChildList中。
继续用高出低入原则,将TokenPlus弹栈并加入TokenMinus的ChildList中,再将TokenMinus压栈。
TokenMinus
栈底
堆栈对应视图
9.列表分析状态
……
TokenMinus
TokenValue
(2)
TokenMultiply
…...
TokenValue
(2)
TokenMinus
栈底
堆栈分析:
栈顶是TokenMinus,当前TokenRecord是TokenValue,TokenMinus优先级低于TokenValue。
遵循高出低入原则,将TokenValue压栈。
堆栈对应视图
10.列表分析状态
……
TokenValue
(2)
TokenMultiply
TokenValue(5)
TokenMultiply
TokenMinus
栈底
堆栈分析:
栈顶是TokenValue,当前TokenRecord是TokenMultiply,TokenValue优先级高于TokenMultiply。
遵循高出低入原则,将TokenValue弹栈到临时变量,检测堆栈不为空,此时栈顶为TokenMinus,TokenMinus优先级低于TokenMultiply,则将临时变量中的TokenValue加入TokenMultiplay的ChildList中。
遵循高出低入原则,将TokenMultiplay加入到栈顶TokenMinus的ChildList中。
堆栈对应树视图:
11.列表分析状态
……
TokenValue
(2)
TokenMultiply
TokenValue(5)
TokenMultiply
TokenMinus
栈底
堆栈分析:
栈顶是TokenMultiply,当前是TokenValue,TokenMultiply优先级高于TokenValue。
遵循高出低入原则,将TokenValue加入TokenMultiply的ChildList中。
堆栈对应视图
12.列表分析状态
此时列表分析结束,堆栈不为空,需要对堆栈进行处理。
经过上面的堆栈分析,遵循高出低入原则,堆栈中的TokenRecord肯定是栈底优先级最低,栈顶优先级最高。
只需要将堆栈中的TokenRecord依次弹栈,然后加入到新栈顶的ChildList中即可。
最后弹栈的一个TokenRecord就是整个树视图的根节点,也就是返回值。
到此,堆栈为空,也得到了预期的树视图,返回根节点TokenRecord即可。
2、使用说明
在左侧计算表达式一栏中选择计算所需要的关键字和运算符,即可计算出结果
(支持多行运算)
在执行完运行结果后,可点击右侧语法树分析一栏观看语法书运算顺序。
3、编译技术
本编译器采用C#编写
核心代码为:
///
///表达式分析计算类,功能入口
///
///
AlexLeo
publicclassSyntaxAnalyse
{
///
///构造函数
///
///
AlexLeo;Date:
2007-8-2
publicSyntaxAnalyse()
{}
///
///分析语句并返回记号记录对象
///
///
///
publicTokenRecordAnalyse(stringCode)
{
if(Code.Trim().Equals(string.Empty))
{
returnnewTokenValue(0,1);
}
List
intintIndex=0;
TokenFactory.LexicalAnalysis(ListToken,Code,refintIndex);//词法分析,将代码转换为TokenRecord列表
//语法树分析,将Token列表按优先级转换为树
TokenRecordTokenTop=SyntaxTreeAnalyse.SyntaxTreeGetTopTokenAnalyse(ListToken,0,ListToken.Count-1);
TokenTop.Execute();
returnTokenTop;
}
首先是词法分析,得到一个记号对象列表List
接下来执行顶级节点的Execute方法,该方法中首先会执行下级节点的Execute方法,然后再针对下级节点的值执行自身的运算。
所有的TokenRecord都是这样的模式,逐级递归调用,最后得到计算结果。
TokenRecord基类中包含一个object类型的Value属性和一个Type类型的TokenValueType属性,通过这两个属性可以得到具体的值及其类型,然后做下一步处理。
因为这里不只能执行数学运算,还能做字符串和逻辑值运算,所以必须通过TokenValueType来确定值的类型。
4、项目技术总结
本次实验设计的简单可编程计算器可以实现简单算术表达式的计算,且计算结果与预期结果一致。
并能实现常见数学符号的插入以及语法树分析和显示。
总体来说还是较为精简和实用的。
友情提示:
范文可能无法思考和涵盖全面,供参考!
最好找专业人士起草或审核后使用,感谢您的下载!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 可编程 计算器
![提示](https://static.bdocx.com/images/bang_tan.gif)