Parsing 获取从正在分析的句子生成的Prolog DCG参数

Parsing 获取从正在分析的句子生成的Prolog DCG参数,parsing,prolog,lexical-analysis,dcg,Parsing,Prolog,Lexical Analysis,Dcg,我正在使用Prolog DCG为一种简单编程语言组装一个lexer/parser,它使用DCG参数建立标记列表/语法树,例如 symbol(semicolon) --> ";". symbol(if) --> "if". 然后使用DCG规则的这些参数构建语法树 然而,我遇到了一个问题,当解析变量和数字(在这种语言中只有整数)时,我需要DCG参数更具动态性,例如 symbol(number(X)) --> X, {integer(N)}. 本质上,我需要DCG参数从它实际解析

我正在使用Prolog DCG为一种简单编程语言组装一个lexer/parser,它使用DCG参数建立标记列表/语法树,例如

symbol(semicolon) --> ";".
symbol(if) --> "if".
然后使用DCG规则的这些参数构建语法树

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

symbol(number(X)) --> X, {integer(N)}.
本质上,我需要DCG参数从它实际解析的内容生成。有办法做到这一点吗?如果不是,什么是好的解决方法

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

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

当查询短语(符号(num(N)),“7”)时,我需要输出
N=7

我在这里看到三个问题

  • phrase/2
    希望对代码列表进行操作。自版本7以来,SWI具有不支持DCGs的本机字符串类型。因此,您现在必须使用这个稍微不方便的公式:

    atom_codes("if", Codes), phrase(symbol(X), Codes)
    
  • 通常,您希望从输入中剥离一些内容,然后将其交给某个纯Prolog谓词来执行某些操作。换句话说,类似这样的事情:

    symbol(num(N)) --> [C], { number_codes(N, [C]) }.
    
    ?- atom_codes(9, X), phrase(symbol(S), X).
    X = [57],
    S = num(9).
    
    :- 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).
    
    当然,这只适用于单位数字,这可能不是您想要的,所以

  • 您可能应该使用以下代码:

    symbol(num(N)) --> [C], { number_codes(N, [C]) }.
    
    ?- atom_codes(9, X), phrase(symbol(S), X).
    X = [57],
    S = num(9).
    
    :- 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).
    
    或者您可以使用来执行复制/粘贴操作。您可能会注意到,其中的所有DCG规则要么从调用另一个DCG规则开始,要么消耗一些输入,然后执行其他操作;您可能不希望生成某些内容,然后在输入中查找它


  • 这是绝对可能的;你看到了吗?(还有它的源代码。)很接近了
    symbol(number(X))-->[X],{integer(X)}。
    尽管您需要小心,因为
    number/1
    是标准的Prolog谓词。也许你可以选择别的,但我不太确定;我目前面临的具体例子是:
    symbol(num(N))-->{number\u code(N,C)},C
    。输入短语(符号(num(N)),“7”)时,我基本上需要输出
    N=7