我正在寻找一个正则表达式在Python中,将确定所有的函数体在一个C文件

ttygqcqt  于 2023-08-03  发布在  Python
关注(0)|答案(1)|浏览(74)

我正在寻找一个在Python的RE将识别所有的C函数
我想在每个函数的开头自动插入一些注解,例如,一个函数看起来像

static my_struct1* alloc_mem (my_struct2* a)
{

...

}

字符串
我想插入注解并使其看起来像

static my_struct1* alloc_mem (my_struct2* a)
{
/* my comment */
...

}


所以我想标识函数体的所有头部(以{结尾)并在那里插入注解。
我试了下面的代码:

def insert_comment():
    comment = "/* my comment */"
    pattern = r'[^(if|else|switch|for|if\s+|else\s+|switch\s+|for\s+)]\(.*\)(\s|\n)*\{'
    matches = list(re.finditer(pattern1, content))
    for match in matches:
        print('*****')
        print(match.group())

with open(filename, "r") as i:
        content = i.read()
        insert_comment()


但这也匹配了嵌套了(表达式的ifelse语句。
例如,在一个示例中,

if(MACRO(expa) && MACRO(expb)) {


那么匹配的模式将是

O(expb)) {


什么是更好的RE来开始函数体?

pgvzfuti

pgvzfuti1#

正如其他人所评论的那样,C语法太复杂,如果没有严格意义上的专用解析器,就无法分析。然而,对于您的要求,它看起来有些欠/过检测可能是可以接受的(无害的),因为它不会导致缺陷的原始源代码只是插入注解。
下面是一个简单的代码,可以在有限的条件下在所需的位置插入注解:

#!/usr/bin/python

import regex

with open(filename) as f:
    s = f.read()
    m = regex.sub(r'\b(?:if|switch|for|while|until)\b(*SKIP)(*FAIL)|(([A-Za-z_]\w*\s*\((?:[^()]+|(?2))*\))\s*{)', r'\1\n/* my comment */', s)
    print(m)

字符串
【解释】

  • regex是一个PyPi模块,具有额外的正则表达式功能。
  • (?:if|switch|for|while|until)是保留名称,其语法类似于C函数(不包括)。
  • \b(?:if|switch|for|while|until)\b(*SKIP)(*FAIL)丢弃这些匹配项。
  • (([A-Za-z_]\w*\s*\((?:[^()]+|(?2))*\))\s*{)是一个递归正则表达式,它用平衡括号匹配C函数名。
    [编辑]

如果你确定宏名都是大写字母,你可以通过调整正则表达式来排除它们:

#!/usr/bin/python

import regex

with open(filename) as f:
    s = f.read()
    m = regex.sub(r'\b(?:if|switch|for|while|until|[A-Z_]+)\b(*SKIP)(*FAIL)|(([A-Za-z_]\w*\s*\((?:[^()]+|(?2))*\))\s*{)', r'\1\n/* my comment */', s)
    print(m)


输入示例:

static my_struct1* alloc_mem (my_struct2* a)
{ 
// function
}

some_function(foo) {
// function
}

if(MACRO(expa) && MACRO(expb)) {
// reserved word
}

TAILQ_FOREACH(entry, hent, next) {
// macro
}

while(true) {
// reserved word
}


输出量:

static my_struct1* alloc_mem (my_struct2* a)
{
/* my comment */
// function
}

some_function(foo) {
/* my comment */
// function
}

if(MACRO(expa) && MACRO(expb)) {
// reserved word
}

TAILQ_FOREACH(entry, hent, next) {
// macro
}

while(true) {
// reserved word
}


【解释】
匹配所有大写字母的正则表达式[A-Z_]+被追加到排除列表中,如下所示:

(?:if|switch|for|while|until|[A-Z_]+)

相关问题