Generating C++ code

Stefan Behnel stefan_ml at behnel.de
Wed Oct 10 06:39:33 EDT 2012


Jean-Michel Pichavant, 10.10.2012 11:59:
> Well, the C++ code will end up running on a MIPS on a SOC,
> unfortunately, python is not an option here. The xml to C++ makes a lot
> of sense, because only a small part of the code is generated that way
> (everything related to log & fatal events). Everything else is written
> directly in C++.
> 
> To answer Andrea's question, the files are regenerated for every
> compilation (well, unless the xml didn't change, but the xml is highly
> subject to changes, that's actually its purpose)
> 
> Currently we already have a python script that translate this xml file
> to C++, but it's done in a way that is difficult to maintain. Basically,
> when parsing the xml file, it writes the generated C++ code. Something
> like:
> 
> if 'blabla' in xml:
>     h_file.write("#define blabla 55", append="top")
>     c_file.write("someglobal = blabla", append="bottom")
> 
> This is working, but the python code is quite difficult to maintain,
> there's a lot of escaping going on, it's almost impossible to see the
> structure of the c files unless generating one and hopping it's
> successful. It's also quite difficult to insert code exactly where you
> want, because you do not know the order in which the xml trees are
> defined then parsed.
> 
> I was just wondering if a template engine would help. Maybe not.

Depends. Template engines are great for injecting small data snippets into
large static code blocks. They are less good for finely structured code
with conditional insertions and varying code order all over the place.

In Cython, we use a combination of both: a template engine for large code
blocks with small adaptations and line-by-line generated C code for highly
varying code. Works nicely.

As for a template engine, we use Tempita for the more complex stuff
(because the implementation is small and can be embedded) and
string.Template for the simple stuff. If you need something more advanced
straight away, I'd say go for Cheetah.

In case you decide not to use a template engine at all, given that your
input format is XML, consider using lxml to build up your code tree for you
by using custom element classes. Then, generate the code recursively top-down.

http://lxml.de/element_classes.html

Might or might not be a suitable approach, depending on the complexity of
your mapping from XML to code.

Stefan




More information about the Python-list mailing list