我试图在Swift中创建类似BNF的DSL。 在Scala中,gll-combinators有一个很好的方法:
lazy val expr: Parser[Any] = (
"(" ~ expr ~ ")" ^^ { _ + _ + _ }
| ""
)
这会创建一个引用自己的解析器。
当我尝试在Swift中执行相同操作时(在类中使用lazy var
或在函数中使用@autoclosure
),我会在其自己的初始值中使用变量&#39 ;错误。
在一个简单的例子中
class Node {
private var node: Node
init(node: Node) { self.node = node }
}
我想创建一个节点,其成员node
指向self
。
lazy var node = Node(node) // error
有办法吗?
答案 0 :(得分:0)
所以你想定义一个属性引用self
的类?
也许是这样的?
class Node {
private var node: Node!
init(node: Node) {
self.node = node
}
init() {
self.node = self
}
}
现在你可以写:
let node = Node()
我必须使node
属性可选才能使其正常工作。
希望这有帮助。