Keil C51 插件 检测变量名引用不统一

此插件解决的问题

Keil 插件 -- Python 代码

import chardet, sys, glob
import re
 
# 变量名字典 key--数据名 value--数据s类型
variable_dic = {}
# 报错变量名字典
error_dic = {}
 
def remove_extra_spaces(input_string):
    # 使用正则表达式替换连续的空格为单个空格
    return re.sub(r'\s+', ' ', input_string).strip()

def add_key(key, value):
    try:
        # 若key存在
        if key in variable_dic:
            if variable_dic[key] == value+'extern':
                variable_dic[key] = value
                return
    
            error_dic[key] = value
        else:
            variable_dic[key] = value
    except Exception as e:
        print(str(e))
        print(f"add_key error: {key} {value}")


def compare_key(key, value):
    try:
        # 若不存在, 则添加, 用extern标识
        if key not in variable_dic:
            variable_dic[key] = value + 'extern'
            return
        # 若key存在,值不相等,则报错
        if key in variable_dic:
            if value+'extern' == variable_dic[key] or value == variable_dic[key]:
                return
    
            if key not in error_dic:
                error_dic[key] = value
    except Exception as e:
        print(str(e))
        print(f"compare_key error: {key} {value}")
 
# uint AAA
# uint AAA,BBB
# uint code AAA,BBB
def type_variale_name_split(row_text):
    try:
        row_text = remove_extra_spaces(row_text)
        type_header = row_text.split()[0]
        if 'xdata' in row_text or 'code' in row_text:
            type_header = ' '.join(row_text.split()[0:2])
    
        if ',' in row_text: # uchar data A,B  uint a,c,d
            for item in row_text.split(','):
                T = list(map(str.strip, item.split()))[-1]
                add_key(list(map(str.strip, item.split()))[-1], type_header)
    
        else: # uchar data A  uint B
            row_text_list = row_text.split()
            if 'xdata' in row_text or 'code' in row_text:
                add_key(row_text_list[2].strip(),type_header)
            else:
                add_key(row_text_list[1].strip(),type_header)
    except Exception as e:
        print(str(e))
        print(f"type_variale_name_split error: {row_text}")
# uint AA=0
# uint AA=0,BB=0
# uint xdata AAA=0
# uint xdata AAA[BBB]={0}
def type_variable_name_equal_split(row_text):
    try:
        row_text = remove_extra_spaces(row_text)
        # 裁剪定义的数组
        if '{' in row_text:
            row_text = row_text.split('{')[0]
    
        type_header = row_text.split()[0]
        if 'xdata' in row_text or 'code' in row_text:
            type_header = ' '.join(row_text.split()[0:2])
    
        # uint AA=0,BB=0
        # uint code AA=0,BB=0,CC=1
        # uint code A=0;
        if ',' in row_text:
            for item in row_text.split(','):
                type_header_variable = item.split('=')[0]
                # uint AA
                if type_header in type_header_variable:
                    add_key(type_header_variable.split(type_header)[1].strip(), type_header)
                else: # AA
                    add_key(type_header_variable.strip(), type_header)
        else: # uint AA=0
            # uchar   xdata B=0
            type_header_variable_else = row_text.split('=')[0]
            type_header_variable_else_list = list(map(str.strip, type_header_variable_else.split()))
            add_key(type_header_variable_else_list[-1],type_header)
    except Exception as e:
        print(str(e))
        print(f"type_variable_name_equal_split error: {row_text}")
# extern uint AA;
# extern uchar xdata BB,CC;
def extern_type_variale_name_split(row_text):
    try:
        row_text = remove_extra_spaces(row_text)
        row_text = row_text.split('extern')[1]
        type_header = row_text.split()[0]
        if 'xdata' in row_text or 'code' in row_text:
            type_header = ' '.join(row_text.split()[0:2])
    
        if ',' in row_text:
            for item in row_text.split(','):
                if type_header in item:
                    compare_key(item.split(type_header)[1].strip(), type_header)
                else:
                    compare_key(item.strip(), type_header)
        else:
            compare_key(row_text.split(type_header)[1].strip(), type_header)
    except Exception as e:
        print(str(e))
        print(f"extern_type_variale_name_split error: {row_text}")
def format_file(filename, default_encoding='gb2312'):
    file = ''
    content = ''
    try:
        file = open(filename, 'rb')
        content = file.read()  # 以字节方式读取
    except:
        print("文件"+filename+"打开失败")
    finally:
        file.close()
    try:
        source_encoding = chardet.detect(content)['encoding']
        string = content.decode(source_encoding if source_encoding else default_encoding, 'ignore')
    
        pattern_type = r"(?:\n\b(?:bit|uchar|uint|ulong|int|long|float|char|double)\b[^;)]+)"
        pattern_extern = r"(\n(?:extern)\s+\b(?:bit|uchar|uint|ulong|int|long|float|char|double)\b[^;)]+)"
    
        matches = re.findall(pattern_type, string)
        # 变量名添加
        for matche in matches:
            # 剔除函数
            if '(' in matche:
                continue
            # 剔除 =0
            # print(matche+"-------")
            matche = matche.lstrip('\n').strip()
            if '=' in matche:
                # uint AAA=0,B=0
                type_variable_name_equal_split(matche)
            else:
                # uint AA
                type_variale_name_split(matche)
    
        # extern 变量名比对
        matche_extern = re.findall(pattern_extern, string)
    
        for matche_e in matche_extern:
            # 剔除函数
            if '(' in matche_e:
                continue
            # 剔除 = 0
            matche_e = matche_e.strip()
            extern_type_variale_name_split(matche_e)
    except Exception as e:  
        print(str(e))
        print(f"format_file error: {filename}")
 
 
if __name__ ==  "__main__":
    try:
        filename = sys.argv
        if len(filename) < 2:
            print(f"当前传达的文件名为{filename}")
            exit()
        filelist = []
        for arg in filename[1:]:
            filelist.extend(glob.glob(arg))
        print('检测到的文件:')
        for item in filelist:
            print(item)

        # 遍历 filelist 中的每个文件
        for file in filelist:
            # 调用 format_file 函数处理每个文件
            format_file(file)



        if not error_dic:
            print('未查询到extern引用不匹配的')
        else:
            print('以下是变量类型未统一的')
            for k,v in error_dic.items():
                print(f'{k} --- {v}')

    except Exception as e:
        print(str(e))

 需要修改的地方

上面代码,所需要的包,自行导入

 Python 生成 exe

pip install pyinstaller     -- 自行安装包

pyinstaller -Fw ./Incorrect_Variable_Reference.py

Keil C51 插件安装

"$E*.c" "$E*.h" -- 表示当前的所有文件

 效果

快捷键添加

 不会改的,自行留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值