Read C++ enum in python

Mark Tolonen metolone+gmane at gmail.com
Wed Aug 19 03:28:15 EDT 2009


"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





More information about the Python-list mailing list