내가이 T-> UU
을 가정하고 알고, 첫 번째 parse_U
는 "aabb
"을 구문 분석, 그리고 두 번째 parse_U
이 마지막 "ab
"을 구문 분석,하지만이 작업을 수행하는 방법을 알아낼 수 없습니다 추가와 함께. a
으로 시작하고 b
으로 끝나는 하위 목록 만 가져올 수 있지만 원하는 결과가 아닙니다.파싱 연속 비 터미널
도움을 주시면 감사하겠습니다.
내가이 T-> UU
을 가정하고 알고, 첫 번째 parse_U
는 "aabb
"을 구문 분석, 그리고 두 번째 parse_U
이 마지막 "ab
"을 구문 분석,하지만이 작업을 수행하는 방법을 알아낼 수 없습니다 추가와 함께. a
으로 시작하고 b
으로 끝나는 하위 목록 만 가져올 수 있지만 원하는 결과가 아닙니다.파싱 연속 비 터미널
도움을 주시면 감사하겠습니다.
Prolog에서 구문 분석을 수행 할 때는 가능한 경우 DCG (Definite Clause Grammar)를 사용하는 것이 좋습니다. 내가 잘못 아니에요 경우
, 문법은 단순히
isS --> isT.
isS --> isV.
isT --> isU, isU.
isU --> [a], isU, [b].
isU --> [a, b].
isV --> [a], isV, [b].
isV --> [a], isW, [b].
isW --> [b], isW, [a].
isW --> [b, a].
될 수 있고 L 구문 분석하는 순서와 목록입니다 isS(L, [])
를 호출 할 수 있습니다.
isS([a,a,b,b,a,b], [])
당신이 진정한 받아야 호출
.
--- 편집 ---
이 숙제이고 우리가 사용 할 수 없습니다 "->"
-->
의 특별한 아무것도 DGC에 없다
(사용) 구문; 그것은 일반적인 구문의 단지 semplification입니다. 당신이 진정한 받아야
is_S([a,a,b,b,a,b], [])
를 호출 : (규칙 이름에 추가 undescores주의)
is_S(Lin, Lout) :- is_T(Lin, Lout).
is_S(Lin, Lout) :- is_V(Lin, Lout).
is_T(Lin, Lout) :- is_U(Lin, Lmid), is_U(Lmid, Lout).
is_U([a | Tin], Lout) :- is_U(Tin, [b | Lout]).
is_U([a, b | Lout], Lout).
is_V([a | Tin], Lout) :- is_V(Tin, [b | Lout]).
is_V([a | Tin], Lout) :- is_W(Tin, [b | Lout]).
is_W([b | Tin], Lout) :- is_W(Tin, [a | Lout]).
is_W([b, a | Lout], Lout).
내가 잘못 아니에요 경우
, 당신은 위와 같이 DCS 구문을 작성할 수 있습니다.
코드에 문제가 있으면 – max66