Моя длинная грамматика продолжает терпеть неудачу.
Он распознает текст в форме a.\n a.
и должен возвращать список предложений, пробелов и возвратов.
test//1
- это основная грамматика, которая вызывает другие правила и компилирует вывод.
sentence32//1
и sentence33//1
распознает буквы и т. Д. В предложении.
spaces//1
и returns//1
распознают пробел и возвращают соответственно.
sentenceendpunctuation//1
анализирует пунктуацию конца предложения.
Вот оно:
use_module(library(dcg/basics)).
test([]) --> [].
test(AAs) -->
spaces(Y),
{
string_length(Y,YLen),
(
YLen>0->Start = [[s,YLen]]
;
Start=[]
)
},
sentence32(X),
returns(Z),
{
[XS] = X,
string_length(XS,XLen),
(
XLen>0->append(Start,[X],Next)
;
Next=Start
),
string_length(Z,ZLen),
(
ZLen>0->append(Next,[[r,ZLen]],Last)
;
Last=Next
)
},
test(As),
{
append(Last,As,AAs)
},
!.
test(Last) -->
spaces(Y),
{
string_length(Y,YLen),
(
YLen>0->Start = [[s,YLen]]
;
Start=[])
},
sentence32(X),
returns(Z),
{
[XS] = X,
string_length(XS,XLen),
(
XLen>0->append(Start,[X],Next)
;
Next=Start
),
string_length(Z,ZLen),
(
ZLen>0->append(Next,[[r,ZLen]],Last)
;
Last=Next)
},
!.
spaces(XXs) -->
[X],
{
X=32
},
spaces(Xs),
{
char_code(Ch,X),
atom_string(CA,Ch),
atom_concat(CA,Xs,XXs)
},
!.
spaces('') --> [].
returns(XXs) -->
[X],
{
X=10
},
returns(Xs),
{
char_code(Ch,X),
atom_string(CA,Ch),
atom_concat(CA,Xs,XXs)
},
!.
returns('') --> [].
sentence32([XsZ]) -->
sentence33(Xs),
sentenceendpunctuation(Z),
{
atom_string(CA,Xs),
atom_concat(CA,Z,XsZ)
},
!.
sentence32('') --> [].
sentence33(CXs) -->
[X],
{
(
(
char_type(X,alnum)
;
char_type(X,white)
)
;
char_type(X,punct)
),
not(X=93),
char_code(C,X),
not(X=91),
not(X=46),
not(X=33),
not(X=63),
not(X=10)
},
sentence33(Xs),
{
atom_string(CA,C),
atom_concat(CA,Xs,CXs)
},
!.
sentence33('') --> [].
sentenceendpunctuation(Z) -->
[Z1],
{
char_code(Z,Z1),
(
Z='.'
;
(
Z='?'
;
(
Z='!'
)
)
)
},
!.
Когда я ввожу запрос для разбора моей строки
string_codes(" a. a.",Y),phrase(test(X),Y).
Я получаю false.