Parsing 为什么此规则不使用第一个字符[Prolog CFG]?

Parsing 为什么此规则不使用第一个字符[Prolog CFG]?,parsing,prolog,grammar,swi-prolog,Parsing,Prolog,Grammar,Swi Prolog,我正在尝试编写一个用于包装元素的规则,但是当输入递归规则时,第一个元素仍然被包含,可能我没有正确理解语法,但逗号不应该转到下一个元素 % [First] should be consumed (note: charcode 194 is for the backtick character) backticks(L) --> [First], {char_code(First,194), writeln(["first was backtick",First])}, nobackticks

我正在尝试编写一个用于包装元素的规则,但是当输入递归规则时,第一个元素仍然被包含,可能我没有正确理解语法,但逗号不应该转到下一个元素

% [First] should be consumed (note: charcode 194 is for the backtick character)
backticks(L) --> [First], {char_code(First,194), writeln(["first was backtick",First])}, nobackticks(L), {writeln(["identifier",L])}.
nobackticks([]) --> [Last], {char_code(Last,194),writeln(["last is backtick",Last])}.
nobackticks([X|Xs]) --> [X], nobackticks(Xs), {writeln(["checking backticks",X,Xs])}.
%run recursively until it finds the last backtick
试验

输出:

[first was backtick,´]
[last is backtick,´]
[checking backticks,s,[]]
[checking backticks,k,[s]]
[checking backticks,c,[k,s]]
[checking backticks,i,[c,k,s]]
[checking backticks,t,[i,c,k,s]]
[checking backticks,k,[t,i,c,k,s]]
[checking backticks,c,[k,t,i,c,k,s]]
[checking backticks,a,[c,k,t,i,c,k,s]]
[checking backticks,b,[a,c,k,t,i,c,k,s]]
[checking backticks,´,[b,a,c,k,t,i,c,k,s]]
[identifier,[´,b,a,c,k,t,i,c,k,s]]
预期产出:

[identifier,[b,a,c,k,t,i,c,k,s]]
[first was backtick, ´]
[last is backtick, ´]
[checking backticks, s, []]
[checking backticks, k, [s]]
[checking backticks, c, [k, s]]
[checking backticks, i, [c, k, s]]
[checking backticks, t, [i, c, k, s]]
[checking backticks, k, [t, i, c, k, s]]
[checking backticks, c, [k, t, i, c, k, s]]
[checking backticks, a, [c, k, t, i, c, k, s]]
[checking backticks, b, [a, c, k, t, i, c, k, s]]
[identifier, [b, a, c, k, t, i, c, k, s]]
[b, a, c, k, t, i, c, k, s]
true
false

最后,如果运行
?-char\u-code('),C),则该规则不成功。

您将获得
C=180
(至少在SWISH中)。因此,您需要将代码中的
194
更改为
180
,您将获得所需的输出:

[identifier,[b,a,c,k,t,i,c,k,s]]
[first was backtick, ´]
[last is backtick, ´]
[checking backticks, s, []]
[checking backticks, k, [s]]
[checking backticks, c, [k, s]]
[checking backticks, i, [c, k, s]]
[checking backticks, t, [i, c, k, s]]
[checking backticks, k, [t, i, c, k, s]]
[checking backticks, c, [k, t, i, c, k, s]]
[checking backticks, a, [c, k, t, i, c, k, s]]
[checking backticks, b, [a, c, k, t, i, c, k, s]]
[identifier, [b, a, c, k, t, i, c, k, s]]
[b, a, c, k, t, i, c, k, s]
true
false

谢谢,但这对我不起作用,尽管我发现一个反勾号算作两个连续的字符194和180,所以我更改了代码