<!--
###################################################################################################

	Gomorphv2 DTD version 1.0
	_________________________
	
		CREATED 26-11-2002
		UPDATED 27-11-2002
		UPDATED 11-12-2002: reference to Entities.ent
		UPDATED 31-03-2003: removed reference to Entities.ent

###################################################################################################
-->

<!-- Import definition of element and attribute names: -->
<!ENTITY % XMLNames SYSTEM "XMLNames.ent">
%XMLNames;

<!-- Define attribute options and defaults: -->
<!ENTITY % LanguageTypes "(extinct|living|endangered)">
<!ENTITY % LanguageTypeDefault "'living'">

<!ENTITY % LiteralTypes "(string|expression)">
<!ENTITY % LiteralTypeDefault "'string'">

<!ENTITY % DefaultFormVariable "'Form'">
<!ENTITY % Description "%attDescription; CDATA #IMPLIED">
<!ENTITY % Range "%attRange; CDATA '*'">

<!ENTITY % Boolean "(true | false)">
<!ENTITY % True "'true'">
<!ENTITY % False "'false'">

<!-- ############################################################################################## -->

<!ELEMENT %elemRoot; (%elemDocumentation;, %elemMorphology;)>
<!ATTLIST %elemRoot;
	version CDATA #REQUIRED>

<!-- ### 1. HEADER ################################################################################ -->
<!-- 	Since this part is still under construction and is not directly used by the implementation, 
			we have not defined parameter entities for the element and attribute names. -->
			
<!ELEMENT %elemDocumentation; (language, document, credits)>
<!ATTLIST %elemDocumentation;
	xml:lang NMTOKEN #IMPLIED>

	<!-- 1.1 Language: -->
	<!ELEMENT language (name, alternate-name*, dialect?, region?, classification?, description?)>
	<!ATTLIST language
		ISO639 CDATA #IMPLIED
		SILCode CDATA #IMPLIED
		type %LanguageTypes; #IMPLIED>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT alternate-name (#PCDATA)>
	<!ATTLIST alternate-name xml:lang NMTOKEN #IMPLIED>
	<!ELEMENT dialect (#PCDATA)>
	<!ELEMENT region (#PCDATA)>
	<!ELEMENT classification (#PCDATA)>
	<!ELEMENT description (#PCDATA)>
	
	<!-- 1.2 Document: -->
	<!ELEMENT document (filename, version, status, revision-history)>
	<!ELEMENT filename (#PCDATA)>
	<!ELEMENT version (#PCDATA)>
	<!ELEMENT status (#PCDATA)>
	<!ELEMENT revision-history (revision*)>
	<!ATTLIST revision-history
		first-created CDATA #REQUIRED
		last-modified CDATA #REQUIRED>
	<!ELEMENT revision (#PCDATA)>
	<!ATTLIST revision
		date CDATA #REQUIRED
		version CDATA #IMPLIED>
		
	<!-- 1.3 Credits: -->
	<!ELEMENT credits (author+, link*, copyright?)>
	<!ELEMENT author (#PCDATA)>
	<!ATTLIST author contact CDATA #IMPLIED>
	<!ELEMENT link (#PCDATA)>
	<!ATTLIST link uri CDATA #IMPLIED>
	<!ELEMENT copyright (#PCDATA)>
	

<!-- ### 2. MORPHOLOGY ############################################################################ -->

<!ELEMENT %elemMorphology; (%elemRegularExpressions;, %elemTagsets;, %elemClasses;)>

	<!-- 2.1 Definition of regular expressions: -->
	<!ELEMENT %elemRegularExpressions; (%elemRGXSyntax;, %elemRGXEntities;)>
	<!ELEMENT %elemRGXSyntax; EMPTY>
	<!ATTLIST %elemRGXSyntax;
		%attName; CDATA #REQUIRED
		%attDefinitionURI; CDATA #REQUIRED
		%Description;>
	<!ELEMENT %elemRGXEntities; (%elemRGXEntity;)*>
	<!ELEMENT %elemRGXEntity; EMPTY>
	<!ATTLIST %elemRGXEntity;
		%attName; NMTOKEN #REQUIRED
		%attValue; CDATA #REQUIRED
		%Description;>
	
	<!-- 2.2 Definition of tagsets: -->
	<!ELEMENT %elemTagsets; (%elemTagset;)+>
	<!ELEMENT %elemTagset; (%elemTag;)+>
	<!ATTLIST %elemTagset;
		%attName; NMTOKEN #REQUIRED
		%Description;>
	<!ELEMENT %elemTag; EMPTY>
	<!ATTLIST %elemTag;
		%attName; CDATA #REQUIRED
		%Description;>
	
	<!-- 2.3 Definition of classes: -->
	<!ELEMENT %elemClasses; (%elemClass;)+>
	<!ATTLIST %elemClasses; 
		%attFormVariable; NMTOKEN "Form">
	<!ELEMENT %elemClass; ((%elemParameters;)?, (%elemFunctions;)?, (%elemVariables;)?, (%elemOverrides;)?)>
	<!ATTLIST %elemClass;
		%attName; ID #REQUIRED
		%attInherits; IDREF #IMPLIED
		%attTagset; NMTOKEN #IMPLIED
		%attAbstract; %Boolean; %False;
		%Description;>
	
		<!-- 2.3.1 Parameters: -->
		<!ELEMENT %elemParameters; (%elemParameter;)*>
		<!ELEMENT %elemParameter; EMPTY>
		<!ATTLIST %elemParameter;
			%attName; NMTOKEN #REQUIRED
			%attPattern; CDATA #IMPLIED
			%attDefault; CDATA #IMPLIED
			%attDefaultType; %LiteralTypes; %LiteralTypeDefault;
			%attRGXCaseSensitive; %Boolean; %False;
			%attOptional; %Boolean; %True;
			%Description;>
		
		<!-- 2.3.2 Functions: -->
		<!ELEMENT %elemFunctions; (%elemFunction;)*>
		<!ELEMENT %elemFunction; (%elemSubstitute; | %elemTransduce;)*>
		<!ATTLIST %elemFunction;
			%attName; CDATA #REQUIRED
			%Description;>
				
		<!ELEMENT %elemSubstitute; EMPTY>
		<!ATTLIST %elemSubstitute;
			%attRGXPattern; CDATA #REQUIRED
			%attRGXReplace; CDATA #REQUIRED
			%attRGXGlobal; %Boolean; %True;
			%attRGXCaseSensitive; %Boolean; %False;
			%attRGXMustMatch; %Boolean; %False;
			%Description;>
		<!ELEMENT %elemTransduce; EMPTY><!-- to be implemented in future version -->
		
		
		<!-- 2.3.3 Variables: -->
		<!ELEMENT %elemVariables; (%elemVariable;)*>
		<!ELEMENT %elemVariable; (%Statement;)*>
		<!ATTLIST %elemVariable; 
			%attName; NMTOKEN #REQUIRED>
		
			<!-- Statements: -->
			<!ELEMENT %elemAssign; (%elemList; | (%Expression;))>
			<!ATTLIST %elemAssign; %Range;>
			<!ELEMENT %elemAdd; (%Expression;)>
			<!ATTLIST %elemAdd; %Range;>
			<!ELEMENT %elemRemove; (%Expression;)>
			<!ATTLIST %elemRemove; %Range;>
			
			<!ELEMENT %elemList; (%elemExprLiteral; | %elemExprNull; | %elemExprEmptyString;)+>
		
			<!-- Expressions: -->
			<!-- a. operators and functions: -->
				<!ELEMENT %elemExprUnion; (%Expression;)+>
				<!ELEMENT %elemExprConcatenation; (%Expression;)+>
				<!ELEMENT %elemExprFunction; (%Expression;)>
				<!ATTLIST %elemExprFunction;
					%attName; NMTOKEN #REQUIRED>
			
			<!-- b. literals and identifiers: -->
				<!ELEMENT %elemExprVariable;  EMPTY>
				<!ATTLIST %elemExprVariable;
					%attName; NMTOKEN #REQUIRED>
					
				<!ELEMENT %elemExprParameter; EMPTY>
				<!ATTLIST %elemExprParameter;
					%attName; NMTOKEN #REQUIRED>
				
				<!ELEMENT %elemExprLiteral; EMPTY>
				<!ATTLIST %elemExprLiteral;
					%attValue; CDATA #REQUIRED
					%attType; %LiteralTypes; %LiteralTypeDefault;>
				
				<!ELEMENT %elemExprNull; EMPTY>
				<!ELEMENT %elemExprEmptyString; EMPTY>
		
		<!-- 2.3.4 Conditional override statements: -->
		<!ELEMENT %elemOverrides; (%elemOverrideCondition;)*>
		<!ELEMENT %elemOverrideCondition; (%elemOverride;)+>
		<!ATTLIST %elemOverrideCondition;
			%attParameter; NMTOKEN #REQUIRED
			%attMatches; CDATA #REQUIRED
			%attRGXCaseSensitive; %Boolean; %False;>
			
		<!ELEMENT %elemOverride; (%Statement;)+>
		<!ATTLIST %elemOverride;
			%attName; NMTOKEN #REQUIRED>
		
		
<!-- ############################################################################################## -->



