编译原理-简单计算器(词法分析/语法分析)-含源码
发布日期:2021-06-29 14:41:24
浏览次数:2
分类:技术文章
本文共 1760 字,大约阅读时间需要 5 分钟。
参考文档:
这个计算器源码我上传到csdn上来,共享出来供有兴趣的同学参考
之前大学的时候,编译原理课程有一个做计算器的任务,当时没有做,只顾做一个漂亮计算器界面。
想来当时是买椟还珠了,有点小遗憾,觉得编译原理没有实践,没有理解透彻。
趁这周末有空,就把编译器重新做一做,下面是做出来的效果:
参照百度文库中的文章,实现词法分析器,和语法分析器
1. 界定实现范围
考虑主要是简单实践,所以只实现 正整数与浮点数的 + - * / ()
2. 实现词法分析器
分析出这几种词语,其他情况,认为是异常
enum EnumTokenType
{ enumTokenType_none= -1, // 未定义 enumTokenType_integer = 0, // 数字 enumTokenType_float= 1,// 浮点数 enumTokenType_add= 2,// 加号 enumTokenType_sub= 3,// 减号 enumTokenType_mul= 4,// 乘号 enumTokenType_div = 5,// 除号 enumTokenType_lbt = 6,// 左括号 enumTokenType_rbt = 7,// 右括号 };struct CalcToken
{ EnumTokenType type; TokenData data; };union TokenData
{ TCHAR cChar; int nInteger; double fFloat;// 数字 double: 精度52Bit - 十进制15-16位精度 };3. 实现语法分析器
思路: 使用分块思路把内容按优先级分块,先使用'(' 和 ')'分块,然后使用'*' 和 '/'号分块,分块结束;计算时从左往右计算就可以了。
匹配内容:
exp -> term
exp -> term + exp +-从左到右依此执行 exp -> term - exp term -> factor term -> factor * term */次优先,内部先左后右 term -> factor / term factor -> number factor -> (exp) ()最优先// 思路: 使用分块思路把内容按优先级分块,先使用()分块,然后使用*/号分块,分块结束;计算时从左往右计算就可以了。
enum EnumProcType { enumProcType_content= 0,// 未分解内容 }; struct ProcSubNode; struct ProcNode { EnumProcType procType; std::list<ProcSubNode>tokenlist; }; enum EnumProcSubNodeType { enumProcSubNodeType_token = 0, enumProcSubNodeType_node = 1, }; struct ProcSubNode { EnumProcSubNodeType type; ProcNode node; CalcToken token; }; class CSyntaxNodeAnalysis { public: bool Analysis(IN const std::vector<CalcToken>& tokenArray, OUT double& fResult); bool ProcBracket(ProcNode& node); // 使用括号分块 bool ProcMulAndDiv(ProcNode& node); // 使用*/号分块 bool CalcTerm(const ProcNode& node, double& result); public: // 测试函数 bool ShowNode(const ProcNode& node); };这个计算器源码我上传到csdn上来,共享出来供有兴趣的同学参考。
http://download.csdn.net/detail/chunyexiyu/7847539
Owed by: 春夜喜雨 转载请标明来源
转载地址:https://chunyexiyu.blog.csdn.net/article/details/38962455 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月21日 00时51分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
讲真,如果手机有灵魂,那就是“备忘录”
2019-04-29
端到端加密:WhatsApp不会去读取你的信息,它不需要……
2019-04-29
国会大厦骚乱,与一家极不可靠的面部识别公司……
2019-04-29
解锁宇宙密码:为什么是3、6、9?
2019-04-29
数据可视化中的格式塔心理学
2019-04-29
电动汽车的“专属危险”:网络威胁问题不容小觑
2019-04-29
短暂的告别,马上再回来
2019-04-29
统治50年:为什么SQL在如今仍然很重要?
2019-04-29
测试是一场竞争,而数据每次都会获得胜利
2019-04-29
读心的测谎系统:究竟是骗子还是个天才?
2019-04-29
最大规模技术重建:数据库连接从15000个到100个以下
2019-04-29
复工之后:员工如何改善网络安全?
2019-04-29
70%求职者因此被拒,你还不避开这些“雷区”?!
2019-04-29
办法不在多,有用就行!用Dropout解决过度拟合问题
2019-04-29
色情演员识别?绝对是人脸识别最糟糕的应用……
2019-04-29
让强化学习逃离“乏味区域陷阱”,试着加点噪音吧!
2019-04-29
超详细Spring Boot面试问题集锦,死角一个不留!
2019-04-29
10个业余时间可完成的项目,助你飞速提升编码能力!
2019-04-29
网络爬虫初涉——用python爬取网络小说
2019-04-29
Pycharm+tensorflow dropout 学习(三)
2019-04-29