"Mark Tolonen" <metolone+gm...@gmail.com> wrote in message news:mailman.89.1250666942.2854.python-l...@python.org... > > "MRAB" <pyt...@mrabarnett.plus.com> wrote in message > news:4a8b3e2d.7040...@mrabarnett.plus.com... >> Ludo wrote: >>> Hello, >>> >>> I work in a very large project where we have C++ packages and pieces of >>> python code. >>> >>> I've been googleing for days but what I find seems really too >>> complicated for what I want to do. >>> >>> My business is, in python, to read enum definitions provided by the >>> header file of an c++ package. >>> Of course I could open the .h file, read the enum and transcode it by >>> hand into a .py file but the package is regularly updated and thus is >>> the enum. >>> >>> My question is then simple : do we have : >>> - either a simple way in python to read the .h file, retrieve the >>> c++ enum and provide an access to it in my python script >>> - either a simple tool (in a long-term it would be automatically run >>> when the c++ package is compiled) generating from the .h file a .py file >>> containing the python definition of the enums ? >>> >>> Thank you for any suggestion. >> >> Speaking personally, I'd parse the .h file using a regular expression >> (re module) and generate a .py file. Compilers typically have a way of >> letting you run external scripts (eg batch files in Windows or, in this >> case, a Python script) when an application is compiled. > > This is what 3rd party library pyparsing is great for: > > --------begin code---------- > from pyparsing import * > > # sample string with enums and other stuff > sample = ''' > stuff before > > enum hello { > Zero, > One, > Two, > Three, > Five=5, > Six, > Ten=10 > } > > in the middle > > enum blah > { > alpha, > beta, > gamma = 10 , > zeta = 50 > } > > at the end > ''' > > # syntax we don't want to see in the final parse tree > _lcurl = Suppress('{') > _rcurl = Suppress('}') > _equal = Suppress('=') > _comma = Suppress(',') > _enum = Suppress('enum') > > identifier = Word(alphas,alphanums+'_') > integer = Word(nums) > > enumValue = Group(identifier('name') + Optional(_equal + > integer('value'))) > enumList = Group(enumValue + ZeroOrMore(_comma + enumValue)) > enum = _enum + identifier('enum') + _lcurl + enumList('list') + _rcurl > > # find instances of enums ignoring other syntax > for item,start,stop in enum.scanString(sample): > id = 0 > for entry in item.list: > if entry.value != '': > id = int(entry.value) > print '%s_%s = %d' % (item.enum.upper(),entry.name.upper(),id) > id += 1 > --------------end code------------ > > Output: > HELLO_ZERO = 0 > HELLO_ONE = 1 > HELLO_TWO = 2 > HELLO_THREE = 3 > HELLO_FIVE = 5 > HELLO_SIX = 6 > HELLO_TEN = 10 > BLAH_ALPHA = 0 > BLAH_BETA = 1 > BLAH_GAMMA = 10 > BLAH_ZETA = 50 > > -Mark > >
Python and pythoneers are amazing! -- http://mail.python.org/mailman/listinfo/python-list