Re: Read C++ enum in python

2009-08-19 Thread Ludo

Neil Hodgson a écrit :


   For some headers I tried it didn't work until the .* was changed to a
non-greedy .*? to avoid removing from the start of the first comment to
the end of the last comment.

file_data = ' '.join(re.split(r'\/\*.*?\*\/', file_data))


Thank you ! I adopt it !

Cheers.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Read C++ enum in python

2009-08-19 Thread Mark Tolonen


Mark Tolonen metolone+gm...@gmail.com wrote in message 
news:h6g9ig$vh...@ger.gmane.org...

[snip]


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


Paul McGuire (pyparsing author) reminded me that:

   enum.ignore(cppStyleComment)

before scanString will skip commented out sections as well.

-Mark


--
http://mail.python.org/mailman/listinfo/python-list


Re: Read C++ enum in python

2009-08-19 Thread Brian
pygccxml http://www.language-binding.net/pygccxml/pygccxml.html

It uses gccxml to compile your source code into xml, and then makes all of
your source code available to you via a high level and convenient query
interface in python.

On Tue, Aug 18, 2009 at 5:03 PM, Ludo 
olivier.anospamrnospamnnospamanospamenosp...@affaires.net 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.
 --
 http://mail.python.org/mailman/listinfo/python-list

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Read C++ enum in python

2009-08-19 Thread AggieDan04
On Aug 18, 6:03 pm, Ludo
olivier.anospamrnospamnnospamanospamenosp...@affaires.net 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

Try something like this:



file_data = open(filename).read()
# Remove comments and preprocessor directives
file_data = ' '.join(line.split('//')[0].split('#')[0] for line in
file_data.splitlines())
file_data = ' '.join(re.split(r'\/\*.*\*\/', file_data))
# Look for enums: In the first { } block after the keyword enum
enums = [text.split('{')[1].split('}')[0] for text in re.split(r'\benum
\b', file_data)[1:]]

for enum in enums:
last_value = -1
for enum_name in enum.split(','):
if '=' in enum_name:
enum_name, enum_value = enum_name.split('=')
enum_value = int(enum_value, 0)
else:
enum_value = last_value + 1
last_value = enum_value
enum_name = enum_name.strip()
print '%s = %d' % (enum_name, enum_value)
print

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Read C++ enum in python

2009-08-19 Thread Mark Tolonen


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


--
http://mail.python.org/mailman/listinfo/python-list


Re: Read C++ enum in python

2009-08-19 Thread Neil Hodgson
AggieDan04:

 file_data = open(filename).read()
 # Remove comments and preprocessor directives
 file_data = ' '.join(line.split('//')[0].split('#')[0] for line in
 file_data.splitlines())
 file_data = ' '.join(re.split(r'\/\*.*\*\/', file_data))

   For some headers I tried it didn't work until the .* was changed to a
non-greedy .*? to avoid removing from the start of the first comment to
the end of the last comment.

file_data = ' '.join(re.split(r'\/\*.*?\*\/', file_data))

   Neil
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Read C++ enum in python

2009-08-19 Thread Bill Davy
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


Re: Read C++ enum in python

2009-08-18 Thread MRAB

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.
--
http://mail.python.org/mailman/listinfo/python-list