Zoeken…


Helemaal niets: `... // 0`

Een van de meest elementaire DCG nonterminals is ... //0 , wat kan worden gelezen als "alles":

... --> [] | [_], ... .

Het kan worden gebruikt om een lijst Ls te beschrijven die het element E bevat via:

phrase(( ..., [E], ... ), Ls)

Parsen met DCG's

DCG's kunnen worden gebruikt voor parseren. Het beste van alles is dat dezelfde DCG vaak kan worden gebruikt om lijsten te analyseren en te genereren die worden beschreven. Bijvoorbeeld:

sentence --> article, subject, verb, object.

article --> [the].

subject --> [woman] | [man].

verb --> [likes] | [enjoys].

object --> [apples] | [oranges].

Voorbeeldvragen:

?- phrase(sentence, Ls).
Ls = [the, woman, likes, apples] ;
Ls = [the, woman, likes, oranges] ;
Ls = [the, woman, enjoys, apples] .

?- phrase(sentence, [the,man,likes,apples]).
true .

Extra doelen

Extra doelen maken het mogelijk om verwerking toe te voegen aan DCG-clausules, bijvoorbeeld voorwaarden waaraan de elementen van de lijst moeten voldoen.

De extra doelen worden waargenomen tussen accolades aan het einde van een DCG-clausule.

% DCG clause requiring an integer
int --> [X], {integer(X)}.

Gebruik:

?- phrase(int, [3]).
true.

?- phrase(int, [a]).
false.

Extra argumenten

De extra argumenten voegen resultaten toe aan predikaten van een DCG-clausule, door de afleidingsboom te versieren. Het is bijvoorbeeld mogelijk om een algebraïsche grammatica te maken die de waarde aan het einde berekent.

Gegeven een grammatica die de toevoeging van bewerkingen ondersteunt:

% Extra arguments are passed between parenthesis after the name of the DCG clauses.
exp(C) --> int(A), [+], exp(B), {plus(A, B, C)}.
exp(X) --> int(X).
int(X) --> [X], {integer(X)}.

Het resultaat van deze grammatica kan worden gevalideerd en opgevraagd:

?- phrase(exp(X), [1,+,2,+,3]).
X = 6 ;


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow