<?xml version="1.0" encoding="UTF-8"?>
<!--
###############################################################################################

Gomorphv2 DTD version 1.0
_________________________

CREATED 2002-11-26
UPDATED 2002-11-27
UPDATED 2002-12-11: reference to Entities.ent
UPDATED 2003-03-31: removed reference to Entities.ent
UPDATED 2026-01-28: inlined external entity definitions to avoid browser security errors

###############################################################################################
-->

<!-- ### XML NAMES ############################################################################ -->

<!ENTITY % elemRoot "gomorph">

<!-- 1. HEADER -->
<!ENTITY % elemDocumentation "documentation">

<!-- 2. MORPHOLOGY -->
<!ENTITY % elemMorphology "morphology">

<!-- 2.1 Definition of regular expressions: -->
<!ENTITY % elemRegularExpressions "rgx-definition">
<!ENTITY % elemRGXSyntax "syntax">
<!ENTITY % elemRGXEntities "entities">
<!ENTITY % elemRGXEntity "symbol">

<!-- 2.2 Definition of tagsets: -->
<!ENTITY % elemTagsets "tagsets">
<!ENTITY % elemTagset "tagset">
<!ENTITY % elemTag "tag">

<!-- 2.3 Definition of classes: -->
<!ENTITY % elemClasses "classes">
<!ENTITY % attFormVariable "form-variable">
<!ENTITY % elemClass "class">
<!ENTITY % attInherits "inherits">
<!ENTITY % attAbstract "abstract">
	
	<!-- 2.3.1 Parameters: -->
	<!ENTITY % elemParameters "parameters">
	<!ENTITY % elemParameter "parameter">
			<!ENTITY % attType "type">
			<!ENTITY % attPattern "pattern">
			<!ENTITY % attDefault "default">
			<!ENTITY % attDefaultType "default-type">
			<!ENTITY % attOptional "optional">
	
	<!-- 2.3.2 Functions: -->
	<!ENTITY % elemFunctions "functions">
	<!ENTITY % elemFunction "function">
	<!ENTITY % elemSubstitute "rgx">
			<!ENTITY % attRGXPattern "pattern">
			<!ENTITY % attRGXReplace "replace">
			<!ENTITY % attRGXGlobal "global">
			<!ENTITY % attRGXCaseSensitive "case-sensitive">
			<!ENTITY % attRGXMustMatch "must-match">
	<!ENTITY % elemTransduce "transduce">

	<!-- 2.3.3 Variables: -->
	<!ENTITY % elemVariables "paradigm">
	<!ENTITY % attTagset "tagset">
	<!ENTITY % elemVariable "variable">
	
		<!-- Statements: -->
		<!ENTITY % elemAssign "assign">
		<!ENTITY % elemAdd "add">
		<!ENTITY % elemRemove "remove">
		<!ENTITY % Statement "(%elemAssign; | %elemAdd; | %elemRemove;)">
		
		<!ENTITY % elemList "list">
			
		<!-- Expressions: -->
		<!ENTITY % elemExprVariable "var">
		<!ENTITY % elemExprParameter "param">
		<!ENTITY % elemExprLiteral "literal">
		<!ENTITY % elemExprNull "null">
		<!ENTITY % elemExprEmptyString "emptystring">
		<!ENTITY % elemExprFunction "apply-function">
		<!ENTITY % elemExprConcatenation "concatenation">
		<!ENTITY % elemExprUnion "union">
		<!ENTITY % Expression "
			%elemExprLiteral; | 
			%elemExprVariable; | 
			%elemExprParameter; | 
			%elemExprEmptyString; |
			%elemExprNull; | 
			%elemExprUnion; | 
			%elemExprConcatenation; | 
			%elemExprFunction;">
	
	<!-- 2.3.4 Conditional override statements: -->
	<!ENTITY % elemOverrides "conditions">
	<!ENTITY % elemOverrideCondition "when">
			<!ENTITY % attParameter "parameter">
			<!ENTITY % attMatches "matches">
	<!ENTITY % elemOverride "override">


<!-- ### COMMON ATTRIBUTES #################################################################### -->

<!-- Common attributes used by different elements: -->
<!ENTITY % attName "name">
<!ENTITY % attDescription "description">
<!ENTITY % attValue "value">
<!ENTITY % attRange "range">
<!ENTITY % attDefinitionURI "definitionURI">

<!-- 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'">


<!-- ### GRAMMAR ############################################################################## -->

<!ELEMENT %elemRoot; (%elemDocumentation;, %elemMorphology;)>
<!ATTLIST %elemRoot;
	version CDATA #REQUIRED>

<!-- ### 1. HEADER ############################################################################ -->
<!-- 	This part is still under construction and not directly used by the implementation,
	so 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>
		
<!-- ########################################################################################## -->