如何为Python之类的语言检测代码块

时间:2019-03-09 05:41:37

标签: python split

我有一个问题,无法解决。我希望能够检测(即获取开始和结束行)已定义的编码块,就像在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)]。此外,我需要对此进行优化以提高速度,因为实际上,每次代码内容更改时,都需要执行块检测。我认为以树状结构组织块似乎很理想(在示例中,ifelsefor块是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

但是我没有得到预期的结果。我已经在这个问题上停留了几天了。

0 个答案:

没有答案