gpt4 book ai didi

prolog - 如何将 Prolog 变成预处理器(有点 m4,gpp)?

转载 作者:行者123 更新时间:2023-12-04 04:51:33 27 4
gpt4 key购买 nike

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

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

所以我们在这里:我们有一种任意的输出语言(Ada,然后是 JavaScript,然后可能是其他语言),并且大多数时候在 native 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 邮件列表,WRT 最新版本 6.3.18

MODIFIED: Deleted preprocessor/2 after discussion on the mailinglist. Code relying on this (we hope none) can use the hook user:prolog_load_file/2 to achieve the same result.



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

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

关于prolog - 如何将 Prolog 变成预处理器(有点 m4,gpp)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17360703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com