@Geo-7
注意:无论如何,我已经阅读了这篇文章 #69 我想用当前不安全的功能
实现这个 我想在 mojo 中实现抽象语法树,到目前为止没有运气,
在 C 中简单的东西:
https://github.com/orangeduck/mpc/blob/master/mpc.h#L291
struct ast {
char *tag;
char *contents;
int children_num;
struct ast** children;
}
我尝试了两种解决方案
:首先:我无法实现add_chlid出现错误:候选不可行:方法参数 #1 无法将通用 !mlirtype 绑定到仅内存类型“AST”
@value
@register_passable("trivial")
struct UnsafeString:
var data: Pointer[Int8]
var len: Int
fn __init__(str: StringLiteral) -> UnsafeString:
let l = str.__len__()
let s = String(str)
let p = Pointer[Int8].alloc(l)
for i in range(l):
p.store(i, s._buffer[i])
return UnsafeString(p, l)
fn to_string(self) -> String:
let s = String(self.data, self.len)
return s
struct AST:
var tag: UnsafeString
var content: UnsafeString
var child_no: Int
var children: Pointer[AST]
fn __init__(
inout self,
tag: UnsafeString = "ILLEGAL",
content: UnsafeString = "un",
child_no: Int = 0,
):
self.tag = tag
self.content = content
self.child_no = child_no
self.children = Pointer[AST].alloc(child_no * 2)
fn add_child(inout self, owned other: Self):
self.children.store(0, other)
fn main():
print("AST Started")
var child1 = AST()
var child2 = AST()
var parent = AST()
第二个错误:调用“init”时没有匹配的函数:
var child1 = AST()
~~~^~
候选不可行:被调用方至少需要 1 个参数,但指定了 0 个参数
@value
@register_passable("trivial")
struct UnsafeString:
var data: Pointer[Int8]
var len: Int
fn __init__(str: StringLiteral) -> UnsafeString:
let l = str.__len__()
let s = String(str)
let p = Pointer[Int8].alloc(l)
for i in range(l):
p.store(i, s._buffer[i])
return UnsafeString(p, l)
fn to_string(self) -> String:
let s = String(self.data, self.len)
return s
@value
@register_passable("trivial")
struct AST:
var tag: UnsafeString
var content: UnsafeString
var child_no: Int
var children: Pointer[AST]
fn __init__(
inout self,
tag: UnsafeString = "ILLEGAL",
content: UnsafeString = "un",
child_no: Int = 0,
) -> AST:
self.tag = tag
self.content = content
self.child_no = child_no
self.children = Pointer[AST].alloc(child_no * 2)
return self
fn add_child(inout self, owned other: Self):
self.children.store(0, other)
fn main():
print("AST Started")
var child1 = AST()
var child2 = AST()
var parent = AST()
有没有办法使用 memory.unsafe.bitcast(或其他任何东西)来解决这个问题?