我有一个问题,无法解决。我希望能够检测(即获取开始和结束行)已定义的编码块,就像在Python中一样。
例如,以下代码:
def main():
foo = "bar"
if foo != "baz":
foo = "tab"
else:
foo = "wow"
for character in foo:
print(character)
return 1
将产生以下结果[(0, 8), (2, 3), (4, 5), (6, 7)]
。此外,我需要对此进行优化以提高速度,因为实际上,每次代码内容更改时,都需要执行块检测。我认为以树状结构组织块似乎很理想(在示例中,if
,else
和for
块是def
块的子代)。 / p>
我已经尝试过此代码:
def detect_block(text):
import re
tabs = re.compile(r'( {4})')
start_re = re.compile(r' *(elif|else|except|finally|for|if|try|while|with|label|screen|transform|init|layeredimage|menu|style|# *region|def)\b')
end_re = re.compile(r' *(\n|break|continue|return|yield|yield from|pass|# *endregion)\b')
start_indices = []
end_indices = []
rv = []
for line_nb, line in enumerate(text.split("\n")):
indent = len(tabs.findall(line))
if start_re.match(line):
start_indices.append((line_nb, indent))
elif end_re.match(line):
end_indices.append((line_nb, indent))
for i, (idx, idx_indent) in enumerate(start_indices):
for jdx, jdx_indent in end_indices:
if jdx_indent == idx_indent and jdx > idx:
rv.append((idx, jdx))
break
return rv
但是我没有得到预期的结果。我已经在这个问题上停留了几天了。