我需要将字符串^borrow$ ^\$500$
解析为列表[borrow, $500]
。我到目前为止写的语法是
:- use_module(library(dcg/basics)).
write_list([]).
write_list([H|T]) :- atom_codes(S, H), write(S), nl, write_list(T).
% Grammar.
tags([Tag|Rest]) --> string(_), tag(Tag), tags(Rest).
tags([]) --> string(_).
tag(Tag) --> "^", tag_contents(Tag), "$".
tag_contents(Tag) --> string(Tag).
当我在令牌中没有\$
时,哪个有效:
?- phrase(tags(T), "^pisica$ ^catel$"), write_list(T).
pisica
catel
?- phrase(tags(T), "^borrow$ ^\\$500$"), write_list(T).
borrow
\
使用Prolog DCG解析此类转义序列的最佳做法是什么?
答案 0 :(得分:0)
问题是tag_contents // 1只捕获反斜杠,然后$在父调用中执行标记停止。
这是一个关于这个问题的丑陋黑客:
tag(Tag1) -->
"^", tag_contents(Tag), [C], "$", {C \= 0'\\, append(Tag, [C], Tag1) }.
修改的
更好一点:
tag(Tag) --> "^", tag_contents(Tag), "$", {\+last(Tag, 0'\\)}.
修改的
'最佳实践'当然是使用上下文规则处理嵌套内容。你需要更多的代码......
tag(Tag) --> "^", tag_contents(Tag).
tag_contents([0'\\,C|Cs]) --> "\\", [C], !, tag_contents(Cs).
tag_contents([]) --> "$".
tag_contents([C|Cs]) --> [C], tag_contents(Cs).