J'utilise PLY pour analyser les fichiers contenant des blocs imbriqués. En général:Python PLY analyse: portée de la définition
a {
b {
}
c {
d {
}
}
}
J'utilise une grammaire simple comme ceci:
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
Je voudrais savoir que je pourrais être en mesure d'accéder à un nœud « parent » dans l'analyseur. En d'autres termes comment puis-je construire l'AST afin que je puisse retrouver dans mon exemple que d
est un enfant de c
qui est lui-même enfant de a
puisque je dois voir la règle parente dans l'analyseur.
Que dois-je mettre dans p_nodes
et p_node
de sorte qu'un AST valide peut être construit? Merci.
Malheureusement, l'analyseur ne Ne pas autoriser des choses comme 'p [0] = Node (p [3], p [0])'. De plus, je ne vois pas non plus comment je pourrais le faire après la création de l'AST si l'information n'a pas été collectée lors de sa création. Ce qui me bloque également, c'est que la règle 'nodes: node nodes | node' implique que toutes les règles 'node' produites à ce niveau doivent être des nœuds frères dans l'AST et il semble difficile de le faire sans notion de" scope "car au niveau de l'analyseur il y a une récursion, et au niveau AST ces les nœuds doivent être à la même profondeur. – ibi0tux
J'ai mis à jour ma réponse, cela devrait faire ce que vous voulez. Dites-moi si vous avez encore des questions. –
Ok ça fonctionne parfaitement, tu as sauvé mon week-end, merci beaucoup! La notation 'p [0] = [p [1]] + p [2]' était exactement ce qui me manquait. – ibi0tux