blob: 61df47dcda231bf0f04b51e81fa8475317596858 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
This program and the accompanying materials are made available under the
terms of the Eclipse Distribution License v. 1.0, which is available at
http://www.eclipse.org/org/documents/edl-v10.php.
SPDX-License-Identifier: BSD-3-Clause
-->
<grammar
ns="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://www.xml.gr.jp/xmlns/relaxngcc"
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
>
<!-- ################################################################## -->
<!-- -->
<!-- particles and model groups -->
<!-- -->
<!-- ################################################################## -->
<!--define name="modelGroup"
cc:return-type="XSModelGroup" cc:return-value="modelGroup">
<cc:java-body>
String name;
</cc:java-body>
<cc:java>name=$localName;</cc:java> <!- compositor name ->
<element>
<choice>
<name>all</name>
<name>choice</name>
<name>sequence</name>
</choice>
<ref name="modelGroupBody" cc:alias="modelGroup" />
</element>
</define-->
<define name="modelGroupBody"
cc:params="Locator locator, String compositorName"
cc:return-type="ModelGroupImpl" cc:return-value="result">
<cc:java-import>
import java.util.Vector;
</cc:java-import>
<cc:java-body>
private ModelGroupImpl result;
private final List particles = new ArrayList();
</cc:java-body>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
fa = <ref name="foreignAttributes"/>(null);
<optional>
<ref name="annotation" cc:alias="annotation"/>(null,AnnotationContext.MODELGROUP);
</optional>
<!-- children of the particle -->
<zeroOrMore>
<ref name="particle" cc:alias="childParticle"/>
<cc:java>
particles.add(childParticle);
</cc:java>
</zeroOrMore>
<!-- TODO: make sure the position of this code -->
<cc:java>
XSModelGroup.Compositor compositor = null;
if(compositorName.equals("all")) compositor = XSModelGroup.ALL;
if(compositorName.equals("sequence")) compositor = XSModelGroup.SEQUENCE;
if(compositorName.equals("choice")) compositor = XSModelGroup.CHOICE;
if(compositor==null)
throw new InternalError("unable to process "+compositorName);
result = new ModelGroupImpl( $runtime.document, annotation, locator, fa, compositor,
(ParticleImpl[])particles.toArray(new ParticleImpl[0]));
</cc:java>
</define>
<define name="particle"
cc:return-type="ParticleImpl" cc:return-value="result">
<cc:java-body>
private Locator wloc;
private Locator loc;
private ParticleImpl result;
private String compositorName;
</cc:java-body>
<choice>
<group>
<cc:java>
compositorName = $localName;
loc = $runtime.copyLocator();
</cc:java>
<element>
<choice>
<name>all</name>
<name>choice</name>
<name>sequence</name>
</choice>
<ref name="occurs" cc:alias="occurs" />
<ref name="modelGroupBody" cc:alias="term"
cc:with-params="loc,compositorName"/>
<cc:java>
result = new ParticleImpl( $runtime.document, null, term, loc, occurs.max, occurs.min );
</cc:java>
</element>
</group>
<element name="group">
<cc:java>loc = $runtime.copyLocator();</cc:java>
<ref name="occurs" cc:alias="occurs"/>
<attribute name="ref">
<ref name="qname" cc:alias="groupName" />
</attribute>
<optional>
<ref name="annotation" cc:alias="annotation" />(null,AnnotationContext.PARTICLE);
</optional>
<cc:java>
result = new ParticleImpl( $runtime.document, annotation, new DelayedRef.ModelGroup(
$runtime, loc, $runtime.currentSchema, groupName ),
loc, occurs.max, occurs.min );
</cc:java>
</element>
<element name="element">
<cc:java>loc = $runtime.copyLocator();</cc:java>
<ref name="occurs" cc:alias="occurs"/>
<choice>
<group>
<attribute name="ref" cc:workaround-significant="true">
<ref name="qname" cc:alias="elementTypeName"/>
</attribute>
<optional>
<ref name="annotation" cc:alias="annotation" />(null,AnnotationContext.PARTICLE);
</optional>
<cc:java>
result = new ParticleImpl( $runtime.document, annotation, new DelayedRef.Element(
$runtime, loc, $runtime.currentSchema, elementTypeName ),
loc, occurs.max, occurs.min );
</cc:java>
</group>
<group>
<ref name="elementDeclBody"
cc:alias="anonymousElementDecl" cc:with-params="loc,false" />
<cc:java>
result = new ParticleImpl( $runtime.document, null,
anonymousElementDecl,
loc, occurs.max, occurs.min );
</cc:java>
</group>
</choice>
</element>
<element name="any">
<cc:java>wloc = $runtime.copyLocator();</cc:java>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
<ref name="occurs" cc:alias="occurs"/>
<ref name="wildcardBody" cc:with-params="wloc" cc:alias="wcBody"/>
<cc:java>
result = new ParticleImpl( $runtime.document, null, wcBody, wloc, occurs.max, occurs.min );
</cc:java>
</element>
</choice>
</define>
<define name="group"
cc:return-type="ModelGroupDeclImpl" cc:return-value="result">
<cc:java-body>
private ModelGroupDeclImpl result;
private Locator loc,mloc;
private String compositorName;
</cc:java-body>
<element name="group">
<cc:java>loc = $runtime.copyLocator();</cc:java>
<optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional>
<attribute name="name">
<data type="NCName" cc:alias="name"/>
</attribute>
<optional>
<ref name="annotation" cc:alias="annotation" />(null,AnnotationContext.MODELGROUP_DECL);
</optional>
fa = <ref name="foreignAttributes"/>(null);
<cc:java>
mloc = $runtime.copyLocator();
compositorName = $localName;
</cc:java>
<element>
<choice>
<name>all</name>
<name>choice</name>
<name>sequence</name>
</choice>
<ref name="modelGroupBody" cc:alias="term"
cc:with-params="mloc,compositorName" />
</element>
</element>
<cc:java>
result = new ModelGroupDeclImpl( $runtime.document,
annotation, loc, fa,
$runtime.currentSchema.getTargetNamespace(),
name,
term
);
</cc:java>
</define>
</grammar>