J'écris un programme Python pour extraire des informations de classe essentielles à partir d'une grande arborescence source C++. Je vais avoir de la chance avec l'utilisation des regex. Heureusement, presque tout le code suit un style qui me permet de ne définir que quelques regex pour détecter les déclarations de classe, les méthodes, etc. La plupart des variables membres ont des noms comme "itsSomething_" ou "m_something". Je kludge dans hackwork codé en dur pour attraper quelque chose ne correspond pas au style.
class_decl_re = re.compile( r"^class +(\w+)\s*(:|\{)" )
close_decl_re = re.compile( r"^\};" )
method_decl_re = re.compile( r"(\w[ a-zA-Z_0-9\*\<\>]+) +(\w+)\(" )
var_decl1_re = re.compile( r"(\w[ a-zA-Z_0-9\*\<\>]+) +(its\w+);" )
var_decl2_re = re.compile( r"(\w[ a-zA-Z_0-9\*\<\>]+) +(m_\w+);" )
comment_pair_re = re.compile( r"/\*.*\*/")
Ce travail est en cours, mais je vais vous montrer ce (peut-être bogué) (non, presque certainement bogué) snip de code pour montrer comment les expressions rationnelles sont utilisées:
# at this point, we're looking at one line from a .hpp file
# from inside a class declaration. All initial whitespace has been
# stripped. All // and /*...*/ comments have been removed.
is_static = (line[0:6]=="static")
if is_static:
line=line[6:]
is_virtual = (line[0:7]=="virtual")
if is_virtual:
line=line[7:]
# I believe "virtual static" is impossible, but if our goal
# is to detect such coding gaffes, this code can't do it.
mm = method_decl_re.match(line)
vm1 = var_decl1_re.match(line)
vm2 = var_decl2_re.match(line)
if mm:
meth_name = mm.group(2)
minfo = MethodInfo(meth_name, classinfo.name) # class to hold info about a method
minfo.rettype = mm.group(1) # return type
minfo.is_static = is_static
if is_static:
if is_virtual:
classinfo.screwed_up=True
classinfo.class_methods[meth_name] = minfo
else:
minfo.is_polymorphic = is_virtual
classinfo.obj_methods[meth_name] = minfo
elif vm1 or vm2:
if vm1: # deal with vars named "itsXxxxx..."
vm=vm1
var_name = vm.group(2)[3:]
if var_name.endswith("_"):
var_name=var_name[:-1]
else: # deal with vars named "m_Xxxxx..."
vm=vm2
var_name = vm.group(2)[2:] # remove the m_
datatype = vm.group(1)
vi = VarInfo(var_name, datatype)
vi.is_static = is_static
classinfo.vars[var_name] = vi
I J'espère que c'est facile à comprendre et à traduire dans d'autres langues, au moins pour un point de départ pour toute personne assez folle pour essayer. À utiliser à vos risques et périls.
Même un analyseur pour C++ est difficile, et vous voulez utiliser une regex? : p (Quoi qu'il en soit, essayez 'gccxml'.) – kennytm
Voulez-vous réellement créer le programme ou recherchez-vous simplement les résultats? Des ctags suffiraient-ils? – Cascabel
Les brouillons 0x (et précédents) définissent la grammaire dans un langage de type regex. Si c'est ce dont vous avez vraiment besoin (http://tinyurl.com/meta-xy) et que vous êtes familier avec regex, ce ne serait pas difficile à convertir; Cependant, je ne pense pas que ce soit ce que vous essayez de faire. –