如何将Prolog转换为预处理器(有点m4,gpp)?

时间:2013-06-28 08:45:21

标签: prolog preprocessor

m4可以与不同的编程语言一起使用,因为它对无法识别的文本的默认策略是输出,并且它具有便于预处理器使用所需的引用机制。我的意思是,我可以用我的IDE认为它是Ada的方式编写预处理代码。在Ada注释中隐藏了m4宏调用(include,define)。 Ada评论以 - 开头,Prolog评论以%或内部/ * * /开头。我不能轻易地混合Ada和Prolog。

m4的预处理效果不错,但其编程方面很糟糕。我想:为什么我不尝试使用通用语言呢? Prolog看起来适合我的任务。 Prolog有ISO标准,逻辑编程看起来对推理源代码有用。

所以我们在这里:我们有一个任意的输出语言(Ada,然后是JavaScript,然后可能是别的东西),并且在大多数情况下在本机IDE中为相应的语言编写源代码会很好。我需要预处理器才能有一个合适的解析器(比如m4)。这个解析器不应该具有Ada语法知识,而应该只知道Ada词法,并且应该可以使其宏调用看起来像Ada函数调用。

其命令行界面应类似于m4或gcc -E。应该可以做两种包括:纯Prolog源代码和预处理代码。

如果您知道我如何能够很快实现这些目标,请写在这里。我可以接受非Prolog解决方案,但在其他方面我更喜欢标准语言。例如,m4是POSIX的一部分。

3 个答案:

答案 0 :(得分:2)

Prolog是完成此任务的不寻常选择。实际上,SWI-Prolog曾经有可能调用C预处理器 - 现在应该已经被删除了,因为它没什么用处。

无论如何,可以使用DCG。如果你 非常精通Prolog,我会反对它,因为调试很困难:

prep(I, O) :-
    phrase(exp, I, O).

exp --> mac, !, exp.
exp, [C] --> [C], exp.
exp --> [].

% macro definitions, use 'pushback' argument to change text

mac, "AAA" --> "a".
mac, "G" --> "goal".

例如

?- prep("my goal is mars", X).
X = "my G is mAAArs" .

编辑:来自SWI-Prolog邮件列表,WRT最新版本6.3.18

  

MODIFIED:在讨论之后删除了预处理器/ 2      邮件列表。依赖于此的代码(我们希望没有)可以使用钩子      user:prolog_load_file / 2来获得相同的结果。

我认为可用的功能或多或少是#include< ...>的功能。 对于Prolog中的宏扩展(或更好,术语重写),有goal_expansionterm_expansion

编辑:最新版本带来quasiquotations。与DCG中的解析器一起可以帮助实现转换。

答案 1 :(得分:0)

你看过StringTemplate吗?它是ANTLR(编译器构造工具)的一部分。它是用Java编写的(尽管有一个C#端口,等等)。可以编写ANTLR语法来定位许多不同的语言。 StringTemplate用于为不同的目标语言生成代码。

检查出来。

答案 2 :(得分:0)

我使用DCG为FontForge生成python脚本(为外汇交易创建和维护烛台字体);我尝试过M4脚本,但它们不容易编程(正如你所提到的),并且很难与我在Prolog数据库中的字形定义合并。

DCG被认为主要用于解析;但我发现他们自己就像一个模板引擎