저는 Prolog의 내장 DCG 기능을 사용하여 Lisp-C 변환기를 작성하고 있습니다. 이것은 산수를 처리하는 방법입니다.프롤로그의 DCG - 문자열
expr(Z) --> "(", "+", spaces, expr(M), spaces, expr(N), ")", {swritef(Z, "%d + %d", [M, N])}.
expr(Z) --> "(", "-", spaces, expr(M), spaces, expr(N), ")", {swritef(Z, "%d - %d", [M, N])}.
expr(Z) --> "(", "*", spaces, expr(M), spaces, expr(N), ")", {swritef(Z, "%d * %d", [M, N])}.
expr(Z) --> "(", "/", spaces, expr(M), spaces, expr(N), ")", {swritef(Z, "%d/%d", [M, N])}.
expr(E) --> number(E).
number(C) --> "-", digits(X), {C is -X}.
number(C) --> digits(C).
digits(D) --> digit(D);digit(A),digits(B), {number_codes(B,Cs),length(Cs,L), D is A*(10^L)+B}.
digit(D) --> [C], {"0"=<C, C=<"9", D is C - "0"}.
이제는 중첩 된 표현식을 처리하지 않습니다.
expr(Z) --> "(", "+", spaces, expr(M), spaces, expr(N), ")", {swritef(Z, "%s + %s", [M, N])}.
expr(E) --> number(N), {swritef(E, "%d", [N])}.
하지만이납니다 : : 여기 일 것이라고 생각 무엇
?- expr(E, "42", []).
E = "42" %all OK
?- expr(E, "(+ 3 (* 2 2))", []).
E = "%s + %s" %not OK
가 어떻게 작동해야합니까?
어떤 프롤로그를 사용합니까? –
@Bobby : SWI-Prolog 버전 5.6.64 – Igor