我是靠谱客的博主 英勇诺言,最近开发中收集的这篇文章主要介绍Java简单工厂模式四则运算_【CEval系列】实现四则运算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

更新:可以用dev-cpp编译了(注意选-std=c++11),精简了代码,总的来说只有一千行左右吧,bajdcc/learnstl。

================================

花了几天鼓捣&debug,终于大功告成。

源码:bajdcc/CEval,见里面的CEval.cpp。

工程源码阅读基础:表达式求值部分。不需要学习正则表达式因为我没用它。Lexer部分需要编译原理的LL1分析,解释器部分需要学习AST以及树的操作。模版的话我没怎么用,就在类型转换中用了一下。

人民币翻译部分。需要熟悉各种常见设计模式(上一篇已介绍)。需要熟悉shared_ptr等动态指针。了解汇编中的常用指令。

CEval工程的“脑洞”之实现

这个工程对我而言,有几大新颖之处:非递归实现表达式求值,即不用递归的方式(只用for循环)完成LL(1)分析

类型转换,三大类型int/double/string,int+double=>double,int溢出转double

手动实现字符串转换成int/double,即atoi/atof

我的看法:自己实现atoi/atof。好处:考验基本功,虽然过程繁琐,但最终是可以完成的。

类型转换。遇到解释器/脚本的实现,就一定会碰到类型转换问题,实现方式有多种。

非递归求值。呵,常见的LL分析是必然递归的,我就是不用,当然也能实现,后面会写几篇说明的文章。

实现非递归求值的必要条件

一个简单的树前/中/序非递归遍历就已经可以吓倒大部分人了,非递归搞LL,这是不是不要命了?当然,不去递归是有好处滴,就是不爆栈。

必要条件有:及时归约。依照算符优先文法,掌握归约的时机,那就是优先级再也高不了当前的时候。碰到更低优先级的操作符,就立马将当前结点归约。

线索结点。有一个动态结点,指向当前的最新的操作符,如3+4就指向+号,3+4*5就指向*号。它的目标是记录可以归约的第一个结点,归约后,可尝试再向上归约。

结点栈。这是针对实现括号功能而言的,可惜,括号我也不用递归做。括号是可以递归,递归就要保存现场,很可惜,现场我只有两个东西:根结点和线索结点。所以,只要给两个结点一个栈去保存就可以了。

尚未实现的部分只限简单的优先级层次。我只实现四则运算,所以说实在的优先级只有两层,即不可简化的树最高就是3层。如果优先级有好几层,那我的代码有可能出现bug(没考虑这茬)。

只限二元运算。一元运算的话,我暂时还没测试 or 实现它。

本项目的意义维持一下写parser的水平

实现自己的想法,印证自己的思路

不时使用一下先前没用过的东西,刷新自己陈旧的三观

给C++本专栏打call

有点动力,不让自己无聊

用Java/C#写容易吧,哈哈,用C++试试,累不死你

编程最核心的意义

编程是为了印证自己的想法/设计是否正确,不是瞎乱搞

为什么?编程理论上可以干任何事,我要证明我可以实现我想做的功能。我是为了印证想法而去编程。

举例子:bajdcc/jMiniLang,印证想法:仅用管道和共享可以实现脚本操作系统

bajdcc/SimuCircult,印证想法:(1)电路 - 要实现图灵完备的电路需要合理的延迟和更简单的世界观设定,没法实现SR锁存器,证明失败 (2) 闪电模拟 - 证明失败

有了想法,脑子里有了设计蓝图,这下才开始开工写代码,然后de个bug,不断测试/返工,最终把作品做出来,印证先前的想法是正确的。最实质的是一个设计的过程,如果都没有设计,那怎样有写代码的方向呢?

设计的过程就是架构的过程,但一开始所以模块就如此详细吗?当然不是。设计蓝图的作用,就是先把关键的/依赖少的部分先实现。然后慢慢添加/丰富功能。

举例子:

实现四则运算,可以很简单,就100行以内,但功能单一(上学肯定写过这个啦)。

然而,本工程实现四则运算,不会那么简单,粗略3k行代码(其中表达式部分1k行,rmb部分2k行)。思路当然是先做lexer再做parser了,但我构思lexer首先要做atoi/atof吧,因为这是最没依赖的东西。不过本项目中还不算,最底层是RefString流过滤器哈哈。那我就要最先实现流过滤器了,呵呵,又要折腾它了,不过我已经接触/实现过,只要copy下自己代码就ok了。所以要拼积累啊,做同样的东西,做得越多,就做得越快,因为先前的代码会不断积累,先前的思路会不断沉淀,当你有了新的想法/想做新的东西时,那个思路就会蹦出来,然后一拍脑袋,soga!是这样子!不过我转而一想,也许我可以尝试一种新方法……因此就有了这篇文章啦~

后面的内容就很肥了(正经点,全是C++):设计模式的使用

挺有用的工具类(自己造轮子)

不走寻常路实现四则运算

最后

以上就是英勇诺言为你收集整理的Java简单工厂模式四则运算_【CEval系列】实现四则运算的全部内容,希望文章能够帮你解决Java简单工厂模式四则运算_【CEval系列】实现四则运算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部