gpt4 book ai didi

Python PLY解析: definition scope

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

我正在使用 PLY 来解析包含嵌套 block 的文件。通常:

a {
b {

}
c {
d {

}
}
}

我正在使用像这样的简单语法:

def p_nodes(p):
'''
nodes : node nodes
| node
'''
# ??

def p_node(p):
'''
node : IDENTIFIER OPEN_CURLY_BRACE node_çontent CLOSE_CURLY_BRACE
'''
p[0] = Node(p[3])#FIXME?

def p_node_content(p):
'''
node_content : nodes
|
'''
if len(p) > 1:
p[0] = p[1]
else
p[0] = None

我想知道我是否能够访问解析器中的“父”节点。换句话说,我如何构建 AST,以便在我的示例中检索 dc 的子级,而 c 本身又是 a 的子级> 因为我必须在解析器中查看父规则。

我应该在 p_nodesp_node 中放入什么,以便可以构建有效的 AST?谢谢。

最佳答案

我们需要您的 Node 类,但我认为它类似于:

class Node:
def __init__(self, children):
self.children = children
self.type = None

那么你的解析器可能看起来像这样:

def p_nodes(p):
'''
nodes : node nodes
| node
'''
if len(p) > 2:
p[0] = [p[1]] + p[2]
else
p[0] = [p[1]]

def p_node(p):
'''
node : IDENTIFIER OPEN_CURLY_BRACE node_content CLOSE_CURLY_BRACE
'''
p[0] = Node(p[3])

def p_node_content(p):
'''
node_content : nodes
|
'''
if len(p) > 1:
p[0] = p[1]
else
p[0] = None

然后您将拥有一个真正的 AST,其中每个节点都包含对其所有子节点的引用。

最终,如果您希望节点能够引用其父节点,则必须从根开始迭代所有 AST,并将其设置为所有子节点的属性,然后对其子节点执行相同操作...

为此,请将您的 Node 类更改为如下所示:

class Node:
def __init__(self, children):
self.children = children
self.parent = None

def set_parent(self, parent):
self.parent = parent

并运行类似的函数:

def set_parent_to_AST(root_node):
for node in root_node.children:
node.set_parent(root_node)
set_parent_to_AST(node)

关于Python PLY解析: definition scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40440380/

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