在运行时扩展我的语言

时间:2014-11-13 17:50:11

标签: compiler-construction interpreter vm-implementation

我正在开发一种新语言,我遵循传统方法: 所以有词法分析器,解析器,ast和执行字节码的虚拟机。

当解析器遇到像+这样的运算符时,它会生成一个ADD虚拟机指令,到目前为止一切都按预期工作。

我有兴趣为最终用户提供一种扩展语言的方法,例如用户可以添加一个operator ++函数来创建自己的后增量运算符。 我不确定正确的继续进行方式,因为解析器事先无法知道用户可以添加的所有操作符,因此我想知道什么是正确的方法。

3 个答案:

答案 0 :(得分:1)

你可以用Swift的方式做:在你的语法中有操作符声明

在Swift看起来像:

infix operator SomeToken { associativity left precedence 150 }

这告诉Swift解析器SomeToken将是一个左关联的中缀运算符,并且在任何基于优先级的决策中,此运算符的权重为150.其他运算符将具有更高,更低或相等的优先级指标,这将指导解析器创建AST

答案 1 :(得分:0)

例如,在 C#中,可以预先知道可以重载的运算符列表,并且总是使用特殊关键字operator来指示重载,因此解析器已经知道了用户是"添加"操作员。
http://msdn.microsoft.com/en-us/library/aa691324(v=vs.71).aspx

例如,在 Prolog 中,可以使用op(Precedence,Type,Name)指令将新运算符及其评估优先级添加到语言中。 Prolog解析器逐行读取和评估输入。每个"线"以.为终止 见http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse40

答案 2 :(得分:0)

使语言无限扩展的一种方法是允许完整的,反身的元编程,如Common Lisp或Forth。这样,用户就可以在现有核心语言之上构建任意数量的其他转换,重用该语言中已有的所有内容,包括所有以前的扩展,来实现此类转换。

如果您希望能够扩展语法,而不仅仅是语义,您可能需要考虑摆脱词法分析器并使用强大的无法解析方法,即PEGs。有些语言已经在执行此操作(KatahdinpfrontCLike)。