我正在使用 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
但找不到解决办法。
-
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;
- 使用删除一般 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(使用前将#替换为@)