Keil C51 插件 检测所有if语句

 此插件解决的问题

Keil 插件 -- Python 代码

import chardet, sys, glob, re
from pathlib import Path

from collections import deque

# 变量名字典 key--数据名 value--数据s类型
variable_dic = {}

# 初始化一个空的二维数组
matrix = []
# 列表的头数据
header_list = []
# 列表的值
value_list = []




# if (V_Data>35&&V_Data<790)     //零上温度校准\r
# if (V_Data==Temp_Tabe[i][1])\r
# if ((Usart1_Receive_Buff[4]==0x01)&&(Usart1_Receive_Buff[Receive_Count-1]==Xor_Data1))\r


# uint AAA
# uint AAA,BBB
# uint code AAA,BBB  -- 变量名和类型添加
def type_variale_name_split(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)

# 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):
    # 裁剪定义的数组
    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)

# 变量名和类型添加
def add_key(key, value):
    # 若key存在
    if key in variable_dic:
        return
    else:
        variable_dic[key] = value

# 添加if语句 -- if 语句分割添加
def add_variable_list(string):
    # (V_Data>35&&V_Data<790)
    try:
        cut_if_string = string.split('if')[1].strip()
        if '(' not in cut_if_string:
            return

        pattern_header = r'\([^!=|<>]+'
        list_header = re.findall(pattern_header, cut_if_string)[0].split('(')[-1].strip()
        # 若存在, 则添加
        if list_header in variable_dic:
            list_header = variable_dic[list_header] + ' ' + list_header
        else:
            list_header = '未查询到  ' + list_header
        # 若不存在, 则不添加
        wait_list = [list_header, string]

        # 若头文件存在
        for row in matrix:
            if list_header == row[0]:
                row.append(string)
                return

        # 若不存在, 则添加
        matrix.append(wait_list)
    except IndexError:
        print("报错了")


# 获取一个文件的内容
def get_bit_file_content(filename, default_encoding='gb2312'):
    file = ''
    content = ''
    try:
        file = open(filename, 'rb')
        content = file.read()  # 以字节方式读取
    except:
        print("文件" + filename + "打开失败")
    finally:
        file.close()
    source_encoding = chardet.detect(content)['encoding']
    string = content.decode(source_encoding if source_encoding else default_encoding, 'ignore')

    return string

# 获取所有的if语句分割后添加到二维数组中
def get_all_if_matrix(filename):
    string = get_bit_file_content(filename)

    # 正则 if(a==0)
    pattern_type = r"(\bif\b.+)"
    matches = re.findall(pattern_type, string)

    # ['if (V_Data>35&&V_Data<790)     //零上温度校准\r', 'if (V_Data==Temp_Tabe[i][1])\r',]
    for item in matches:
        add_variable_list(item)


# 获取所有 变量名和类型 添加到字典中
def get_all_variable_dict(filename):
    string = get_bit_file_content(filename)

    # 正则 int AAA=0
    pattern_int = r"(?:\n\b(?:sbit|bit|uchar|uint|ulong|int|long|float|char|double)\b[^;)]+)"
    matches_int = re.findall(pattern_int,string)

    # 变量名添加
    for m_int in matches_int:
        # 剔除函数
        if '(' in m_int:
            continue
        # 剔除 =0
        m_int = m_int.lstrip('\n').strip()
        if '=' in m_int:
            # uint AAA=0,B=0
            type_variable_name_equal_split(m_int)
        else:
            # uint AA
            type_variale_name_split(m_int)


if __name__ ==  "__main__":
    try:
        filename = sys.argv

        filelist = sum(list(map(glob.glob, filename[1:])), []) #获取所有文件名
        print('检测到的文件:')
        for item in filelist:
            print(item)

        # 获取所有的变量和类型
        list(map(get_all_variable_dict, filelist))

        # 获取所有的if语句
        list(map(get_all_if_matrix, filelist))


        # 获取桌面路径
        desktop_path = Path.home() / "Desktop"
        # print(desktop_path / 'output_all_if.txt')
        with open(desktop_path / 'output_if.txt', 'w') as fp:
            for row in matrix:
                fp.write(row[0]+'\n')
                for a_bit in row[1:]:
                    fp.write('    '+a_bit)
                fp.write('\n')

        print('查询完成,文件保存至:')
        print("  " + str(desktop_path / 'output_all_if.txt'))

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

 需要修改的地方

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

 Python 生成 exe

pip install pyinstaller     -- 自行安装包

pyinstaller -Fw .\Select_All_if.py 

Keil C51 插件安装

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

 效果

快捷键添加

不会改的,自行留言

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值