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

<!--
  Copyright (c) 1997-2018
  Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
  http://www.polymake.org

  This program is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2, or (at your option) any
  later version: http://www.gnu.org/licenses/gpl.txt.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
===============================================================================

  Relax-NG Schema for polymake v3 data file
-->

<grammar xmlns="http://relaxng.org/ns/structure/1.0"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
         xmlns:note="http://www.math.tu-berlin.de/polymake/note"
         ns="http://www.math.tu-berlin.de/polymake/#3">

  <include href="common_grammar.rng" />

  <start>
    <choice>
      <ref name="TopObject" />
      <ref name="LooseData" />
    </choice>
  </start>

  <define name="TopObject">
    <element name="object">
      <ref name="TopAttribs" />
      <ref name="ObjectContent" />
    </element>
  </define>

  <define name="TopAttribs">
    <note:a> type prefixed by an application name </note:a>
    <attribute name="type">
      <data type="string">
        <param name="pattern">[a-zA-Z][a-zA-Z_0-9]*::.*</param>
      </data>
    </attribute>

    <note:a>
      version refers to the polymake implementation which has
      created this data instance.
    </note:a>
    <optional>
      <attribute name="version">
        <data type="string">
          <param name="pattern">\d+(\.\d+)*</param>
        </data>
      </attribute>
    </optional>
  </define>

  <define name="LooseData">
    <element name="data">
      <ref name="TopAttribs" />
      <ref name="Extensions" />
      <optional>
        <element name="description">
          <text/>
        </element>
      </optional>
      <ref name="PropertyData" />
    </element>
  </define>

</grammar>
