Tęsknisz za zasadą statements
!
W każdym razie, zasady DCG to zwykły cukier składniowy w Prologu, możesz użyć dowolnej funkcji Prolog, którą lubisz. Jeśli chcesz zachować gramatykę zwartą:
type(type(T)) --> [T], {memberchk(T, [int, string])}.
Szelki pozwalają na mieszanie ogólnych Prologów z zasadami gramatyki.
Jak zauważyłeś @false, twoja gramatyka jest przydatna tylko wtedy, gdy masz tokenizera, który dzieli twoje dane wejściowe i odrzuca wszelkie spacje w postaci. Czy można sobie z tym poradzić bardziej bezpośrednio, za pomocą tego schematu (uwaga, kod niesprawdzone):
program(prog(DECLS, STATS)) -->
s, "program", s, declarations(DECLS),
s, "begin", s, statements(STATS), s, "end", s.
declaration(decl(IDENT, TYPE)) -->
"var", s, ident(IDENT), s, "as", s, type(TYPE).
declarations([D|Ds]) --> declaration(D), declarations(Ds).
declarations([]) --> [].
type(type(int)) --> "int".
type(type(string)) --> "string".
% skip 1 or more whitespace
s --> (" " ; "\n"), (s ; []).
kiedy zmienić gramatykę z powyższymi zasadami będę używał SICStus przetestować it..I jestem po prostu edytując gramatykę w wordpad z plikiem .sp – user1794576
Przepraszam, tak w prologu – user1794576