Sto*_*ver 7 language-agnostic compiler-construction parsing interpreter formula
嗯,这是语言不可知的,我更喜欢用C#或F#来做,但是这次我更感兴趣的是"无论如何这样做".
我想要完成的是:
a)我想学习它 - 这次是关于我的自我,这是一个有趣的项目,我想向自己展示我对这个东西非常擅长
b)我对EBNF知之甚少(虽然我还不知道,运算符优先级如何在EBNF中起作用 - Irony.NET做得对,我查看了这些例子,但这对我来说有点不祥)
c)我的解析器应该能够这样:5*(3 +(2 - 9*(5/7))+ 9)例如,给我正确的结果
d)坦率地说,这似乎是为我编写编译器甚至是解释器的最大问题.我甚至可以生成64位汇编代码(我可以手动编写汇编程序),但公式解析器...
e)另一种想法:即使是简单的计算机(比如我的旧款Sharp 1246S只有大约2kB的RAM)也能做到这一点......它不会那么难,对吧?甚至非常非常古老的编程语言都有公式评估... BASIC是从1964年开始的,他们已经可以计算出我所提出的公式类型作为例子
f)一些想法,一些灵感就足够了 - 我根本不知道如何做运算符优先级和括号 - 但是,我知道它涉及AST并且许多人使用堆栈
所以你怎么看?
你应该去了解Recursive Descent解析器.
通过以下10种方式查看Code Golf练习:
这些"高尔夫"解决方案中的一些是以不同方式编码的递归下降解析器.
你会发现只做表达式解析是编译器中最简单的事情.解析其余语言更难,但理解代码元素如何交互以及如何生成良好代码要困难得多.
您可能还对如何使用BNF表达解析器感兴趣,以及如何使用该BNF执行某些操作.这是一个如何使用显式BNF和隐式AST作为基础来象征性地解析和操作代数的示例.这不是编译器传统上所做的,但其所做的机制深深植根于编译器技术.