parsing - 获取从正在解析的句子生成的 Prolog DCG 参数

标签 parsing prolog lexical-analysis dcg

我正在使用 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

最佳答案

我在这里看到三个问题。

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

    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 规则开始,要么消耗一些输入,然后执行其他操作;您可能不想生成某些内容然后在输入中查找它。

关于parsing - 获取从正在解析的句子生成的 Prolog DCG 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47161683/

相关文章:

python - Python编程语言的词法分析

java - 从文本文件中删除选定的单词?

c - x1 + x2 +...+xn 的解析器和扫描器

parsing - 学习增量编译设计

PHP 数组解析 robots.txt 中的站点地图

python - 如何将 .txt 文件解析为 .xml?

安卓和序言

list - Prolog:在指定索引处替换列表中的元素

Prolog 参数没有充分实例化

php - 从远程服务器解析 JSON 数据