【问题标题】:Get Prolog DCG arguments generated from sentence being parsed获取从被解析的句子生成的 Prolog DCG 参数
【发布时间】:2018-04-20 01:49:51
【问题描述】:

我正在使用 Prolog DCG 为简单的编程语言组合一个词法分析器/解析器,它使用 DCG 参数构建令牌/语法树列表,例如

symbol(semicolon) --> ";".
symbol(if) --> "if".

然后使用 DCG 规则的这些参数构建语法树。

但是,我遇到了一个问题,当它解析变量和数字(这种语言中只有整数)时,我需要 DCG 参数更加动态,例如

symbol(number(X)) --> X, {integer(N)}.

本质上,我需要 DCG 参数本质上是从它实际解析的内容中生成的。有没有办法做到这一点?如果没有,有什么好的解决方法?

编辑:作为一个具体的例子,我有规则

symbol(num(N)) --> {number_codes(N,C)}, C.

查询phrase(symbol(num(N)),"7").时我需要输出N=7

【问题讨论】:

  • 绝对有可能;你见过dcg/basics吗? (另外,它的源代码is pretty instructive too。)
  • 你已经接近了。 symbol(number(X)) --> [X], {integer(X)}. 虽然你要小心,因为number/1 是一个标准的 Prolog 谓词。也许选择别的东西。
  • 我不太确定;我目前面临的具体例子是:symbol(num(N)) --> {number_codes(N,C)}, C。输入 `phrase(symbol(num(N)),"7") 时,我基本上需要输出 N=7

标签: parsing prolog lexical-analysis dcg


【解决方案1】:

我在这里看到三个问题。

  1. phrase/2 想要对代码列表进行操作。从版本 7 开始,SWI 具有不支持 DCG 的本机字符串类型。因此,您现在必须采用这种稍微不方便的表述:

    atom_codes("if", Codes), phrase(symbol(X), Codes)
    
  2. 一般来说,你想从输入中剥离一些东西然后把它交给一些纯Prolog谓词来做某事。换句话说,是这样的:

    symbol(num(N)) --> [C], { number_codes(N, [C]) }.
    
    ?- atom_codes(9, X), phrase(symbol(S), X).
    X = [57],
    S = num(9).
    

    当然,这仅适用于个位数,这可能不是您想要的,所以...

  3. 您可能应该像这样使用dcg/basics.pl 中的代码:

    :- use_module(library(dcg/basics)).
    
    symbol(num(N)) --> integer(N).
    
    ?- atom_codes(973, X), phrase(symbol(S), X).
    X = [57, 55, 51],
    S = num(973).
    

    或者您可以使用the source code 进行复制/粘贴。您可能会注意到其中的所有 DCG 规则要么以调用另一个 DCG 规则开始,要么它们消耗一些输入然后执行其他操作;你可能不想生成一些东西然后在输入中寻找它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多