我使用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").
答案 0 :(得分:2)
我在这里看到三个问题。
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
一般情况下,你想从输入中剥离一些东西然后将它交给一些纯Prolog谓词来做某事。换句话说,就像这样:
atom_codes("if", Codes), phrase(symbol(X), Codes)
当然,这只适用于单位数字,这可能不是你想要的,所以......
您应该使用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规则开始,或者他们消耗了一些输入,然后做了其他事情;你可能不想生成某些东西,然后在输入中查找它。