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

时间:2017-11-07 15:31:57

标签: 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.

我在查询N=7

时需要输出phrase(symbol(num(N)),"7").

1 个答案:

答案 0 :(得分:2)

我在这里看到三个问题。

  1. client = Restforce.new acc1 = client.query("SELECT ID, firstName, LastName FROM Account where ID = '#{account_ID}'").first acc1["firstName"] = "test" acc1.save 想要对代码列表进行操作。从版本7开始,SWI具有不支持DCG的本机字符串类型。所以,你现在必须采用这种稍微不方便的表述:

    phrase/2
  2. 一般情况下,你想从输入中剥离一些东西然后将它交给一些纯Prolog谓词来做某事。换句话说,就像这样:

    atom_codes("if", Codes), phrase(symbol(X), Codes)
    

    当然,这只适用于单位数字,这可能不是你想要的,所以......

  3. 您应该使用dcg/basics.pl中的代码,如下所示:

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

    或者您可以使用the source code复制/粘贴内容。你可能会注意到那里的所有DCG规则都是从调用另一个DCG规则开始,或者他们消耗了一些输入,然后做了其他事情;你可能不想生成某些东西,然后在输入中查找它。