blob: 00c4245d4d32b3ec8e5b5d2a75dfd0a8a8e372c5 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--=========================================================================-->
<!-- Copyright (C) 2006 Reid Spencer. All Rights Reserved. -->
<!-- -->
<!-- This software is free software; you can redistribute it and/or modify it-->
<!-- under the terms of the GNU Lesser General Public License as published by-->
<!-- the Free Software Foundation; either version 2.1 of the License, or (at -->
<!-- your option) any later version. -->
<!-- -->
<!-- This software 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 Lesser-->
<!-- General Public License for more details. -->
<!-- -->
<!-- You should have received a copy of the GNU Lesser General Public License-->
<!-- along with this library in the file named LICENSE.txt; if not, write to -->
<!-- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -->
<!-- Boston, MA 02110-1301 USA -->
<!-- -->
<!--=========================================================================-->
<!-- @file hlvm/Reader/HLVM.rng -->
<!-- @author Reid Spencer <rspencer@reidspencer.com> (original author) -->
<!-- @date 2006/05/13 -->
<!-- @since 0.1.0 -->
<!-- @brief Defines the core XPL language via Relax/NG Schema -->
<!--=========================================================================-->
<!-- HLVM AST Schema -->
<!-- -->
<!-- This file contains the Relax/NG schema for construction of the HLVM AST -->
<!-- via an XML syntax. The schema aims to be simple and closely match the -->
<!-- construction of an HLVM AST. -->
<!-- -->
<!-- For full commentary on this schema, see http://hlvm.org/docs/XML.html -->
<!-- -->
<!--=========================================================================-->
<grammar
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns ="http://relaxng.org/ns/structure/1.0"
xmlns:a="http://relaxng.org/ns/annotation/1.0"
ns="http://hlvm.org/src/hlvm/Reader/XML/HLVM.rng">
<start>
<ref name="hlvm.elem"/>
</start>
<!-- PATTERN DEFINITIONS FOR DATA TYPES -->
<define name="Identifier.type">
<choice>
<ref name="Unprefixed_Identifier.type"/>
<ref name="Prefixed_Identifier.type"/>
</choice>
</define>
<define name="Unprefixed_Identifier.type">
<data type="string">
<param name="pattern">[^:]+</param>
<param name="maxLength">1024</param>
</data>
</define>
<define name="Prefixed_Identifier.type">
<data type="string">
<param name="pattern">[^:]+:[^:]+</param>
<param name="maxLength">1024</param>
</data>
</define>
<define name="C_Identifier.type">
<data type="string">
<param name="pattern">[A-Za-z_][A-Za-z0-9_]*</param>
<param name="maxLength">256</param>
</data>
</define>
<define name="Boolean.type">
<choice>
<data type="boolean"/>
<value>TRUE</value>
<value>True</value>
<value>true</value>
<value>YES</value>
<value>Yes</value>
<value>yes</value>
<value>1</value>
<value>FALSE</value>
<value>False</value>
<value>false</value>
<value>NO</value>
<value>No</value>
<value>no</value>
<value>0</value>
</choice>
</define>
<define name="Binary.type">
<data type="string">
<param name="minLength">1</param>
<param name="maxLength">1024</param>
<param name="pattern">[01]+</param>
</data>
</define>
<define name="Octal.type" >
<data type="string">
<param name="minLength">1</param>
<param name="maxLength">1024</param>
<param name="pattern">[0-7]+</param>
</data>
</define>
<define name="Decimal.type">
<data type="string">
<param name="minLength">1</param>
<param name="maxLength">1024</param>
<param name="pattern">[+\-]?\d+</param>
</data>
</define>
<define name="Hexadecimal.type">
<data type="string">
<param name="minLength">1</param>
<param name="maxLength">1024</param>
<param name="pattern">([0-9A-Fa-f][0-9A-Fa-f])+</param>
</data>
</define>
<define name="Integer.type">
<choice>
<ref name="Binary.type"/>
<ref name="Octal.type"/>
<ref name="Decimal.type"/>
<ref name="Hexadecimal.type"/>
</choice>
</define>
<define name="Real.type">
<data type="string">
<param name="minLength">1</param>
<param name="maxLength">1024</param>
<param name="pattern">ninf|pinf|nan|signan|zero|nzero|[+\-]?0x[0-9A-Fa-f](\.[0-9A-Fa-f]+)?p[-+][0-9]+|#[0-9A-Fa-f]{16}|#[0-9a-fA-F]{8}|[+\-]?\d+\.\d*([Ee][+\-]?\d+)?</param>
</data>
</define>
<define name="Encoding.type">
<choice>
<value>utf-8</value>
<value>utf-16</value>
<value>ucs</value>
</choice>
</define>
<define name="Character.type">
<choice>
<data type="string">
<param name="length">1</param>
</data>
<data type="string">
<param name="length">5</param>
<param name="pattern">[#][0-9A-Fa-f]{4,4}</param>
</data>
</choice>
</define>
<define name="Octet.type">
<data type="unsignedByte"/>
</define>
<!-- DOCUMENTATION OF HLVM AST PROGRAMS -->
<define name="Documentation.pat">
<optional>
<element name="doc">
<zeroOrMore>
<choice>
<text/>
<ref name="Any.pat"/> <!-- should really be XHTML elements -->
</choice>
</zeroOrMore>
</element>
</optional>
</define>
<define name="Any.pat">
<element>
<anyName/>
<zeroOrMore>
<choice>
<attribute>
<anyName/>
</attribute>
<text/>
<ref name="Any.pat"/>
</choice>
</zeroOrMore>
</element>
</define>
<!-- PATTERNS THAT DEFINE name AND type ATTRIBUTES -->
<define name="Named_Element.pat">
<attribute name="id">
<ref name="Identifier.type"/>
</attribute>
</define>
<define name="Typed_Element.pat">
<attribute name="type">
<ref name="Identifier.type"/>
</attribute>
</define>
<define name="Named_Typed_Element.pat">
<attribute name="id">
<ref name="Identifier.type"/>
</attribute>
<attribute name="type">
<ref name="Identifier.type"/>
</attribute>
</define>
<!-- HLVM PATTERN -->
<define name="hlvm.elem">
<element name="hlvm">
<attribute name="pubid"><data type="anyURI"/></attribute>
<ref name="Documentation.pat"/>
<oneOrMore>
<ref name="bundle.elem"/>
</oneOrMore>
</element>
</define>
<!--BUNDLES PATTERN -->
<define name="bundle.elem">
<element name="bundle">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
<zeroOrMore>
<ref name="import.elem"/>
</zeroOrMore>
<oneOrMore>
<choice>
<ref name="any.elem"/>
<ref name="array.elem"/>
<ref name="boolean.elem"/>
<ref name="buffer.elem"/>
<ref name="character.elem"/>
<ref name="constant.elem"/>
<ref name="enumeration.elem"/>
<ref name="function.elem"/>
<ref name="opaque.elem"/>
<ref name="pointer.elem"/>
<ref name="program.elem"/>
<ref name="range.elem"/>
<ref name="real.elem"/>
<ref name="signature.elem"/>
<ref name="signed.elem"/>
<ref name="stream.elem"/>
<ref name="string.elem"/>
<ref name="structure.elem"/>
<ref name="text.elem"/>
<ref name="unsigned.elem"/>
<ref name="variable.elem"/>
<ref name="vector.elem"/>
</choice>
</oneOrMore>
</element>
</define>
<define name="import.elem">
<element name="import">
<attribute name="prefix">
<ref name="Identifier.type"/>
</attribute>
<attribute name="pubid">
<data type="anyURI"/>
</attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<!--PATTERNS FOR DEFINING TYPES -->
<define name="any.elem">
<element name="any">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="array.elem">
<element name="array">
<ref name="Named_Element.pat"/>
<attribute name="length"><data type="nonNegativeInteger"/></attribute>
<attribute name="of"><ref name="Identifier.type"/></attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="boolean.elem">
<element name="boolean">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="buffer.elem">
<element name="buffer">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="character.elem">
<element name="character">
<ref name="Named_Element.pat"/>
<attribute name="encoding">
<ref name="Encoding.type"/>
</attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="enumeration.elem">
<element name="enumeration">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
<oneOrMore>
<element name="enumerator">
<attribute name="id">
<ref name="Unprefixed_Identifier.type"/>
</attribute>
</element>
</oneOrMore>
</element>
</define>
<define name="opaque.elem">
<element name="opaque">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="pointer.elem">
<element name="pointer">
<ref name="Named_Element.pat"/>
<attribute name="to"><ref name="Identifier.type"/></attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="range.elem">
<element name="range">
<ref name="Named_Element.pat"/>
<attribute name="min">
<ref name="Integer.type"/>
</attribute>
<attribute name="max">
<ref name="Integer.type"/>
</attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="real.elem">
<element name="real">
<ref name="Named_Element.pat"/>
<attribute name="mantissa">
<ref name="Integer.type"/>
</attribute>
<attribute name="exponent">
<ref name="Integer.type"/>
</attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="signed.elem">
<element name="signed">
<ref name="Named_Element.pat"/>
<optional>
<attribute name="bits">
<ref name="Integer.type"/>
</attribute>
</optional>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="stream.elem">
<element name="stream">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="string.elem">
<element name="string">
<ref name="Named_Element.pat"/>
<attribute name="encoding">
<ref name="Encoding.type"/>
</attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="structure.elem">
<element name="structure">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
<zeroOrMore>
<element name="field">
<ref name="Named_Typed_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</zeroOrMore>
</element>
</define>
<define name="signature.elem">
<element name="signature">
<ref name="Named_Element.pat"/>
<attribute name="result"><ref name="Identifier.type"/></attribute>
<optional>
<attribute name="varargs"><ref name="Boolean.type"/></attribute>
</optional>
<ref name="Documentation.pat"/>
<zeroOrMore>
<element name="arg">
<ref name="Named_Typed_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</zeroOrMore>
</element>
</define>
<define name="text.elem">
<element name="text">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="unsigned.elem">
<element name="unsigned">
<ref name="Named_Element.pat"/>
<optional>
<attribute name="bits">
<ref name="Integer.type"/>
</attribute>
</optional>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="vector.elem">
<element name="vector">
<ref name="Named_Element.pat"/>
<attribute name="of"><ref name="Identifier.type"/></attribute>
<attribute name="length"><data type="nonNegativeInteger"/></attribute>
<ref name="Documentation.pat"/>
</element>
</define>
<!-- PATTERNS FOR CONSTANTS -->
<define name="constant.elem">
<element name="constant">
<ref name="Named_Typed_Element.pat"/>
<ref name="Documentation.pat"/>
<ref name="Literal.pat"/>
</element>
</define>
<!-- PATTERNS FOR LITERAL CONSTANTS -->
<define name="Typed_Literal.pat">
<optional>
<attribute name="type">
<ref name="Identifier.type"/>
</attribute>
</optional>
</define>
<define name="Literal.pat">
<choice>
<ref name="Boolean_Literal.pat"/>
<ref name="Integer_Literal.pat"/>
<ref name="Real_Literal.pat"/>
<ref name="char.elem"/>
<ref name="octet.elem"/>
<ref name="enum.elem"/>
<ref name="str.elem"/>
<ref name="null.elem"/>
<ref name="ptr.elem"/>
<ref name="arr.elem"/>
<ref name="vect.elem"/>
<ref name="struct.elem"/>
<ref name="cont.elem"/>
<ref name="get.elem"/>
</choice>
</define>
<define name="Boolean_Literal.pat">
<choice>
<element name="true">
<empty/>
</element>
<element name="false">
<empty/>
</element>
<element name="bool">
<ref name="Typed_Literal.pat"/>
<ref name="Boolean.type"/>
</element>
</choice>
</define>
<define name="Integer_Literal.pat">
<choice>
<element name="bin">
<ref name="Typed_Literal.pat"/>
<ref name="Binary.type"/>
</element>
<element name="oct">
<ref name="Typed_Literal.pat"/>
<ref name="Octal.type"/>
</element>
<element name="dec">
<ref name="Typed_Literal.pat"/>
<ref name="Decimal.type"/>
</element>
<element name="hex">
<ref name="Typed_Literal.pat"/>
<ref name="Hexadecimal.type"/>
</element>
</choice>
</define>
<define name="Real_Literal.pat">
<choice>
<element name="flt">
<ref name="Real.type"/>
</element>
<element name="dbl">
<ref name="Real.type"/>
</element>
<element name="real">
<ref name="Typed_Literal.pat"/>
<ref name="Real.type"/>
</element>
</choice>
</define>
<define name="char.elem">
<element name="char">
<ref name="Typed_Literal.pat"/>
<ref name="Character.type"/>
</element>
</define>
<define name="octet.elem">
<element name="octet">
<ref name="Typed_Literal.pat"/>
<ref name="Octet.type"/>
</element>
</define>
<define name="enum.elem">
<element name="enum">
<ref name="Typed_Literal.pat"/>
<ref name="Identifier.type"/>
</element>
</define>
<define name="str.elem">
<element name="str">
<ref name="Typed_Literal.pat"/>
<text/>
</element>
</define>
<define name="null.elem">
<element name="null">
<ref name="Typed_Literal.pat"/>
<empty/>
</element>
</define>
<define name="ptr.elem">
<element name="ptr">
<ref name="Typed_Literal.pat"/>
<attribute name="to">
<ref name="Identifier.type"/>
</attribute>
</element>
</define>
<define name="arr.elem">
<element name="arr">
<ref name="Typed_Literal.pat"/>
<oneOrMore>
<ref name="Literal.pat"/>
</oneOrMore>
</element>
</define>
<define name="vect.elem">
<element name="vect">
<ref name="Typed_Literal.pat"/>
<oneOrMore>
<ref name="Literal.pat"/>
</oneOrMore>
</element>
</define>
<define name="struct.elem">
<element name="struct">
<ref name="Typed_Literal.pat"/>
<oneOrMore>
<ref name="Literal.pat"/>
</oneOrMore>
</element>
</define>
<define name="cont.elem">
<element name="cont">
<ref name="Typed_Literal.pat"/>
<oneOrMore>
<ref name="Literal.pat"/>
</oneOrMore>
</element>
</define>
<!-- PATTERNS FOR VARIABLES-->
<define name="variable.elem">
<element name="variable">
<ref name="Named_Typed_Element.pat"/>
<optional>
<attribute name="const">
<data type="boolean"/>
</attribute>
</optional>
<optional>
<attribute name="linkage">
<ref name="Linkage.type"/>
</attribute>
</optional>
<optional>
<attribute name="init">
<ref name="Identifier.type"/>
</attribute>
</optional>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="Linkage.type">
<choice>
<value>appending</value>
<value>external</value>
<value>internal</value>
<value>linkonce</value>
<value>weak</value>
</choice>
</define>
<!--PATTERNS FOR FUNCTIONS -->
<define name="function.elem">
<element name="function">
<ref name="Named_Typed_Element.pat"/>
<optional>
<attribute name="linkage"><ref name="Linkage.type"/></attribute>
</optional>
<ref name="Documentation.pat"/>
<optional>
<choice>
<element name="as"><ref name="C_Identifier.type"/></element>
<ref name="block.elem"/>
</choice>
</optional>
</element>
</define>
<define name="program.elem">
<element name="program">
<ref name="Named_Element.pat"/>
<optional>
<attribute name="linkage"><ref name="Linkage.type"/></attribute>
</optional>
<ref name="Documentation.pat"/>
<ref name="block.elem"/>
</element>
</define>
<!-- PATTERNS FOR DEFINING CONSTANTS -->
<define name="ConstantExpression.pat">
<choice>
<ref name="getfld.elem"/>
<ref name="getidx.elem"/>
<ref name="cast.elem"/>
<ref name="select.elem"/>
<ref name="sizeof.elem"/>
<ref name="addrof.elem"/>
<ref name="extract.elem"/>
<ref name="insert.elem"/>
<ref name="shuffle.elem"/>
<ref name="BooleanOperators.pat"/>
<ref name="UnaryArithmeticOperators.pat"/>
<ref name="BinaryArithmeticOperators.pat"/>
<ref name="UnaryRealMathOperators.pat"/>
<ref name="BinaryRealMathOperators.pat"/>
</choice>
</define>
<!-- PATTERNS FOR OPERATORS -->
<define name="Operators.pat">
<choice>
<ref name="block.elem"/>
<ref name="BooleanOperators.pat"/>
<ref name="UnaryArithmeticOperators.pat"/>
<ref name="BinaryArithmeticOperators.pat"/>
<ref name="UnaryRealMathOperators.pat"/>
<ref name="BinaryRealMathOperators.pat"/>
<ref name="MemoryOps.pat"/>
<ref name="InputOutputOps.pat"/>
<ref name="StringOperators.pat"/>
<ref name="ControlFlowOps.pat"/>
</choice>
</define>
<define name="UnaryOperator.pat">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
</define>
<define name="BinaryOperator.pat">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</define>
<define name="TernaryOperator.pat">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</define>
<define name="Location.pat">
<choice>
<ref name="get.elem"/>
<ref name="getfld.elem"/>
<ref name="getidx.elem"/>
</choice>
</define>
<define name="block.elem">
<element name="block">
<optional>
<attribute name="label"><ref name="Identifier.type"/></attribute>
</optional>
<ref name="Documentation.pat"/>
<oneOrMore>
<choice>
<ref name="Operators.pat"/>
<ref name="result.elem"/>
</choice>
</oneOrMore>
</element>
</define>
<define name="result.elem">
<element name="result">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="cast.elem">
<empty/>
</define>
<define name="sizeof.elem">
<empty/>
</define>
<define name="addrof.elem">
<ref name="Operators.pat"/>
</define>
<define name="extract.elem">
<empty/>
</define>
<define name="insert.elem">
<empty/>
</define>
<define name="shuffle.elem">
<empty/>
</define>
<!-- MEMORY OPERATORS -->
<define name="MemoryOps.pat">
<choice>
<ref name="load.elem"/>
<ref name="store.elem"/>
<ref name="getfld.elem"/>
<ref name="getidx.elem"/>
<ref name="length.elem"/>
<ref name="autovar.elem"/>
<ref name="get.elem"/>
</choice>
</define>
<define name="get.elem">
<element name="get">
<ref name="Named_Element.pat"/>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="load.elem">
<element name="load">
<ref name="Documentation.pat"/>
<ref name="Location.pat"/>
</element>
</define>
<define name="store.elem">
<element name="store">
<ref name="Documentation.pat"/>
<ref name="Location.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="getfld.elem">
<element name="getfld">
<attribute name="field">
<ref name="Identifier.type"/>
</attribute>
<ref name="Documentation.pat"/>
<ref name="Location.pat"/>
</element>
</define>
<define name="getidx.elem">
<element name="getidx">
<ref name="Documentation.pat"/>
<ref name="Location.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="length.elem">
<element name="length">
<ref name="Documentation.pat"/>
<ref name="Location.pat"/>
</element>
</define>
<define name="autovar.elem">
<element name="autovar">
<ref name="Named_Typed_Element.pat"/>
<ref name="Documentation.pat"/>
<optional>
<ref name="Operators.pat"/>
</optional>
</element>
</define>
<!-- INPUT/OUTPUT OPERATORS -->
<define name="InputOutputOps.pat">
<choice>
<ref name="open.elem"/>
<ref name="close.elem"/>
<ref name="write.elem"/>
<!-- <ref name="read.elem"/>
<ref name="seek.elem"/>
<ref name="tell.elem"/>
<ref name="info.elem"/> -->
</choice>
</define>
<define name="open.elem">
<element name="open">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="close.elem">
<element name="close">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="write.elem">
<element name="write">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="read.elem">
<element name="read">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<!-- UNARY ARITHMETIC OPERATORS -->
<define name="UnaryArithmeticOperators.pat">
<choice>
<ref name="neg.elem"/>
<ref name="cmpl.elem"/>
<ref name="preinc.elem"/>
<ref name="predec.elem"/>
<ref name="postinc.elem"/>
<ref name="postdec.elem"/>
</choice>
</define>
<define name="neg.elem">
<element name="neg">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="cmpl.elem">
<element name="cmpl">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="preinc.elem">
<element name="preinc">
<ref name="Location.pat"/>
</element>
</define>
<define name="predec.elem">
<element name="predec">
<ref name="Location.pat"/>
</element>
</define>
<define name="postinc.elem">
<element name="postinc">
<ref name="Location.pat"/>
</element>
</define>
<define name="postdec.elem">
<element name="postdec">
<ref name="Location.pat"/>
</element>
</define>
<!-- BINARY ARITHMETIC OPERATORS -->
<define name="BinaryArithmeticOperators.pat">
<choice>
<ref name="add.elem"/>
<ref name="sub.elem"/>
<ref name="mul.elem"/>
<ref name="div.elem"/>
<ref name="mod.elem"/>
<ref name="band.elem"/>
<ref name="bor.elem"/>
<ref name="bxor.elem"/>
<ref name="bnor.elem"/>
<ref name="convert.elem"/>
</choice>
</define>
<define name="add.elem">
<element name="add">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="sub.elem">
<element name="sub">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="mul.elem">
<element name="mul">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="div.elem">
<element name="div">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="mod.elem">
<element name="mod">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="bor.elem">
<element name="bor">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="band.elem">
<element name="band">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="bxor.elem">
<element name="bxor">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="bnor.elem">
<element name="bnor">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="convert.elem">
<element name="convert">
<ref name="Typed_Element.pat"/>
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<!-- Unary Real Math Operators -->
<define name="UnaryRealMathOperators.pat">
<choice>
<ref name="ispinf.elem"/>
<ref name="isninf.elem"/>
<ref name="isnan.elem"/>
<ref name="trunc.elem"/>
<ref name="round.elem"/>
<ref name="floor.elem"/>
<ref name="ceiling.elem"/>
<ref name="loge.elem"/>
<ref name="log2.elem"/>
<ref name="log10.elem"/>
<ref name="squareroot.elem"/>
<ref name="cuberoot.elem"/>
<ref name="factorial.elem"/>
</choice>
</define>
<define name="ispinf.elem">
<element name="ispinf">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="isninf.elem">
<element name="isninf">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="isnan.elem">
<element name="isnan">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="trunc.elem">
<element name="trunc">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="round.elem">
<element name="round">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="floor.elem">
<element name="floor">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="ceiling.elem">
<element name="ceiling">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="loge.elem">
<element name="loge">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="log2.elem">
<element name="log2">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="log10.elem">
<element name="log10">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="squareroot.elem">
<element name="squareroot">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="cuberoot.elem">
<element name="cuberoot">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="factorial.elem">
<element name="factorial">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<!-- Binary Real Math Operators -->
<define name="BinaryRealMathOperators.pat">
<choice>
<ref name="power.elem"/>
<ref name="root.elem"/>
<ref name="GCD.elem"/>
<ref name="LCM.elem"/>
</choice>
</define>
<define name="power.elem">
<element name="power">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="root.elem">
<element name="root">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="GCD.elem">
<element name="GCD">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="LCM.elem">
<element name="LCM">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<!-- Comparison Operators -->
<define name="BooleanOperators.pat">
<choice>
<ref name="not.elem"/>
<ref name="and.elem"/>
<ref name="or.elem"/>
<ref name="xor.elem"/>
<ref name="nor.elem"/>
<ref name="eq.elem"/>
<ref name="ne.elem"/>
<ref name="lt.elem"/>
<ref name="gt.elem"/>
<ref name="le.elem"/>
<ref name="ge.elem"/>
</choice>
</define>
<define name="not.elem">
<element name="not">
<ref name="UnaryOperator.pat"/>
</element>
</define>
<define name="and.elem">
<element name="and">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="or.elem">
<element name="or">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="xor.elem">
<element name="xor">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="nor.elem">
<element name="nor">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="eq.elem">
<element name="eq">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="ne.elem">
<element name="ne">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="lt.elem">
<element name="lt">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="gt.elem">
<element name="gt">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="le.elem">
<element name="le">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<define name="ge.elem">
<element name="ge">
<ref name="BinaryOperator.pat"/>
</element>
</define>
<!-- String Operators -->
<define name="StringOperators.pat">
<choice>
<ref name="sinsert.elem"/>
<ref name="serase.elem"/>
<ref name="sreplace.elem"/>
<ref name="sconcat.elem"/>
</choice>
</define>
<define name="sinsert.elem">
<element name="sinsert">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="serase.elem">
<element name="serase">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="sreplace.elem">
<element name="sreplace">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="sconcat.elem">
<element name="sconcat">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<!-- Control Flow Operators -->
<define name="ControlFlowOps.pat">
<choice>
<ref name="select.elem"/>
<ref name="switch.elem"/>
<ref name="while.elem"/>
<ref name="unless.elem"/>
<ref name="until.elem"/>
<ref name="loop.elem"/>
<ref name="break.elem"/>
<ref name="continue.elem"/>
<ref name="ret.elem"/>
<ref name="call.elem"/>
</choice>
</define>
<define name="select.elem">
<element name="select">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
<ref name="Operators.pat"/>
</element>
</define>
<define name="switch.elem">
<element name="switch">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/> <!-- Control Expression -->
<ref name="Operators.pat"/> <!-- Default Case -->
<zeroOrMore>
<ref name="Operators.pat"/> <!-- Case Expression -->
<ref name="Operators.pat"/> <!-- Case Block -->
</zeroOrMore>
</element>
</define>
<define name="while.elem">
<element name="while">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/> <!-- Pre-Loop Test -->
<ref name="Operators.pat"/> <!-- Loop Body -->
</element>
</define>
<define name="unless.elem">
<element name="unless">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/> <!-- Pre-Loop Test -->
<ref name="Operators.pat"/> <!-- Loop Body -->
</element>
</define>
<define name="until.elem">
<element name="until">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/> <!-- Loop Body -->
<ref name="Operators.pat"/> <!-- Post-Loop Test -->
</element>
</define>
<define name="loop.elem">
<element name="loop">
<ref name="Documentation.pat"/>
<ref name="Operators.pat"/> <!-- Pre-Loop Test -->
<ref name="Operators.pat"/> <!-- Loop Body -->
<ref name="Operators.pat"/> <!-- Post-Loop Test -->
</element>
</define>
<define name="break.elem">
<element name="break">
<optional>
<attribute name="id">
<ref name="Identifier.type"/>
</attribute>
</optional>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="continue.elem">
<element name="continue">
<optional>
<attribute name="id">
<ref name="Identifier.type"/>
</attribute>
</optional>
<ref name="Documentation.pat"/>
</element>
</define>
<define name="ret.elem">
<element name="ret">
<ref name="Documentation.pat"/>
</element>
</define>
<define name="call.elem">
<element name="call">
<oneOrMore>
<ref name="Operators.pat"/>
</oneOrMore>
</element>
</define>
</grammar>