预处理 C99 有向字母

Preprocessing C99 digraphs away

有没有办法 "preprocess" C99 风格的二合字母获得 C 文件(或 .i 预处理源文件)使得生成的文件不包含任何二合字母?

例如,给定以下源代码:

%:define N 5

int main() <%
  int a<:N:> = <%2,1,0%>;
  char *s = "a<:b";
  return a<:4:>;
%>

使用 GCC 的预处理器选项(-E,再加上 -dD 作为良好的衡量标准)足以摆脱 %: 二合字母(它被评估并重新打印为 #define 在这个例子中),但不是其他人。

Clang 的行为方式相同,因此没有太大帮助。

据我所知,简单的正则表达式替换是行不通的,因为它们最终会替换字符串中的出现。

据我所知,没有执行此转换的标准工具。特别是,预处理器 不会 替换二合字母,因为(与三字母不同)二合字母只是普通标记,恰好与其他普通标记具有相同的含义。

从 C 的现有 flex 定义开始,使用 flex 编写这样的处理器会相对简单。