【发布时间】:2019-08-19 15:56:28
【问题描述】:
想象以下类型的字符串:
if ((a1 and b) or (a2 and c)) or (c and d) or (e and f)
现在,我想得到括号中的表达式,所以我写了一个PEG解析器,语法如下:
from parsimonious.grammar import Grammar
grammar = Grammar(
r"""
program = if expr+
expr = term (operator term)*
term = (factor operator factor) / factor
factor = (lpar word operator word rpar) / (lpar expr rpar)
if = "if" ws
and = "and"
or = "or"
operator = ws? (and / or) ws?
word = ~"\w+"
lpar = "("
rpar = ")"
ws = ~"\s*"
""")
解析就好了
tree = grammar.parse(string)
现在问题来了:如何为这棵树编写一个NodeVisitor 类以仅获取因子?我的问题是第二个可以深度嵌套的分支。
我试过了
def walk(node, level = 0):
if node.expr.name == "factor":
print(level * "-", node.text)
for child in node.children:
walk(child, level + 1)
walk(tree)
但实际上无济于事(因素会重复出现)。
注意:本题基于 StackOverflow 上的another one。
【问题讨论】:
标签: python regex parsing parsimonious