gpt4 book ai didi

parsing - 使用 DCG 在 EBNF 的 Prolog 中实现 DSL 的困难

转载 作者:行者123 更新时间:2023-12-04 14:55:24 25 4
gpt4 key购买 nike

我正在为 实现 Google Protobuf 编译器。原型(prototype) Prolog 中用于生成 Prolog 程序的文件。序言是 SWI-序言 .

我正在翻译 EBNF 定义到 DCG 中并遇到了一些问题:

  • 我必须处理[ ... ]{ ... } EBNF 构造 - 含义 optional (可执行零次或一次)和repeatative (可执行任意次数);
  • 我必须将回调插入 DCG 代码以使用 DCG 的构造 { ... } 实现编译器功能的一部分(语法切换/导入/等)。 ,它允许在 DCG 规则中使用 Prolog 语法中的目标。

  • 我正在申请 optionalrepeatative元谓词: $$rep/1 , $$opt/1 :
    EBNF
    decimals = decimalDigit { decimalDigit }
    exponent = ( "e" | "E" ) [ "+" | "-" ] decimals

    DCG
    decimals --> decimalDigit, '$$rep'( decimalDigit ).
    exponent --> ( "e"; "E" ), '$$opt'( "+"; "-" ), decimals.

    '$$rep'( Goal ) :- repeat, call(Goal); !, fail.

    '$$opt'( Goal ) :- once(Goal) ; \+ Goal.

    "Callback:"
    import --> "import", opt(( "weak" ; "public", { record(public)} )), strLit,
    {
    import(public, strlit )
    }, ";".

    对我来说看起来很尴尬(如果不是说丑的话)......

    问题:

    我的解决方案有什么问题?

    我应该在不使用元谓词的情况下手动将 EBNG 翻译成 DCG 吗?

    尴尬地渗透到 DCG 规则中的替代方案是什么?

    最佳答案

    乍一看,主要问题是你不干净混合 具有常规 Prolog 谓词的 DCG。

    留在 DCG 内以定义所有非终结符。例如:

    可选(NT)--> [] |新台币。

    once_or_more(NT) --> NT,or_more(NT)。

    or_more(NT) --> [] |新台币,或_more(新台币)。

    使用以下示例定义:

    一-> [一]。

    我们可以发布:

    ?- 短语(可选(a),Ls)。
    LS = [] ;
    LS = [a]。

    ?- 短语(once_or_more(a), Ls)。
    LS = [一] ;
    Ls = [a, a] ;
    Ls = [a, a, a] ;
    Ls = [a, a, a, a] ;
    Ls = [a, a, a, a, a] 。

    这似乎可以根据您的需要工作。

    对于回调,您可以简单地传递您需要调用的谓词,大致如下:

    parse_with_callback(目标) -->
    ...,
    { 目标 },
    ...

    这似乎还可以。

    如果此类模式经常出现,您始终可以考虑从不同的表示中生成此类 DCG,以便更清晰地表示任务。

    关于parsing - 使用 DCG 在 EBNF 的 Prolog 中实现 DSL 的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43673482/

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