最近、私は 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).
ここで、最後の 2 行が間違っていることは明らかだと思います。これは、「再帰呼び出し」を行う方法がわからないため、パーサーが文字列の次の文字が数値か文字列かを再度確認するためです。どうすればこれを修正できますか? 前もって感謝します!
ところで、私はswi-prologを使用しています