在python中解析C文件以进行分析

时间:2015-08-17 09:25:57

标签: python list parsing dictionary

从C文件我想解析开关部分,以便识别两件事:

只有两种情况的开关:

switch(Data)
  {
    case 0: value = 10 ; break;
    case 1 : value = 20 ;break;    
    default:
      somevar = false;
      value = 0 ;
       ----
      break;
  }

==>例如,打印"部分有2个案例"

包含许多(无限制)案例的开关:

switch(Data)
  {
    case Constant1 : value = 10 ; break;
    case constant2 : value = 20 ;break;    
    case constant3 : value = 30 ;break;    
    case constant4 : value = 40 ;break;    
    default:
      somevar = false;
      value = 0 ;
       ----
      break;
  }

==>将打印"部分用case:Constant1,Constant2,Constant3,Constant4"

为此,我做了以下事情:

original_file = open(original_file,"r")
    for line in original_file:
        line_nb +=1
        regex_case = re.compile('.*case.*:')
        found_case = regex_case.search(line)
        if found_case :
            cases_dict[line_nb]=found_case.group()    # rely on line nb is somewhat not reliable as the c file may have break on an additional line
    bool_or_enum(cases_dict)

需要 bool_or_enum 来测试所有必需的结果:

def bool_or_enum(in_dict={}):
    sorted_dict = sorted(in_dict.items(), key=operator.itemgetter(0))
    for index, item in enumerate(sorted_dict):

1 个答案:

答案 0 :(得分:0)

根据我发现的评论,发现可以提供2种解决方案:

  • 使用 pycparser

    pros :是一个python包,free和opensource

    缺点:开始并不容易,需要附加工具来预处理文件(gcc,llvm等)。

  • 使用外部工具:从scitools了解 此工具可与其GUI一起使用,以构建一个完整的解析项目,以便您可以使用调用图,指标,代码检查等。对于这个问题,我一直在使用docsexamples

    提供的API

    专业人员

    • 解析完全由GUI中的工具完成
    • 我有很多源文件,从完整目录重新解析是一个“按钮”解决方案

    缺点

    • 不自由
    • not open sourced

我通常更喜欢开源项目,但在这种情况下,理解是唯一的解决方案。顺便说一句,许可证并不是那么昂贵:我之所以选择这个,是因为我可以解析一些无法编译的文件,因为它们的依赖项(库文件和头文件)无法使用。

以下是我用过的代码:

import understand

understand_file="C:\\Users\\dlewin\\myproject.udb"
#Create a list with all the cases from the file
def find_cases(file):
    returnList =  []
    for lexeme in file.lexer(False,8,False,True):         
      if ( lexeme.text() == "case" ) :
        returnList.append(lexeme.line_end())    #line nb
        returnList.append(lexeme.text())        #found a case
    return returnList

def find_identifiers(file):
  returnList =  []

  # Open the file lexer with macros expanded and  inactive code removed
  for lexeme in file.lexer(False,8,False,True):
    if(lexeme.token() == "Identifier"):
        returnList.append(lexeme.line_end())    #line nb
        returnList.append(lexeme.text())        #identifier found
  return returnList

db = understand.open(understand_file )                                      # Open Database
file = db.lookup("mysourcefile.cpp","file")[0]
print (file.longname())
liste_idents = find_identifiers(file)                                       
liste_cases = find_cases(file)