List Prolog中的字符串到列表解释器在2项上卡住



我编写了一种名为List Prolog的编程语言(其中谓词以[n,predicate_name]开头,变量为[v,variable_name](,并且在获取一些代码(一种具有定子句语法的算法,它将字符串转换为Prolog术语或列表列表等(以处理n个查询时遇到了困难,而不是每个列表(字符串中(只有2个项目。

顺便说一句,List Prolog与Prolog不同,因为它包含需要用户编写自己的基本用例的语法,类似于用C编写的解释器,即

[[n,compound213],["","",[v,t],[v,t]]],
[[n,compound213],[[v,u],[v,u],[v,t],[v,t]]],

在查询中,[[n,grammar1],["[["aa",b],1]",[v,t]]]起作用,即只有2个项目,即["aa",b],可以转换为字符串的一部分,但不能超过这个数字,即["aa",b,"c",[]],因此[[n,grammar1],["[["aa",b,"c",[]],1]",[v,t]]]不起作用。

注意:该算法旨在获取一个字符串,如"["a",b,3]",并返回一个术语,即["a",b,3],其中包含字符串、原子、数字、空列表以及更多这些的列表。

% The query:
test(15,[[n,grammar1],["[["aa",b,"c",[]],1]",[v,t]]],
% The code:
[
[[n,grammar1],[[v,u],[v,t]],":-",
[
[[n,compound],[[v,u],"",[],[v,t]]]
]
],
[[n,compound213],["","",[v,t],[v,t]]],
[[n,compound213],[[v,u],[v,u],[v,t],[v,t]]],
[[n,compound],[[v,t],[v,u]],"->",
["[","]",
[[n,compound213],[[v,t],[v,u]]]]],
[[n,compound],[[v,t],[v,u]],"->",
["[",[[n,compound21],[[v,t],[v,v]]],"]",
[[n,compound213],[[v,v],[v,u]]]]],
[[n,compound212],["","",[v,t],[v,t]]],
[[n,compound212],[[v,u],[v,u],[v,t],[v,t]]],
[[n,compound21],[[v,t],[v,u]],"->",
[[[n,item],[[v,i]]],
% [[n,lookahead],["]"]],
[[n,code],[[n,wrap],[[v,i],[v,itemname1]]],
[[n,append],[[v,t],[v,itemname1],[v,v]]]],
[[n,compound212],[[v,v],[v,u]]]]],
[[n,compound21],[[v,t],[v,u]],"->",
[[[n,item],[[v,i]]],",",

%[[n,code],[[n,trace]]],

[[n,compound21],[[],[v,compound1name]]],
[[n,code],[[n,wrap],[[v,i],[v,itemname1]]],
[[n,append],[[v,t],[v,itemname1],[v,v]]],
[[n,append],[[v,v],[v,compound1name],[v,u]]]]]],
[[n,item],[[v,t]],"->",[""",[[n,word21],["",[v,t]]],
"""]],
[[n,item],[[v,t]],"->",
[[[n,number21],["",[v,u]]],[[n,code],
[[n,stringtonumber],[[v,u],[v,t]]]]]],
[[n,item],[[v,t]],"->",[[[n,word21_atom],["",[v,t1]]],
[[n,code],[[n,atom_string],[[v,t],[v,t1]]]]]], % atoms
[[n,item],[[v,t]],"->",[[[n,compound],[[],[v,t]]]]],
[[n,number212],["","",[v,t],[v,t]]],
[[n,number212],[[v,u],[v,u],[v,t],[v,t]]],
[[n,number21],[[v,t],[v,u]],"->",
[[v,a],[[n,commaorrightbracketnext]],
[[n,code],[[n,stringtonumber],[[v,a],[v,a1]]],
[[n,number],[[v,a1]]],
[[n,stringconcat],[[v,t],[v,a],[v,v]]]],
[[n,number212],[[v,v],[v,u]]]]],
[[n,number21],[[v,t],[v,u]],"->",
[[v,a],
[[n,code],[[n,stringtonumber],[[v,a],[v,a1]]],
[[n,number],[[v,a1]]],
[[n,stringconcat],[[v,t],[v,a],[v,v]]]],
[[n,number21],["",[v,numberstring]]],
[[n,code],[[n,stringconcat],
[[v,v],[v,numberstring],[v,u]]]]]],
[[n,word212],["","",[v,t],[v,t]]],
[[n,word212],[[v,u],[v,u],[v,t],[v,t]]],
[[n,word21],[[v,t],[v,u]],"->",
[[v,a],[[n,quote_next]],
[[n,code],
[[n,not],[[[n,=],[[v,a],"""]]]],
[[n,stringconcat],[[v,t],[v,a],[v,v]]]],
[[n,word212],[[v,v],[v,u]]]]],
[[n,word21],[[v,t],[v,u]],"->",
[[v,a],
[[n,code],
[[n,not],[[[n,=],[[v,a],"""]]]],
[[n,stringconcat],[[v,t],[v,a],[v,v]]]],
[[n,word21],["",[v,wordstring]]],
[[n,code],
[[n,stringconcat],[[v,v],[v,wordstring],[v,u]]]]]],

[[n,word212_atom],["","",[v,t],[v,t]]],
[[n,word212_atom],[[v,u],[v,u],[v,t],[v,t]]],
[[n,word21_atom],[[v,t],[v,u]],"->",
[[v,a],[[n,commaorrightbracketnext]],
[[n,code],
[[n,not],[[[n,=],[[v,a],"""]]]],
[[n,not],[[[n,=],[[v,a],"["]]]],
[[n,not],[[[n,=],[[v,a],"]"]]]],
[[n,stringconcat],[[v,t],[v,a],[v,v]]]],
[[n,word212_atom],[[v,v],[v,u]]]]],
[[n,word21_atom],[[v,t],[v,u]],"->",
[[v,a],
[[n,code],
[[n,not],[[[n,=],[[v,a],"""]]]],
[[n,not],[[[n,=],[[v,a],"["]]]],
[[n,not],[[[n,=],[[v,a],"]"]]]],
[[n,stringconcat],[[v,t],[v,a],[v,v]]]],
[[n,word21_atom],["",[v,wordstring]]],
[[n,code],
[[n,stringconcat],[[v,v],[v,wordstring],[v,u]]]]]],

[[n,commaorrightbracketnext],"->",
[[[n,lookahead],[","]]]],
[[n,commaorrightbracketnext],"->",
[[[n,lookahead],["]"]]]],

[[n,quote_next],"->",
[[[n,lookahead],["""]]]],

[[n,lookahead],[[v,a],[v,a],[v,b]],":-",
[[[n,stringconcat],[[v,b],[v,d],[v,a]]]]]
],
% The desired result:
[[[[v,t],[["aa",b,"c",[]],1]]]]).

我通过取消行注释修复了代码:

[[n,lookahead],["]"]],

在取消对行的注释以打开调试后,

[[n,code],[[n,trace]]],

其揭示了在没有检查下一个字符是否为"的前瞻语句的情况下&";,代码错误地、失败地在超过2项之后跟随它所在的子句,并且使用lookahead语句,它所在的语句仅在n项列表的末尾成功。

最新更新