我正在寻找一个在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()
型
但这也匹配了嵌套了(
表达式的if
和else
语句。
例如,在一个示例中,
if(MACRO(expa) && MACRO(expb)) {
型
那么匹配的模式将是
O(expb)) {
型
什么是更好的RE来开始函数体?
1条答案
按热度按时间pgvzfuti1#
正如其他人所评论的那样,C语法太复杂,如果没有严格意义上的专用解析器,就无法分析。然而,对于您的要求,它看起来有些欠/过检测可能是可以接受的(无害的),因为它不会导致缺陷的原始源代码只是插入注解。
下面是一个简单的代码,可以在有限的条件下在所需的位置插入注解:
字符串
【解释】
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函数名。[编辑]
如果你确定宏名都是大写字母,你可以通过调整正则表达式来排除它们:
型
输入示例:
型
输出量:
型
【解释】
匹配所有大写字母的正则表达式
[A-Z_]+
被追加到排除列表中,如下所示:型