Do not write a parser, but instead do this by instead spinning up an iRODS server of some kind at compile-time and send a rule invocation to it. This is tricky because the macro we're compiling defines how to send the rule to server appropriately, but we can only check that the macro is correct by sending it to the server in the first place.