使用 m4 进行预处理

2024-01-30

我正在使用 Free-Pascal(课程作业)编写一个预处理器m4 https://www.gnu.org/software/m4/。我正在阅读 stackoverflow 上的帖子here https://stackoverflow.com/questions/396644/replacements-for-the-c-preprocessor从那里到达blog https://kvanberendonck.wordpress.com/tag/m4/这基本上显示了基本用法m4用于预处理C。博主用了一个测试C file 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;
}

我的疑问是:
1. 程序员将在该行编写代码

    define(`DEF', `3')

将会

    #define DEF 3

那么谁将这一行转换为上面的行呢?我们可以使用类似的工具sed or awk做同样的事情但是有什么用m4。那件事m4确实可以使用来实现sed also.
如果有人能告诉我如何将程序员的代码转换为可以使用的文件,那将非常有帮助m4.

2.我在使用时遇到了另一个问题m4。类似语言的评论C在预处理之前被删除,所以可以使用m4?为此我正在寻找命令m4我可以使用正则表达式替换注释,我发现regexp(),但它需要将字符串替换为参数,这在本例中不可用。那么如何实现这一目标呢?

抱歉,如果这是一个天真的问题。我读过的文档m4但找不到解决办法。


  1. m4是将转换的工具DEF to 3在这种情况下。确实如此sed or awk对于这个简单的情况可以达到相同的目的,但是m4是一个更强大的工具,因为它 a) 允许对宏进行参数化,b) 包含条件,c) 允许通过输入文件重新定义宏,等等。例如,可以写(在文件中for.pas.m4,灵感来自于):
define(`LOOP',`for $1 := 1 to $2 do
begin')dnl
define(`ENDLOOP',`end')dnl

LOOP(i,10)
  WriteLn(i);
ENDLOOP;

...在处理时会产生以下输出,可供 Pascal 编译器使用m4 for.pas.m4:

for i := 1 to 10 do
begin
        WriteLn(i);
end;
  1. 使用删除一般 Pascal 注释m4不可能,但创建一个宏来包含注释will在处理中被“m4”删除很简单:
define(`NOTE',`dnl')dnl
NOTE(`This is a comment')
      x := 3;

...产生:

    x := 3;

将通过以下方式扩展的常用宏m4可以放在一个公共文件中,该文件可以包含在任何使用它们的 Pascal 文件的开头,从而无需在每个 Pascal 文件中定义所有必需的宏。看include (file) in the m4说明书 http://www.gnu.org/software/m4/manual/m4.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 m4 进行预处理 的相关文章

随机推荐