preprocessor - 使用 m4 进行条件编译/解释
问题描述
我想m4
用作缺乏此功能的几种不同脚本语言的预处理器。
特别是,我需要模拟cpp
条件代码包含的 C 预处理器 ( ) 功能:
#if something
some
long
code
block
#else
alternate
code
block
#if something-else
do
more
stuff
#endif
#endif
m4ifelse()
并不特别适合长代码块,所以我似乎基本上需要编写 m4 宏来模拟这一点,通过测试条件,然后根据需要使用divert
来包含或排除块。
棘手的部分将是跟踪嵌套级别;据我所知,我必须在 m4 中实现自己的堆栈才能做到这一点。这在概念上似乎很简单,而且我确信通过一两天的黑客攻击,我可以拥有一个工作系统。
但这感觉就像在重新发明轮子——我肯定不能成为第一个有这种需求的人。现有的、经过测试的、强大的解决方案肯定比我作为 m4 级别的初学者可以一起破解的任何解决方案都要好。
有没有常见的 m4 习语?是否有现有的开源 m4 代码来执行此操作?在搜索引擎中四处寻找并没有发现任何有用的东西。
(由于 cpp 自己的文档中给出的原因,使用 cpp 本身不起作用:“它会阻塞不遵守 C 的词法规则的输入。” 似乎gpp具有开箱即用的功能,因此使用它可能更有意义,但如果让 m4 这样做不太痛苦,我更喜欢 m4 的普遍性。)
解决方案
我也在找这个,最后写了我自己的。这是我的wiki上的代码链接:
http://www.eugeneweb.com/wiki/Sites/M4Macros
我定义了没有# 的名称,例如。IF、ELSE、ENDIF 等... M4 还需要括号来保存 CPP(大多数情况下)没有的参数。我还添加了一个选择性调用来保护具有副作用的宏在未选择的块中被调用。再见。
推荐阅读
- java - 迄今为止的 MongoDB 纪元时间戳
- python - PyTorch:如何将相同的随机变换应用于多个图像?
- javascript - React - 评估子组件范围内的事件处理程序
- java - 唯一包含键但在不同字段上排序的集合
- arrays - 使用 numpy 数组输出列表中的第 n 个值
- c - Visual Studio 代码 - 调试
- google-places-api - Google API for Restaurants Places 在特定国家/地区?
- javascript - 当使用 JS/Jquery 动态更改元素时,等待元素的 css 被更新
- node.js - 如何使用简单的节点记录器模块
- spotify - 我正在使用 react 进行 Spotify 克隆,但我收到用户身份验证错误 INVALID_CLIENT: Invalid redirect URI