【问题标题】:How to turn Prolog into preprocessor (kinda m4, gpp)?如何将 Prolog 变成预处理器(有点 m4,gpp)?
【发布时间】:2013-06-28 08:45:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: prolog preprocessor


    【解决方案1】:

    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_expansionterm_expansion

    edit:最新版本带来了quasiquotations。与 DCG 中的解析器一起使用有助于实现转换。

    【讨论】:

    • 我不需要非 Prolog 来预处理 Prolog 代码。我需要 Prolog 来预处理非 Prolog 代码。我想要的一个例子是 Prolog Server Pages 模板引擎。它默认输出文本,Prolog 代码被 ?>。我可能会尝试适应我的需要。由于它主要针对 HTML,它与 m4 不同,后者非常适合与源代码混合。所以我需要一种类似的方式来逃避 Prolog 代码,但越接近 m4 方式越好。
    【解决方案2】:

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

    检查一下。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 2020-06-04
        相关资源
        最近更新 更多