从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):
答案 0 :(得分:0)
根据我发现的评论,发现可以提供2种解决方案:
使用 pycparser
pros :是一个python包,free和opensource
缺点:开始并不容易,需要附加工具来预处理文件(gcc,llvm等)。
使用外部工具:从scitools了解 此工具可与其GUI一起使用,以构建一个完整的解析项目,以便您可以使用调用图,指标,代码检查等。对于这个问题,我一直在使用docs和examples
提供的API专业人员:
缺点:
我通常更喜欢开源项目,但在这种情况下,理解是唯一的解决方案。顺便说一句,许可证并不是那么昂贵:我之所以选择这个,是因为我可以解析一些无法编译的文件,因为它们的依赖项(库文件和头文件)无法使用。
以下是我用过的代码:
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)