% Logik og sprog, Modul 2, datalogi RUC Henning Christiansen % % % DCG for simple udtryk % med oversaettelse til Mini-stak-og-variabel-maskinen % % Afsnit 4.7.2 i "Sprog og abstrakte maskiner" % % (c) 2000, Henning Christiansen % % eksempel: % | ?- phrase(udtryk(K),[1,+,2,*,3]). % % K = [stak(1),stak(2),stak(3),udregn(*),udregn(+)] ? :- use_module(library(lists)). :- op(700, xfx, <-). udtryk(K) --> sekundaert_udtryk(K1), evt_mere_udtryk(K2), {K <- K1 + K2}. evt_mere_udtryk(K) --> [+], sekundaert_udtryk(K1), evt_mere_udtryk(K2), {K <- K1 + udregn(+) + K2}. evt_mere_udtryk([]) --> []. sekundaert_udtryk(K) --> tertiaert_udtryk(K1), evt_mere_sekundaert_udtryk(K2), {K <- K1 + K2}. evt_mere_sekundaert_udtryk(K) --> [*], tertiaert_udtryk(K1), evt_mere_sekundaert_udtryk(K2), {K <- K1 + udregn(*) + K2}. evt_mere_sekundaert_udtryk([]) --> []. tertiaert_udtryk(K) --> [Tal], {integer(Tal), K <- stak(Tal)}. %%%%% Den lille hjaelper... [] <- []:- !. Sekvens <- Et + To :- !, Sekvens <- [Et | To]. Sekvens <- [Ho | Ha] :- !, HoSekvens <- Ho, HaSekvens <- Ha, append(HoSekvens, HaSekvens, Sekvens). [NonList] <- NonList.