我的长语法一直在失败。
它识别格式为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.
答案 0 :(得分:1)
已解决:我的长语法一直失败
我只是注释掉了基本情况!!!
%% test([]) --> [].
我明白了
?- string_codes(" a. a.",Y),phrase(test(X),Y).
Y = [32, 97, 46, 32, 97, 46],
X = [[s, 1], ['a.'], [s, 1], ['a.']].