最近我一直在 Prolog 中使用 DCG,但我一直面临一些关于它如何工作的问题。例如,我有这个小语法:
<atom> :: <letter> <atom_part> | <letter>
<atom_part> :: <letter> | <digit> | <letter> <atom_part> | <digit> <atom_part>
<letter>:: 'a' | 'b' ... |'Z'
<digit> :: '0' |...|'9'
如果我没记错的话,它是任何必须以字母开头的字母或数字字符串。无论如何,我解析它的尝试如下:
letter("a") --> "a".
number(X) --> number(X).
...
%etc
programme(I) --> atomm(I).
atomm(C) --> letter(Ch).
atomm(C) --> numb(Ch).
atomm((E)) --> atomm_part(E).
atomm_part(E1,E2) --> atomm(E1),!,atomm(E2).
在这里,我认为很明显最后两行是错误的。这真的是因为我不确定如何进行“递归调用”,所以解析器再次检查字符串中的下一个字符是数字还是字符串。我该如何纠正?提前致谢!
顺便说一句,我正在使用 swi-prolog