String 列表序言中列表解释器的字符串卡在2项上

String 列表序言中列表解释器的字符串卡在2项上,string,list,prolog,interpreter,String,List,Prolog,Interpreter,我编写了一种名为List Prolog的编程语言(在这种语言中,谓词以[n,predicate\u name]开头,变量是[v,variable\u name]),但在获取一些代码时遇到了困难(一种带有definite子句语法的算法,它获取一个字符串并将其转换为Prolog术语,或者列表,等等)使用n,而不是每个列表(在字符串中)2个项目的查询 另外,List Prolog与Prolog不同,因为它包含的语法要求用户编写自己的基本情况,类似于用C编写的解释器,即 [[n,co

我编写了一种名为List Prolog的编程语言(在这种语言中,谓词以
[n,predicate\u name]
开头,变量是
[v,variable\u name]
),但在获取一些代码时遇到了困难(一种带有definite子句语法的算法,它获取一个字符串并将其转换为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]]]
起作用,即只有两个项目,即可以转换为字符串的一部分的
[\'aa\',b]
,但不能超过这个数字,即
[\'aa\',b,\'c\',[]
,因此
[[n,grammar1],“[[\'aa\',b,'c\',[]v]/code>不起作用

注意:该算法旨在获取一个字符串,如
“[\“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]]],
这表明在没有lookahead语句检查下一个字符是否为“]”的情况下,代码错误地在2个以上项目之后跟随它所在的子句,失败了,而使用lookahead语句,它所在的子句只在n个项目列表的末尾成功了