I actually started out trying different parsers (Clang, pycparser), but they validate too much. cmacro uses a home-spun parser because it's meant to let you write things like:
Yeah, I'm guessing the parsing would be a problem for integrating with other actual c-language parsers. It looks like the the parsing is completely open ended. I.E. there is no way to tell if you've completely parsed the macro without knowing the macro definition.
Maybe taking a page out of rust's handbook and adding slightly more syntax to the macro would help. If the parser knows that a macro is any identifier followed by a ! and then enclosed in braces, it could simply ignore the contents and continue parsing.
As for integration: It's pretty simple to operate from the command line, which is good enough for integration with eg. a Makefile-built project.