2014-07-12 6 views
1

^borrow$ ^\$500$ 문자열을 구문 분석하여 [borrow, $500] 목록에 추가해야합니다. 내가 쓴 문법 지금까지 내가 토큰 내부 \$이 없을 때 작동 어느이스케이프 시퀀스를 구문 분석하기위한 프롤로그 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 
\ 

프롤로그 DCGS로 이스케이프 시퀀스 이런 종류의 구문 분석을위한 가장 좋은 방법은 무엇입니까?

답변

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

관련 문제