我正在使用m4为免费Pascal(课程作业)编写一个预处理器.我在堆栈溢出这里上读取线程,从那里读取到一个博客,它实质上显示了m4用于C预处理的基本用法。博主使用一个测试C文件test.c.m4,如下所示:
#include
define(`DEF', `3')
int main(int argc, char *argv[]) {
printf("%d\n", DEF);
return 0;
}并使用C生成这样的处理过的m4文件,这很好。
$ m4 test.c.m4 > test.c
$ cat test.c
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%dn", 3);
return 0;
}我的怀疑是:
define(`DEF', `3')将会是
#define DEF 3那么,谁将这一行转换为上面的一行呢?我们可以使用像sed或awk这样的工具来做同样的事情,但是m4的使用是什么呢?m4所做的事情也可以使用sed来实现。
如果有人能告诉我如何将程序员的代码转换成m4可以使用的文件,那将是非常有帮助的。
m4时遇到了另一个问题。像C这样的语言中的注释在预处理之前会被删除,所以这可以用m4来完成吗?为此,我在m4中寻找命令,通过这些命令可以使用regex替换注释,并找到regexp(),但它要求将字符串替换为参数,在本例中是不可用的。那么,如何实现这一点呢?抱歉,如果这是个天真的问题。我阅读了m4的文档,但没有找到解决方案。
发布于 2015-03-27 00:52:29
m4是将DEF转换为3的工具。的确,sed或awk在这个简单的情况下可以达到同样的目的,但是m4是一个更强大的工具,因为它( a)允许宏参数化,b)包含条件,c)允许通过输入文件重新定义宏,等等。例如,您可以编写(在for.pas.m4文件中,受棘轮启发):定义(1,10)
LOOP',循环(I,10) WriteLn(i);
..。,它为m4 for.pas.m4处理Pascal编译器生成以下输出:
for i := 1 to 10 do
begin
WriteLn(i);
end;m4删除一般Pascal注释是不可能的,但是创建一个宏来包含在处理过程中将被‘m4’删除的注释是很简单的:定义(
NOTE',dnl)dnl注(‘这是一个注释’)x := 3;
..。生产:
x := 3;要由m4展开的常用宏可以放在一个公共文件中,该文件可以包含在使用它们的任何Pascal文件的开头,因此没有必要在每个Pascal文件中定义所有必需的宏。参见include (file)中的m4手册。
https://stackoverflow.com/questions/28978906
复制相似问题