<?xml version="1.0" encoding="UTF-8"?>

<!--
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	Logtalk - Open source object-oriented logic programming language
%	Release 2.30.7
%
%	Copyright (c) 1998-2007 Paulo Moura.	All Rights Reserved.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-->

<grammar xmlns="http://relaxng.org/ns/structure/1.0">

	<define name="logtalk">
		<element name="logtalk">
			<ref name="entity"/>
			<ref name="relations"/>
			<ref name="predicates"/>
			<ref name="remarks"/>
		</element>
	</define>

	<define name="entity">
		<element name="entity">
			<ref name="name"/>
			<ref name="type"/>
			<ref name="compilation"/>
			<optional>
				<ref name="comment"/>
			</optional>
			<optional>
				<choice>
					<ref name="parnames"/>
					<ref name="parameters"/>
				</choice>
			</optional>
			<optional>
				<ref name="author"/>
			</optional>
			<optional>
				<ref name="version"/>
			</optional>
			<optional>
				<ref name="date"/>
			</optional>
			<optional>
				<ref name="copyright"/>
			</optional>
			<optional>
				<ref name="license"/>
			</optional>
			<zeroOrMore>
				<ref name="info"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="name">
		<element name="name">
			<text/>
		</element>
	</define>

	<define name="type">
		<element name="type">
			<choice>
				<value>category</value>
				<value>object</value>
				<value>protocol</value>
			</choice>
		</element>
	</define>

	<define name="compilation">
		<element name="compilation">
			<choice>
				<value>static</value>
				<value>dynamic</value>
			</choice>
		</element>
	</define>

	<define name="comment">
		<element name="comment">
			<text/>
		</element>
	</define>

	<define name="parnames">
		<element name="parnames">
			<text/>
		</element>
	</define>

	<define name="parameters">
		<element name="parameters">
			<zeroOrMore>
				<ref name="parameter"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="parameter">
		<element name="parameter">
			<ref name="name"/>
			<ref name="description"/>
		</element>
	</define>

	<define name="description">
		<element name="description">
			<text/>
		</element>
	</define>

	<define name="author">
		<element name="author">
			<text/>
		</element>
	</define>

	<define name="version">
		<element name="version">
			<text/>
		</element>
	</define>

	<define name="date">
		<element name="date">
			<text/>
		</element>
	</define>

	<define name="copyright">
		<element name="copyright">
			<text/>
		</element>
	</define>

	<define name="license">
		<element name="license">
			<text/>
		</element>
	</define>

	<define name="info">
		<element name="info">
			<ref name="key"/>
			<ref name="value"/>
		</element>
	</define>

	<define name="key">
		<element name="key">
			<text/>
		</element>
	</define>

	<define name="value">
		<element name="value">
			<text/>
		</element>
	</define>

	<define name="relations">
		<element name="relations">
			<zeroOrMore>
				<ref name="implements"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="imports"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="extends"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="instantiates"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="specializes"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="uses"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="calls"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="implements">
		<element name="implements">
			<ref name="name"/>
			<ref name="scope"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="imports">
		<element name="imports">
			<ref name="name"/>
			<ref name="scope"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="extends">
		<element name="extends">
			<ref name="name"/>
			<ref name="scope"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="instantiates">
		<element name="instantiates">
			<ref name="name"/>
			<ref name="scope"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="specializes">
		<element name="specializes">
			<ref name="name"/>
			<ref name="scope"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="uses">
		<element name="uses">
			<ref name="name"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="calls">
		<element name="calls">
			<ref name="name"/>
			<ref name="file"/>
		</element>
	</define>

	<define name="scope">
		<element name="scope">
			<choice>
				<value>public</value>
				<value>protected</value>
				<value>private</value>
			</choice>
		</element>
	</define>

	<define name="file">
		<element name="file">
			<text/>
		</element>
	</define>

	<define name="predicates">
		<element name="predicates">
			<ref name="public"/>
			<ref name="protected"/>
			<ref name="private"/>
		</element>
	</define>

	<define name="public">
		<element name="public">
			<zeroOrMore>
				<ref name="predicate"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="protected">
		<element name="protected">
			<zeroOrMore>
				<ref name="predicate"/>
			</zeroOrMore>
		</element>
	</define>


	<define name="private">
		<element name="private">
			<zeroOrMore>
				<ref name="predicate"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="predicate">
		<element name="predicate">
			<ref name="name"/>
			<ref name="scope"/>
			<ref name="compilation"/>
			<optional>
				<ref name="meta"/>
			</optional>
			<zeroOrMore>
				<ref name="mode"/>
			</zeroOrMore>
			<optional>
				<ref name="comment"/>
			</optional>
			<optional>
				<ref name="template"/>
			</optional>
			<optional>
				<choice>
					<ref name="argnames"/>
					<ref name="arguments"/>
				</choice>
			</optional>
			<optional>
				<ref name="exceptions"/>
			</optional>
			<zeroOrMore>
				<ref name="info"/>
			</zeroOrMore>
			<optional>
				<ref name="examples"/>
			</optional>
		</element>
	</define>

	<define name="meta">
		<element name="meta">
			<text/>
		</element>
	</define>

	<define name="mode">
		<element name="mode">
			<ref name="template"/>
			<ref name="solutions"/>
		</element>
	</define>

	<define name="template">
		<element name="template">
			<text/>
		</element>
	</define>

	<define name="solutions">
		<element name="solutions">
			<choice>
				<value>zero</value>
				<value>zero_or_one</value>
				<value>zero_or_more</value>
				<value>one</value>
				<value>one_or_more</value>
				<value>error</value>
			</choice>
		</element>
	</define>

	<define name="argnames">
		<element name="argnames">
			<text/>
		</element>
	</define>

	<define name="arguments">
		<element name="arguments">
			<zeroOrMore>
				<ref name="argument"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="argument">
		<element name="argument">
			<ref name="name"/>
			<ref name="description"/>
		</element>
	</define>

	<define name="exceptions">
		<element name="exceptions">
			<zeroOrMore>
				<ref name="exception"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="exception">
		<element name="exception">
			<ref name="condition"/>
			<ref name="term"/>
		</element>
	</define>

	<define name="condition">
		<element name="condition">
			<text/>
		</element>
	</define>

	<define name="term">
		<element name="term">
			<text/>
		</element>
	</define>

	<define name="examples">
		<element name="examples">
			<zeroOrMore>
				<ref name="example"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="example">
		<element name="example">
			<ref name="description"/>
			<ref name="call"/>
			<ref name="bindings"/>
		</element>
	</define>

	<define name="call">
		<element name="call">
			<text/>
		</element>
	</define>

	<define name="bindings">
		<element name="bindings">
			<text/>
		</element>
	</define>

	<define name="remarks">
		<element name="remarks">
			<zeroOrMore>
				<ref name="remark"/>
			</zeroOrMore>
		</element>
	</define>

	<define name="remark">
		<element name="remark">
			<ref name="topic"/>
			<ref name="text"/>
		</element>
	</define>

	<define name="topic">
		<element name="topic">
			<text/>
		</element>
	</define>

	<define name="text">
		<element name="text">
			<text/>
		</element>
	</define>

	<start>
		<choice>
			<ref name="logtalk"/>
		</choice>
	</start>

</grammar>