我正在开发一种新语言,我遵循传统方法: 所以有词法分析器,解析器,ast和执行字节码的虚拟机。
当解析器遇到像+这样的运算符时,它会生成一个ADD虚拟机指令,到目前为止一切都按预期工作。
我有兴趣为最终用户提供一种扩展语言的方法,例如用户可以添加一个operator ++函数来创建自己的后增量运算符。 我不确定正确的继续进行方式,因为解析器事先无法知道用户可以添加的所有操作符,因此我想知道什么是正确的方法。
答案 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)