很多面试喜欢考
这是一个很有意思的东西吧
代码查看
代码链接
主要参考资料
let us build a simple interpreter
如果你仔细阅读了这几篇文章,自己就完全可以写出来。文章写的比较详细,用Python写出来的,你必须翻译成自己喜欢的语言,或者去学一门语言,重写最经典的代码。
我翻译成Java的版本了,增加了生成前缀表达式,逆波兰法的代码生成。
我推荐的这篇文章是要写一个完整的解释器的,但是无奈更新比较慢,开始时一月一次更新,最近好长时间都没有更新了。只能去啃书,但是看书很累的。
用一门语言去解析另外一种语言,可以更好的理解几种基本的程序构造方法。
学校学习的时候运算符的意义一直在变化,运算的对象也在变化,代数学教会了我们做计算,可惜那时我还不太能思考。
其实解析四则运算很无聊的呀,结果是什么你基本已经知道了。如果你想看点激动人心的东西,那么你也许会对json和xml感兴趣。
看看下面的文章或许有所帮助
简单json解析
XML解析想到的
四则运算解析的难点是求值顺序的问题,因为这里面有乘除,有括号可以提高运算优先级。最容易翻译成代码的就是抽象的定义,1.表达式:非终结符[(+|-)非终结符] 2.非终结符: 终结符[(*|/)终结符] 3.终结符: [+|_]数字 |(表达式)。我这里使用的语言是不标准的。
当是这个定义,对于正常人很难以理解,为什么要这个样子?1+(-1)-2*3这样的表达式就可以先计算正负号,再计算括号内,再乘除,再加减,这样的运算才能得到我们想要的结构。这个无疑是很复杂的过程,但是我们小学的时候就可以在我们的脑子里完成这种操作,而且很容易就可以辨识出结构。
让计算机明白这样的结构需要付出的代价就是人真正理解这种表达的意义。我们硬生生造了一些高级的词汇,然后要去研究他。其实如果,我们的表达式非常长(1+4*2+3-4(444+55-1------1-+++++1*4/1)),嵌套很深,人照样会糊涂,计算机却可以容易算出来。所以数学课上没人会写出这样复杂的表达式,但是程序里面就有这样负责的,看来我们是打算把某些人搞糊涂。
我见过用正则表达式匹配运算符号,先计算出高优先级的子结构式,那也许是人直观思考的结果。两种方法都可以实现所要达到的目标。这代表了两种思维,直观的人的思维和机器的思维,感性和理性。
后续希望继续改进,做成简单的语言解析器,期待出新篇章。