diff --git a/.gitignore b/.gitignore index cb3aafe..336e33d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,10 @@ a.out # Generated by Cython: optpass.c tree.c + +# Generated elsewhere in build: +tree-types.txt +tree-types.pyx.in +tree.pyx + + diff --git a/Makefile b/Makefile index bb702f6..b1a2eca 100644 --- a/Makefile +++ b/Makefile @@ -30,9 +30,15 @@ optpass.c: optpass.pyx tree.c: tree.pyx cython $^ -o $@ -tree.pyx: tree.pyx.in +tree.pyx: tree.pyx.in tree-types.pyx.in + cpp $(CFLAGS) tree.pyx.in -o $@ + +tree-types.txt: tree-types.txt.in cpp $(CFLAGS) $^ -o $@ +tree-types.pyx.in: tree-types.txt maketreetypes.py + python maketreetypes.py > tree-types.pyx.in + # Hint for debugging: add -v to the gcc options # to get a command line for invoking individual subprocesses # Doing so seems to require that paths be absolute, rather than relative diff --git a/maketreetypes.py b/maketreetypes.py new file mode 100644 index 0000000..06d2d7f --- /dev/null +++ b/maketreetypes.py @@ -0,0 +1,34 @@ +from collections import namedtuple + +class TreeType(namedtuple('TreeType', 'SYM, STRING, TYPE, NARGS')): + def camel_cased_string(self): + return ''.join([word.title() + for word in self.STRING.split('_')]) + +def iter_tree_types(): + import re + f = open('tree-types.txt') + for line in f: + # e.g. + # ERROR_MARK, "error_mark", tcc_exceptional, 0 + m = re.match('(.+), (.+), (.+), (.+)', line) + if m: + yield TreeType(SYM=m.group(1), + STRING=m.group(2)[1:-1], + TYPE=m.group(3), + NARGS=int(m.group(4))) + else: + # print 'UNMATCHED: ', line + assert(line.startswith('#') or line.strip() == '') + f.close() + +for t in iter_tree_types(): + print ( +""" +cdef class %s(Tree): + _STRING = %r + _SYM = %r + _TYPE = %r + _NARGS = %i +""" % (t.camel_cased_string(), + t.STRING, t.SYM, t.TYPE, t.NARGS)) diff --git a/tree-types.txt.in b/tree-types.txt.in new file mode 100644 index 0000000..3a1d477 --- /dev/null +++ b/tree-types.txt.in @@ -0,0 +1,5 @@ +#define DEFTREECODE(SYM, STRING, TYPE, NARGS) \ + SYM, STRING, TYPE, NARGS +#define END_OF_BASE_TREE_CODES +#include "all-tree.def" +#undef DEFTREECODE diff --git a/tree.pyx.in b/tree.pyx.in index 0effc46..30a84c8 100644 --- a/tree.pyx.in +++ b/tree.pyx.in @@ -32,13 +32,7 @@ cdef class Tree: def __repr__(self): return 'tree.Tree(%r)' % 'foo' - -#define DEFTREECODE(SYM, STRING, TYPE, NARGS) \ -cdef class SYM(Tree): \ - pass -#define END_OF_BASE_TREE_CODES -#include "all-tree.def" -#undef DEFTREECODE +#include "tree-types.pyx.in" cdef extern gcc_python_make_wrapper_tree(tree t): obj = Tree()