如何将Prolog转换成预处理器(类似m4,gpp)?

如何将Prolog转换成预处理器(类似m4,gpp)?,prolog,preprocessor,Prolog,Preprocessor,m4可以与不同的编程语言一起使用,因为它对未识别文本的默认策略是输出,并且它具有方便预处理器使用所需的引用机制。我的意思是,我可以编写预处理代码,使我的IDE认为它是Ada。m4宏调用(包括、定义)隐藏在Ada注释中。Ada注释以--开头,序言注释以%开头或在/**/内。我不能轻易地把Ada和Prolog混合起来 m4在预处理方面做得足够好,但其编程方面很糟糕。我想:为什么我不试试通用语言呢?Prolog看起来适合我的任务。Prolog有ISO标准,逻辑编程看起来对源代码生成的推理很有用 因此,

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

m4在预处理方面做得足够好,但其编程方面很糟糕。我想:为什么我不试试通用语言呢?Prolog看起来适合我的任务。Prolog有ISO标准,逻辑编程看起来对源代码生成的推理很有用

因此,我们现在的情况是:我们有一种任意的输出语言(Ada,然后是JavaScript,也许还有其他语言),在大多数情况下,用本机IDE为相应的语言编写源代码会很好。我需要预处理器有一个合适的解析器(像m4一样)。这个解析器不应该具有Ada语法知识,相反,它应该只知道Ada词法,并且应该能够使其宏调用看起来像Ada函数调用

它的命令行界面应该类似于m4或gcc-E。它应该可以同时包含两种类型:纯Prolog源代码和预处理代码


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

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邮件列表中,编写最新版本6.3.18

修改:已删除预处理器/2,在讨论 邮件列表。依赖于此的代码(我们希望没有)可以使用钩子 用户:/2以获得相同的结果

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


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

您看过StringTemplate吗?它是ANTLR(编译器构造工具包)的一部分。它是用Java编写的(尽管其中有一个C#端口)。ANTLR语法可以针对多种不同的语言编写。StringTemplate用于为不同的目标语言生成代码

看看吧


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


DCG被认为主要用于解析;但是我发现它们就像是一个模板引擎,我不需要非Prolog来预处理Prolog代码。我需要Prolog来预处理非Prolog代码。我想要的一个例子是Prolog服务器页面模板引擎。默认情况下,它输出文本,Prolog代码通过转义。我可能会根据自己的需要调整它。因为它主要针对HTML,所以与m4不同,m4非常适合与源代码混合使用。所以我需要一种类似的方法来转义Prolog代码,但是越接近m4的方法越好。