2

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 的一部分。

4

3 回答 3

3

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。依赖于此的代码(我们希望没有)可以使用 hook user: prolog_load_file /2 来实现相同的结果。

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

编辑:最新版本带来了准引用。与 DCG 中的解析器一起有助于实现转换。

于 2013-06-28T10:26:11.917 回答
0

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

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

于 2013-07-14T01:59:40.520 回答
0

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

一探究竟。

于 2013-06-29T00:45:40.437 回答