我想使用m4作为缺少此功能的几种不同脚本语言的预处理程序。
特别是,我需要模拟条件代码包含的C预处理器(cpp)功能:
#if something
some
long
code
block
#else
alternate
code
block
#if something-else
do
more
stuff
#endif
#endifm4的ifelse()并不特别适合长代码块,因此,我似乎基本上需要编写m4宏来模拟这种情况,方法是测试条件,然后使用divert适当地包含或排除块。
棘手的部分是跟踪嵌套级别;据我所知,要做到这一点,我必须在m4中实现自己的堆栈。这在概念上似乎很简单,而且我确信,经过一两天的黑客攻击,我就可以拥有一个工作的系统。
但这感觉就像重新发明轮子--我肯定不会是第一个有这种需求的人。现有的、经过测试的、健壮的解决方案肯定比我作为m4级别初学者所能破解的任何解决方案都要好。
这方面有常见的m4成语吗?是否存在开放源代码的m4代码来执行此操作?在搜索引擎里闲逛找不到任何有用的东西。
(使用cpp本身不起作用,原因在cpp自己的文档中给出:“它会被不遵守C的词法规则的输入阻塞。”gpp似乎有这个现成的功能,所以使用这个功能可能更有意义,但如果让m4这样做并不太痛苦,我更喜欢m4的无处不在。)
发布于 2021-04-07 01:13:12
我也在找这个,最后写了我自己的。下面是到我的wiki上的代码的链接:
http://www.eugeneweb.com/wiki/Sites/M4Macros
我定义了没有#'s的名称,例如。如果,否则,ENDIF等等. M4也要求parens保存CPP (大多数情况下)不存在的参数。我还添加了一个选择性调用,以保护具有副作用的宏不受未选择块调用的影响。
https://stackoverflow.com/questions/50549946
复制相似问题