簡體   English   中英

Prolog DCG用於解析轉義序列

[英]Prolog DCG for parsing escaped sequences

我需要將字符串^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解析此類轉義序列的最佳實踐是什么?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM