预处理 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
编写这样的处理器会相对简单。
有没有办法 "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
编写这样的处理器会相对简单。