Source code for pyrser.hooks.set
from pyrser import meta
from pyrser.parsing import Node
from pyrser.parsing.base import BasicParser
@meta.hook(BasicParser, "set")
[docs]def set_node(self, dst, src):
"""
Basically copy one node to another.
usefull to transmit a node from a terminal
rule as result of the current rule.
example::
R = [
In : node #set(_, node)
]
here the node return by the rule In is
also the node return by the rule R
"""
if not isinstance(src, Node):
dst.value = src
else:
dst.set(src)
idsrc = id(src)
iddst = id(dst)
if iddst not in self.id_cache:
print("DST: %s" % repr(dst))
print("RULE_NODES %s" % repr(self.rule_nodes))
if idsrc in self.id_cache:
k = self.id_cache[idsrc]
k2 = self.id_cache[iddst]
if k in self.rule_nodes:
self.tag_cache[k2] = self.tag_cache[k]
return True
@meta.hook(BasicParser, "setint")
[docs]def set_node_as_int(self, dst, src):
"""
Set a int literal to a node
example::
R = [
In : node #setint(node, 12)
]
"""
dst.value = int(src)
return True
@meta.hook(BasicParser, "setstr")
[docs]def set_node_as_str(self, dst, src):
"""
Set a str literal to a node
example::
R = [
In : node #setstr(node, "toto")
]
"""
dst.value = src
return True
@meta.hook(BasicParser, "get")
[docs]def get_subnode(self, dst, ast, expr):
"""
get the value of subnode
example::
R = [
__scope__:big getsomethingbig:>big
#get(_, big, '.val') // copy big.val into _
]
"""
dst.value = eval('ast' + expr)
return True