Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找Python递归引用_Python_Python 3.x_Parsing - Fatal编程技术网

查找Python递归引用

查找Python递归引用,python,python-3.x,parsing,Python,Python 3.x,Parsing,我试图在一组给定的语法表达式中找到递归引用。 以下是一个例子: expr : term term : factor factor : expr 但我不知道如何解决这些循环。 我试图识别给定字典中的所有递归循环,该字典描述语法中的规则引用 给定下面的树,每个节点都应该被标识为递归的,因为有一个循环来自expr->term->factor->expr… 数据={ 'expr':{'term'}, '术语':{'factor'}, '因子':{'expr'}, } (当存在多个互连环

我试图在一组给定的语法表达式中找到递归引用。 以下是一个例子:

expr   :  term
term   :  factor
factor :  expr
但我不知道如何解决这些循环。 我试图识别给定字典中的所有递归循环,该字典描述语法中的规则引用

给定下面的树,每个节点都应该被标识为递归的,因为有一个循环来自
expr->term->factor->expr…

数据={
'expr':{'term'},
'术语':{'factor'},
'因子':{'expr'},
}
(当存在多个互连环路时,它还应返回所有循环的节点)

我不确定如何解决哪些节点在循环,我在网上四处查看后发现: 但我不明白它是如何解决类似问题的


任何帮助都将不胜感激!:)

您可以将语法视为图形并检查循环:

import re
s = """
expr   :  term
term   :  factor
factor :  expr
"""
g = [re.split('\s+:\s+', i) for i in filter(None, s.split('\n'))]
def check_cycle(n, c = []):
   if n in c:
      return True
   return any(check_cycle(b, c+[n]) for a, b in g if a == n)

result = {a:check_cycle(a) for a, _ in g}
输出:

{'expr': True, 'term': True, 'factor': True}