Этот ответ: Очень простой синтаксис пролога dcg немного помог мне, но [X] получает только следующий персонаж, я хочу всю энчиладу, читайте дальше!
Я использую GNU Prolog для написания синтаксического анализатора параметров команды, и я застрял в точке DCG. У меня есть это грамматическое правило, которое ищет, например, "foo --as=json", и я просто не могу понять, как получить в свои руки результат "чего угодно", код:
as_opt --> "--as=", anything, { c( as_opt )}, !.
anything --> [], {c(anything_match)}.
И расширение gprolog этого:
as_opt([45, 45, 97, 115, 61|A], B) :-
anything(A, C),
c(as_opt), !,
C = B.
anything(A, B) :-
c(anything_match), !,
A = B.
Предикат "c()" прост и просто используется для отслеживания того, что правило выполняется с помощью format() в stdout, чтобы я мог видеть, что происходит во время его выполнения. Если бы я написал код вручную, я бы сделал:
%% for completeness here!
c(Msg) :- format("Processed ~w~n", [Msg]).
as_opt([45, 45, 97, 115, 61|A], B) :-
anything(A, C),
c(as_opt), !,
C = B,
{ g_assign( gvValue, B )}. %% just for example
Возвращаясь к исходному DCG:
as_opt --> "--as=", anything, { c( as_opt ), gassign( gvValue, ??? )}, !.
Так что же там, где "???" является. Возможно ли... так должно быть. Я собираюсь еще раз перечитать правила gprolog о том, как он расширяет правила DCG, на случай, если я собираюсь (facepalm) сам, но тем временем любая помощь будет очень кстати.
Спасибо, Шон.