m4可以与不同的编程语言一起使用,因为它对无法识别的文本的默认策略是输出,并且它具有方便的预处理器使用所需的引用机制。我的意思是,我可以用IDE认为它是Ada的方式编写预处理代码。m4宏调用(包括、定义)隐藏在Ada注释中。Ada注释以--开头,Prolog注释以%开头或在/* */中。我不能轻易地混淆Ada和Prolog。
m4在预处理方面做得足够好,但是它的编程方面很糟糕。我想:为什么我不试试通用语言呢?Prolog看起来很适合我的任务。Prolog有ISO标准,逻辑编程看起来对源码生成的推理很有用。
所以我们就是这样:我们有一种任意的输出语言(Ada,然后是JavaScript,然后可能是其他语言),并且大多数时候用本机IDE为相应的语言编写源代码会很好。我需要预处理器才能有一个合适的解析器(就像m4一样)。这个解析器不应该有Ada语法知识,相反,它应该只知道Ada词法,并且应该可以使它的宏调用看起来像Ada函数调用。
它的命令行界面应该类似于m4或gcc -E。两种类型的包含都应该是可能的:纯Prolog源代码和预处理代码。
如果你知道我如何在短期内实现这些目标,请在这里写下。我可能可以接受非Prolog解决方案,但在其他解决方案中,我更喜欢标准语言。例如,m4是POSIX的一部分。
发布于 2013-06-28 18:26:12
对于这项任务,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
已修改:在讨论邮件列表后删除了预处理器/2。依赖于此的代码(我们希望没有)可以使用钩子user:prolog_load_file/2来实现相同的结果。
我认为可用的功能或多或少与#include <...>差不多。对于Prolog中的宏扩展(或者更好,术语重写),有goal_expansion或term_expansion
编辑:最新版本带来了quasiquotations。再加上DCG中的解析器,可以帮助实现这种转换。
发布于 2013-06-29 08:45:40
你看过StringTemplate吗?它是ANTLR (编译器构造工具)的一部分。它是用Java语言编写的(尽管其中有一个C#端口)。ANTLR语法可以针对许多不同的语言编写。StringTemplate是它用来为不同目标语言生成代码的工具。
看看这个。
发布于 2013-07-14 09:59:41
我使用DCGs为FontForge生成python脚本(为外汇交易创建和维护烛台字体);我尝试过M4脚本,但它们不容易接受编程(正如您所提到的),并且很难与驻留在Prolog数据库中的字形定义合并。
DCG被认为主要用于解析;但我发现它们本身就像一个模板引擎。
https://stackoverflow.com/questions/17360703
复制相似问题