gpt4 book ai didi

groovy dsl - 中缀运算符可能吗?

转载 作者:行者123 更新时间:2023-12-02 01:51:35 25 4
gpt4 key购买 nike

是否可以在 Groovy 中使用中缀运算符创建 dsl?

我研究了构建器模式、invokeMethod、propertyInvoke 和 MetaClass,但我只能看到如何使用它来使用前缀运算符(抛光符号)创建树结构。我想要做的是使用具有绑定(bind)优先级规则的中缀运算符构建树结构。

例如:如果此伪代码的计算结果为 8:

add(2,multiply(3, 2))

我想表达为:

2 add 3 multiply 2

乘法比加法结合得更紧密。我只是以算术为例 - 我的应用程序完全不同。

我不想编写和支持我自己的解析器,所以我希望 groovy 有这样的机制???

编辑:在搜索解决方案时,我发现这在 Scala 中是可能的并且有详细的记录(请参阅第 33 章:Martin Odersky 编写的 Scala 编程中的组合器解析器)。

最佳答案

我看到你在 Scala 中找到了答案,但无论如何,在 Groovy 中,虽然它需要点(或 AST 来自动插入它),但执行命令树并不难:

更新:添加了一个floatNode方法,其优先级基于precedence列表。优先级高的节点向上“ float ”:

class Operation {

static final precedence = ['minus', 'add', 'multiply', 'divide']

def left, right, method
Operation parent

def invokeMethod(String method, args) {
def o = new Operation(
parent: this, left: right, method: method, right: args[0])

this.floatNode(o)
}

def floatNode(Operation op) {
if (op.hasHigherPrecedenceThan(this)) {
op.parent = this.parent
this.parent = op
if (op.parent) { this.parent = op.parent.floatNode(op) }
return this
}
else {
return op
}
}

def hasHigherPrecedenceThan(Operation o) {
return precedence.indexOf(this.method) > precedence.indexOf(o.method)
}

String toString() { "Operation($left $method $right, parent=$parent)" }
}

测试:

Integer.metaClass.invokeMethod = { String method, args ->
new Operation(parent: null, method: method, left: delegate, right: args.head())
}


a = 2.add 3 multiply 4 minus 5 divide 6 add 7

println a

println 将输出:

Operation(3 minus 5, 
parent=Operation(5 add 7,
parent=Operation(2 add 3,
parent=Operation(3 multiply 4,
parent=Operation(5 divide 6, parent=null)))))

关于groovy dsl - 中缀运算符可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22388522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com