The
defgrammar
macro can be used to define a definite clause grammar (DCG), which is a relation that determines whether the start of a list of tokens (a
sentence
) matches a particular grammar. The remaining tokens in the list become the
sentence tail
.
(<grammar name> <sentence> <sentence tail> <extra argument>*)
where the
<extra argument>
items are terms defined below.
The syntax of the defgrammar macro is
(defgrammar <grammar name>
<rule>*)
<rule> ::= (<lhs> <rhs>*)
<lhs> ::= <grammar name>
| (<grammar name> <term>*)
<rhs> ::= <atom>
| <var>
| (<other grammar name> <term>*)
| <lisp clause>
| (call <term>)
| (cut)
<lisp clause> ::= (<non-atomic lisp form> <term>*)
<non-atomic lisp form> ::= (<lisp function name> <lisp arg>*)
<grammar name>
is the same symbol as the one naming the defgrammar
<other grammar name>
is a symbol naming another defgrammar
<atom>
is an atom, which forms the words of the sentence to be matched
<term>
is any Common Prolog logic expression, including a variable
<lisp function name>
is a symbol naming a Lisp function
<lisp arg>
is any Lisp form, which is evaluated and passed to the function
Within the
<lhs>
, extra arguments can be added by specifying
<term>
s. Every
<rule>
must specify the same
<grammar name>
as the
defgrammar
form and have the same number of extra arguments.
The meaning of the various
<rhs
> items is as follows:
<atom>
matches that atom in the sentence
<var>
is unified with the next item in the sentence
(<other grammar name> <term>*)
calls the grammar relation
<other grammar name>
on the rest of the sentence. The optional
<term>
arguments are passed to the relation as its extra arguments.
<lisp clause>
evaluates the
<non-atomic lisp form>
as a Lisp form and unifies the values that it returns with the
<term>
s that follow it.
(call <term>)
calls
<term>
as a normal Prolog relation.
(cut)
calls the normal Prolog cut relation.