2014-07-12 50 views
1

我需要將字符串^borrow$ ^\$500$解析爲列表[borrow, $500]。我寫的語法迄今Prolog DCG用於解析轉義序列

:- 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

問題是,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). 
+0

對不起,這個,但標籤// 1使用標籤// 1是不正確的。 – false