Read C++ enum in python

Bill Davy Bill at SynectixLtd.com
Wed Aug 19 05:34:11 EDT 2009


"Mark Tolonen" <metolone+gmane at gmail.com> wrote in message 
news:mailman.89.1250666942.2854.python-list at python.org...
>
> "MRAB" <python at mrabarnett.plus.com> wrote in message 
> news:4A8B3E2D.7040702 at 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! 





More information about the Python-list mailing list