Re: term_expansion/2 with DCG clauses
Jan Wielemaker <[email protected]>
| Newsgroups | gmane.comp.ai.prolog.swi |
|---|---|
| Message-ID | <[email protected]> |
It is still not very clear what you want. If you want to
produce DCG's from term-expansion, this is just fine. DCG
expansion is done automatically if term-expansion produces
(Head --> Body) terms.
Maybe your use of =.. explains some of the misconceptions.
Just write
user:term_expansion((abnf(Atom) :- _), DCGS) :-
...
And you create your DCG simply using (Head --> Body). Note
the additional (), wich you need to put these beasts in a
normal Prolog argument.
Of course, this is really ugly. Since we have quasy quotations,
you can make your source
{|abnf||
repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)
|}.
See http://www.swi-prolog.org/pldoc/man?section=quasiquotations
This would be cool to have. Be aware it is not always simple.
Some DCGs are left-recursive and will loop. Others are for various
reasons very poorly structured for naive translation info DCGs. There
are ways to fix this automatically ...
Cheers --- Jan
On 08/13/2013 03:49 PM, Wouter Beek wrote:
> Hi Feliks,
>
> My specific use case is that I want to generate DCGs based on ABNF (a
> variant of BNF). Most RFC standards define their syntax in ABNF and
> having them converted into DCGs seems convenient.
>
> Here is my use of term_expansion/2. The conversion from ABNF to DCGs
> is done in rule//1.
> ~~~{.pl}
> system:term_expansion(ABNF, DCGs):-
> ABNF =.. [:-,abnf(Atom),_],
> atom_codes(Atom, Codes),
> once(phrase(rule(DCGs), Codes)),
> abnf('repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)'):- true.
> ~~~
>
> ---
> Cheers!,
> Wouter.
>
> E-mail: [email protected]
> WWW: www.wouterbeek.com
> Tel.: 0647674624
>
>
> On Tue, Aug 13, 2013 at 3:15 PM, Feliks Kluzniak
> <[email protected]> wrote:
>> Hi,
>>
>> I find your question hard to understand. Could you please give an example of what it is that you are after?
>>
>> Thanks,
>> -- Feliks
>>
>> On Aug 13, 2013, at 14:02, Wouter Beek <[email protected]> wrote:
>>
>>> Hi all,
>>>
>>> What would be the recommended way for replacing regular Prolog
>>> predicates with DCG rules? I would be nice if I could use the
>>> syntactic sugar / `-->`-notation in formulating the replacing rules.
>>>
>>> I was thinking of using term_expansion/2, but `ResultTerm =..
>>> [-->,Head,Body]` would not be correct since `-->` is not the name of
>>> the predicate.
>>>
>>> ---
>>> Cheers!,
>>> Wouter.
>>>
>>> E-mail: [email protected]
>>> WWW: www.wouterbeek.com
>>> Tel.: 0647674624
>>> _______________________________________________
>>> SWI-Prolog mailing list
>>> [email protected]
>>> https://lists.iai.uni-bonn.de/mailman/listinfo.cgi/swi-prolog
>>
>>
> _______________________________________________
> SWI-Prolog mailing list
> [email protected]
> https://lists.iai.uni-bonn.de/mailman/listinfo.cgi/swi-prolog
>