All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dation.tck-integrity-tests.1.0.0-M12+01.source-code.basic-grammar.xml Maven / Gradle / Ivy

The newest version!
<?xml version="1.0" encoding="UTF-8"?>
<!--

    Copyright (c) 2015-2018 "Neo Technology,"
    Network Engine for Objects in Lund AB [http://neotechnology.com]

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

    Attribution Notice under the terms of the Apache License 2.0

    This work was created by the collective efforts of the openCypher community.
    Without limiting the terms of Section 6, any Derivative Work that is not
    approved by the public consensus process of the openCypher Implementers Group
    should not be described as “Cypher” (and Cypher® is a registered trademark of
    Neo4j Inc.) or as "openCypher". Extensions by implementers or prototypes or
    proposals for change that have been documented or implemented should only be
    described as "implementation extensions to Cypher" or as "proposed changes to
    Cypher that are not yet approved by the openCypher community".

-->
<!DOCTYPE grammar [
  <!ENTITY WS "<opt><non-terminal ref='SP'/></opt>">
  <!ENTITY SP "<non-terminal ref='SP'/>">
  <!ENTITY expr "<non-terminal ref='Expression'/>">
  <!ENTITY var "<non-terminal ref='Variable'/>">
]>
<grammar language="Cypher Basic Grammar"
  xmlns="http://opencypher.org/grammar"
  xmlns:rr="http://opencypher.org/railroad"
  xmlns:oc="http://opencypher.org/opencypher">

  <!-- / WHERE \ -->

  <production name="Where" rr:inline="true">
    WHERE &SP; &expr;
  </production>

  <!-- \ WHERE / -->


  <!-- / PATTERNS \ -->

  <production name="Pattern">
    <non-terminal ref="PatternPart"/>
    <repeat> &WS; , &WS; <non-terminal ref="PatternPart"/></repeat>
  </production>

  <production name="PatternPart" rr:inline="true">
    <alt>
      <seq>&var; &WS; = &WS;<non-terminal ref="AnonymousPatternPart"/></seq>
      <non-terminal ref="AnonymousPatternPart"/>
    </alt>
  </production>

  <production name="AnonymousPatternPart" rr:inline="true">
    <alt>
      <non-terminal ref="ShortestPathPattern"/>
      <non-terminal ref="PatternElement"/>
    </alt>
  </production>

  <production name="ShortestPathPattern" rr:inline="true" oc:legacy="true">
    <alt>
      <seq>shortestPath ( <non-terminal ref="PatternElement"/> )</seq>
      <seq>allShortestPaths ( <non-terminal ref="PatternElement"/> )</seq>
    </alt>
  </production>

  <production name="PatternElement">
    <alt>
      <seq>
        <non-terminal ref="NodePattern"/>
        <repeat>&WS; <non-terminal ref="PatternElementChain"/></repeat>
      </seq>
      <seq>( <non-terminal ref="PatternElement"/> )</seq>
    </alt>
  </production>

  <production name="NodePattern">
    ( &WS;
    <opt>&var; &WS;</opt>
    <opt><non-terminal ref="NodeLabels"/> &WS;</opt>
    <opt><non-terminal ref="Properties"/> &WS;</opt>
    )
  </production>

  <production name="PatternElementChain" rr:inline="true">
    <non-terminal ref="RelationshipPattern"/>
    &WS;
    <non-terminal ref="NodePattern"/>
  </production>

  <production name="RelationshipPattern">
    <alt>
      <seq>
        <non-terminal ref="LeftArrowHead" rr:title="&lt;"/>
        &WS; <non-terminal ref="Dash" rr:title="-"/>
        &WS; <opt><non-terminal ref="RelationshipDetail"/></opt>
        &WS; <non-terminal ref="Dash" rr:title="-"/>
        &WS; <non-terminal ref="RightArrowHead" rr:title="&gt;"/>
      </seq>
      <seq>
        <non-terminal ref="LeftArrowHead" rr:title="&lt;"/>
        &WS; <non-terminal ref="Dash" rr:title="-"/>
        &WS; <opt><non-terminal ref="RelationshipDetail"/></opt>
        &WS; <non-terminal ref="Dash" rr:title="-"/>
      </seq>
      <seq>
        <non-terminal ref="Dash" rr:title="-"/>
        &WS; <opt><non-terminal ref="RelationshipDetail"/></opt>
        &WS; <non-terminal ref="Dash" rr:title="-"/>
        &WS; <non-terminal ref="RightArrowHead" rr:title="&gt;"/>
      </seq>
      <seq>
        <non-terminal ref="Dash" rr:title="-"/>
        &WS; <opt><non-terminal ref="RelationshipDetail"/></opt>
        &WS; <non-terminal ref="Dash" rr:title="-"/>
      </seq>
    </alt>
  </production>

  <production name="RelationshipDetail">
    [ &WS;
    <opt>&var; &WS;</opt>
    <opt><non-terminal ref="RelationshipTypes"/> &WS;</opt>
    <opt><non-terminal ref="RangeLiteral"/></opt>
    <opt><non-terminal ref="Properties"/> &WS;</opt>
    ]
  </production>

  <production name="Properties" rr:inline="true">
    <alt>
      <non-terminal ref="MapLiteral"/>
      <non-terminal ref="Parameter"/>
      <non-terminal ref="LegacyParameter"/>
    </alt>
  </production>

  <production name="RelType" rr:inline="true" oc:legacy="true">
    : &WS; <non-terminal ref="RelTypeName"/>
  </production>

  <production name="RelationshipTypes" rr:inline="true">
    : &WS; <non-terminal ref="RelTypeName"/>
    <repeat>
      &WS; | <opt>:</opt> &WS; <non-terminal ref="RelTypeName"/>
    </repeat>
  </production>

  <production name="NodeLabels" rr:inline="true">
    <non-terminal ref="NodeLabel"/>
    <repeat>&WS;<non-terminal ref="NodeLabel"/></repeat>
  </production>

  <production name="NodeLabel" rr:inline="true">
    : &WS; <non-terminal ref="LabelName"/>
  </production>

  <production name="RangeLiteral" rr:inline="true">
    * &WS;
    <opt><non-terminal ref="IntegerLiteral"/> &WS;</opt>
    <opt>.. &WS; <opt><non-terminal ref="IntegerLiteral"/> &WS;</opt></opt>
  </production>

  <production name="LabelName" rr:inline="true">
    <non-terminal ref="SchemaName" rr:title="label"/>
  </production>

  <production name="RelTypeName" rr:inline="true">
    <non-terminal ref="SchemaName" rr:title="relationship type"/>
  </production>

  <!-- \ PATTERNS / -->


  <!-- / EXPRESSIONS \ -->

  <production name="Expression">
    <non-terminal ref="OrExpression"/>
  </production>

  <production name="OrExpression" rr:inline="true">
    <non-terminal ref="XorExpression"/>
    <repeat>&SP; OR &SP;<non-terminal ref="XorExpression"/></repeat>
  </production>

  <production name="XorExpression" rr:inline="true">
    <non-terminal ref="AndExpression"/>
    <repeat>&SP; XOR &SP;<non-terminal ref="AndExpression"/></repeat>
  </production>

  <production name="AndExpression" rr:inline="true">
    <non-terminal ref="NotExpression"/>
    <repeat>&SP; AND &SP;<non-terminal ref="NotExpression"/></repeat>
  </production>

  <production name="NotExpression" rr:inline="true">
    <repeat>NOT &WS;</repeat>
    <non-terminal ref="ComparisonExpression"/>
  </production>

  <production name="ComparisonExpression" rr:inline="true">
    <non-terminal ref="AddOrSubtractExpression"/>
    <repeat>&WS;<non-terminal ref="PartialComparisonExpression"/></repeat>
  </production>

  <production name="AddOrSubtractExpression" rr:inline="true">
    <non-terminal ref="MultiplyDivideModuloExpression"/>
    <repeat><alt>
      <seq> &WS; + &WS; <non-terminal ref="MultiplyDivideModuloExpression"/></seq>
      <seq> &WS; - &WS; <non-terminal ref="MultiplyDivideModuloExpression"/></seq>
    </alt></repeat>
  </production>

  <production name="MultiplyDivideModuloExpression" rr:inline="true">
    <non-terminal ref="PowerOfExpression"/>
    <repeat><alt>
      <seq> &WS; * &WS; <non-terminal ref="PowerOfExpression"/></seq>
      <seq> &WS; / &WS; <non-terminal ref="PowerOfExpression"/></seq>
      <seq> &WS; % &WS; <non-terminal ref="PowerOfExpression"/></seq>
    </alt></repeat>
  </production>

  <production name="PowerOfExpression" rr:inline="true">
    <non-terminal ref="UnaryAddOrSubtractExpression"/>
    <repeat> &WS; ^ &WS; <non-terminal ref="UnaryAddOrSubtractExpression"/></repeat>
  </production>

  <production name="UnaryAddOrSubtractExpression" rr:inline="true">
    <repeat><alt>+ -</alt> &WS; </repeat>
    <non-terminal ref="StringListNullOperatorExpression"/>
  </production>

  <production name="StringListNullOperatorExpression" rr:inline="true">
    <non-terminal ref="PropertyOrLabelsExpression"/>
    <repeat><alt>
      <non-terminal ref="StringOperatorExpression"/>
      <non-terminal ref="ListOperatorExpression"/>
      <non-terminal ref="NullOperatorExpression"/>
    </alt></repeat>
  </production>

  <production name="ListOperatorExpression" rr:inline="true">
    <alt>
      <seq> &WS; [ &expr; ] </seq>
      <seq> &WS; [ <opt>&expr;</opt> .. <opt>&expr;</opt> ] </seq>
    </alt>
  </production>

  <production name="StringOperatorExpression" rr:inline="true">
    <seq>
      <alt>
        <non-terminal ref="RegularExpression"/>
        <seq>&SP; IN</seq>
        <seq>&SP; STARTS &SP; WITH</seq>
        <seq>&SP; ENDS &SP; WITH</seq>
        <seq>&SP; CONTAINS</seq>
      </alt>
      &WS;
      <non-terminal ref="PropertyOrLabelsExpression"/>
    </seq>
  </production>

  <production name="NullOperatorExpression" rr:inline="true">
    <alt>
      <seq> &SP; IS &SP; NULL </seq>
      <seq> &SP; IS &SP; NOT &SP; NULL </seq>
    </alt>
  </production>

  <production name="RegularExpression" oc:legacy="true">
    <seq>&WS; =~</seq>
  </production>

  <production name="PropertyOrLabelsExpression" rr:inline="true">
    <non-terminal ref="Atom"/>
    <repeat>
      &WS; <non-terminal ref="PropertyLookup"/>
    </repeat>
    <opt>&WS; <non-terminal ref="NodeLabels"/></opt>
  </production>

  <production name="Atom">
    <alt>
      <non-terminal ref="Literal"/>
      <non-terminal ref="Parameter"/>
      <non-terminal ref="LegacyParameter"/>
      <non-terminal ref="CaseExpression"/>
      <seq>COUNT &WS; ( &WS; * &WS; )</seq>
      <non-terminal ref="ListComprehension"/>
      <non-terminal ref="PatternComprehension"/>
      <seq>FILTER  &WS; ( &WS; <non-terminal ref="FilterExpression"/> &WS; ) </seq>
      <seq>EXTRACT &WS; ( &WS; <non-terminal ref="FilterExpression"/> &WS; <opt>&WS; | &expr;</opt> ) </seq>
      <non-terminal ref="Reduce"/>
      <seq>ALL     &WS; ( &WS; <non-terminal ref="FilterExpression"/> &WS; ) </seq>
      <seq>ANY     &WS; ( &WS; <non-terminal ref="FilterExpression"/> &WS; ) </seq>
      <seq>NONE    &WS; ( &WS; <non-terminal ref="FilterExpression"/> &WS; ) </seq>
      <seq>SINGLE  &WS; ( &WS; <non-terminal ref="FilterExpression"/> &WS; ) </seq>
      <non-terminal ref="ShortestPathPattern"/>
      <non-terminal ref="RelationshipsPattern"/>
      <non-terminal ref="ParenthesizedExpression"/>
      <non-terminal ref="FunctionInvocation"/>
      &var;
    </alt>
  </production>

  <production name="Literal">
    <alt>
      <non-terminal ref="NumberLiteral"/>
      <non-terminal ref="StringLiteral"/>
      <non-terminal ref="BooleanLiteral"/>
      NULL
      <non-terminal ref="MapLiteral"/>
      <non-terminal ref="ListLiteral"/>
    </alt>
  </production>

  <production name="BooleanLiteral">
    <alt>
      TRUE
      FALSE
    </alt>
  </production>

  <production name="ListLiteral">
    <seq> [ &WS; <opt> &expr; &WS; <repeat> , &WS; &expr; &WS; </repeat> </opt> ] </seq>
  </production>

  <production name="Reduce" rr:inline="true" oc:legacy="true">
    REDUCE &WS; ( &var; = &expr; , <non-terminal ref="IdInColl"/> | &expr; )
  </production>

  <production name="PartialComparisonExpression" rr:inline="true">
    <alt>
      <seq> <literal value="="/>        &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq>
      <seq> <literal value="&lt;&gt;"/> &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq>
      <seq> <literal value="&lt;"/>     &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq>
      <seq> <literal value="&gt;"/>     &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq>
      <seq> <literal value="&lt;="/>    &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq>
      <seq> <literal value="&gt;="/>    &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq>
    </alt>
  </production>

  <production name="ParenthesizedExpression" rr:inline="true">
    ( &WS; &expr; &WS; )
  </production>

  <production name="RelationshipsPattern" rr:inline="true">
    <non-terminal ref="NodePattern"/>
    <repeat min="1">&WS;<non-terminal ref="PatternElementChain"/></repeat>
  </production>

  <production name="FilterExpression">
    <non-terminal ref="IdInColl"/>
    <opt>&WS;<non-terminal ref="Where"/></opt>
  </production>

  <production name="IdInColl" rr:inline="true">
    &var; &SP; IN &SP; &expr;
  </production>

  <production name="FunctionInvocation">
    <non-terminal ref="FunctionName"/>
    &WS; ( &WS;
      <opt>DISTINCT &WS;</opt>
    <opt>&expr; &WS; <repeat>, &WS; &expr; &WS;</repeat></opt>
    )
  </production>

  <production name="FunctionName" rr:inline="true">
    <alt>
      <non-terminal ref="SymbolicName" rr:title="function name"/>
      EXISTS
    </alt>
  </production>

  <production name="ExplicitProcedureInvocation">
    <non-terminal ref="ProcedureName"/>
    &WS; ( &WS;
    <opt>&expr; &WS;<repeat>, &WS; &expr; &WS;</repeat></opt>
    )
  </production>

  <production name="ImplicitProcedureInvocation">
    <non-terminal ref="ProcedureName"/>
  </production>

  <production name="ProcedureResultField" rr:inline="true">
    <non-terminal ref="SymbolicName" rr:title="procedure result field"/>
  </production>

  <production name="ProcedureName" rr:inline="true">
    <non-terminal ref="Namespace" rr:title="procedure namespace"/>
    <non-terminal ref="SymbolicName" rr:title="procedure name"/>
  </production>

  <production name="Namespace" rr:inline="true">
    <repeat>
      <non-terminal ref="SymbolicName"/> .
    </repeat>
  </production>

  <production name="ListComprehension" rr:inline="true">
    [ &WS;
      <non-terminal ref="FilterExpression"/>
      <opt>&WS; | &WS; &expr;</opt>
    &WS; ]
  </production>

  <production name="PatternComprehension">
    [ &WS;
      <opt><non-terminal ref="Variable"/> &WS; = &WS;</opt>
      <non-terminal ref="RelationshipsPattern"/> &WS;
      <opt>WHERE &WS; <non-terminal ref="Expression"/> &WS;</opt>
      | &WS; <non-terminal ref="Expression"/> &WS;
    ]
  </production>

  <production name="PropertyLookup">
    . &WS;
    <alt>
      <non-terminal ref="PropertyKeyName"/>
    </alt>
  </production>

  <production name="CaseExpression">
    <alt>
      <seq>CASE <repeat min="1">&WS; <non-terminal ref="CaseAlternatives"/></repeat></seq>
      <seq>CASE &WS; &expr; <repeat min="1">&WS; <non-terminal ref="CaseAlternatives"/></repeat></seq>
    </alt>
    <opt>&WS; ELSE &WS; &expr;</opt>
    &WS; END
  </production>

  <production name="CaseAlternatives" rr:inline="true">
    WHEN &WS; &expr; &WS; THEN &WS; &expr;
  </production>

  <production name="Variable" rr:inline="true">
    <non-terminal ref="SymbolicName" rr:title="variable"/>
  </production>

  <production name="StringLiteral" oc:lexer="true">
    <alt>
      <seq>" <repeat><alt>
        <character><except literal="\"/><except literal='"'/></character>
        <non-terminal ref="EscapedChar"/>
      </alt></repeat> "</seq>

      <seq>' <repeat><alt>
        <character><except literal="\"/><except literal="'"/></character>
        <non-terminal ref="EscapedChar"/>
      </alt></repeat> '</seq>
    </alt>
  </production>

  <production name="EscapedChar" oc:lexer="true">
    \
    <alt>
      \  <!-- Encodes a backslash -->
      '  <!-- Encodes a single quote -->
      "  <!-- Encodes a double quote -->
      b  <!-- Encodes backspace -->
      f  <!-- Encodes page break of "form feed" -->
      n  <!-- Encodes newline -->
      r  <!-- Encodes Carriage return -->
      t  <!-- Encodes a Tab character -->
      <seq>  <!-- UTF16 -->
        u <repeat min="4" max="4"><non-terminal ref="HexDigit"/></repeat>
      </seq>
      <seq>  <!-- UTF32 -->
        U <repeat min="8" max="8"><non-terminal ref="HexDigit"/></repeat>
      </seq>
    </alt>
  </production>

  <production name="NumberLiteral">
    <alt>
      <non-terminal ref="DoubleLiteral"/>
      <non-terminal ref="IntegerLiteral"/>
    </alt>
  </production>

  <production name="MapLiteral">
    { &WS;
    <opt>
      <non-terminal ref="PropertyKeyName"/> &WS; : &WS; &expr; &WS;
      <repeat>, &WS;<non-terminal ref="PropertyKeyName"/> &WS; : &WS; &expr; &WS;</repeat>
    </opt>
    }
  </production>

  <production name="LegacyParameter" oc:legacy="true">
    { &WS;
    <alt>
      <non-terminal ref="SymbolicName"/>
      <non-terminal ref="DecimalInteger"/>
    </alt>
    &WS; }
  </production>

  <production name="Parameter">
    $
    <alt>
      <non-terminal ref="SymbolicName"/>
      <non-terminal ref="DecimalInteger"/>
    </alt>
  </production>

  <production name="PropertyExpression">
    <non-terminal ref="Atom"/>
    <repeat min="1">&WS;<non-terminal ref="PropertyLookup"/></repeat>
  </production>

  <production name="PropertyKeyName" rr:inline="true">
    <non-terminal ref="SchemaName" rr:title="property key"/>
  </production>

  <production name="IntegerLiteral">
    <alt>
      <non-terminal ref="HexInteger"/>
      <non-terminal ref="OctalInteger"/>
      <non-terminal ref="DecimalInteger"/>
    </alt>
  </production>

  <production name="HexInteger" oc:lexer="true">
    <literal value="0x"/>
    <repeat min="1"><non-terminal ref="HexDigit"/></repeat>
  </production>

  <production name="DecimalInteger" oc:lexer="true">
    <alt>
      <non-terminal ref="ZeroDigit"/>
      <seq>
        <non-terminal ref="NonZeroDigit"/>
        <repeat><non-terminal ref="Digit"/></repeat>
      </seq>
    </alt>
  </production>

  <production name="OctalInteger" oc:lexer="true">
    <seq>
      <non-terminal ref="ZeroDigit"/>
      <repeat min="1"><non-terminal ref="OctDigit"/></repeat>
    </seq>
  </production>

  <production name="HexLetter" oc:lexer="true">
    <alt>
      a b c d e f
    </alt>
  </production>

  <production name="HexDigit" oc:lexer="true">
    <alt>
      <non-terminal ref="Digit"/>
      <non-terminal ref="HexLetter"/>
    </alt>
  </production>

  <production name="Digit" rr:inline="true" oc:lexer="true">
    <alt>
      <non-terminal ref="ZeroDigit"/>
      <non-terminal ref="NonZeroDigit"/>
    </alt>
  </production>

  <production name="NonZeroDigit" oc:lexer="true">
    <alt>
      <non-terminal ref="NonZeroOctDigit"/>
      8 9
    </alt>
  </production>

  <production name="NonZeroOctDigit" oc:lexer="true">
    <alt>1 2 3 4 5 6 7</alt>
  </production>

  <production name="OctDigit" oc:lexer="true">
    <alt>
      <non-terminal ref="ZeroDigit"/>
      <non-terminal ref="NonZeroOctDigit"/>
    </alt>
  </production>

  <production name="ZeroDigit" oc:lexer="true">
    0
  </production>

  <production name="DoubleLiteral">
    <alt>
      <non-terminal ref="ExponentDecimalReal"/>
      <non-terminal ref="RegularDecimalReal"/>
    </alt>
  </production>

  <production name="ExponentDecimalReal" oc:lexer="true">
    <alt>
      <repeat min="1"><non-terminal ref="Digit"/></repeat>
      <seq>
        <repeat min="1"><non-terminal ref="Digit"/></repeat> . <repeat min="1"><non-terminal ref="Digit"/></repeat>
      </seq>
      <seq>. <repeat min="1"><non-terminal ref="Digit"/></repeat></seq>
    </alt>
    <alt>e E</alt>
    <opt>-</opt>
    <repeat min="1"><non-terminal ref="Digit"/></repeat>
  </production>

  <production name="RegularDecimalReal" oc:lexer="true">
    <seq>
      <repeat><non-terminal ref="Digit"/></repeat>
      .
      <repeat min="1"><non-terminal ref="Digit"/></repeat>
    </seq>
  </production>

  <!-- \ EXPRESSIONS / -->


  <!-- / UTILITY DEFINITIONS \ -->

  <production name="SchemaName">
    <alt>
      <non-terminal ref="SymbolicName"/>
      <non-terminal ref="ReservedWord"/>
    </alt>
  </production>

  <production name="ReservedWord">
    <alt>
      ALL
      ASC
      ASCENDING
      BY
      CREATE
      DELETE
      DESC
      DESCENDING
      DETACH
      EXISTS
      LIMIT
      MATCH
      MERGE
      ON
      OPTIONAL
      ORDER
      REMOVE
      RETURN
      SET
      SKIP
      WHERE
      WITH
      UNION
      UNWIND
      AND
      AS
      CONTAINS
      DISTINCT
      ENDS
      IN
      IS
      NOT
      OR
      STARTS
      XOR
      FALSE
      TRUE
      NULL
      CONSTRAINT
      DO
      FOR
      REQUIRE
      UNIQUE
      CASE
      WHEN
      THEN
      ELSE
      END
      MANDATORY
      SCALAR
      OF
      ADD
      DROP
    </alt>
  </production>

  <production name="SymbolicName">
    <alt>
      <non-terminal ref="UnescapedSymbolicName"/>
      <non-terminal ref="EscapedSymbolicName"/>
      <non-terminal ref="HexLetter"/>
      COUNT
      FILTER
      EXTRACT
      ANY
      NONE
      SINGLE
    </alt>
  </production>

  <production name="UnescapedSymbolicName" rr:inline="true" oc:lexer="true">
    <non-terminal ref="IdentifierStart"/>
    <repeat><non-terminal ref="IdentifierPart"/></repeat>
  </production>

  <production name="IdentifierStart" rr:inline="true" oc:lexer="true">
    <description>
      Based on the unicode identifier and pattern syntax
        (http://www.unicode.org/reports/tr31/)
      And extended with a few characters.
    </description>
    <alt>
      <character set="ID_Start"/>
      <character set="Pc"/> <!-- Punctuation connectors (underscores) -->
    </alt>
  </production>

  <production name="IdentifierPart" rr:inline="true" oc:lexer="true">
    <description>
      Based on the unicode identifier and pattern syntax
        (http://www.unicode.org/reports/tr31/)
      And extended with a few characters.
    </description>
    <alt>
      <character set="ID_Continue"/>
      <character set="Sc"/> <!-- Currency symbols -->
    </alt>
  </production>

  <production name="EscapedSymbolicName" rr:inline="true" oc:lexer="true">
    <description>
      Any character except "`", enclosed within `backticks`. Backticks are escaped with double backticks.
    </description>
    <repeat min="1">
      ` <repeat><character><except literal="`"/></character></repeat> `
    </repeat>
  </production>

  <production name="SP" rr:skip="true" oc:lexer="true">
    <repeat min="1"><non-terminal ref='whitespace'/></repeat>
  </production>

  <production name="whitespace" oc:lexer="true">
    <alt>
      <!-- The code points accepted by Character.isWhitespace(int) in Java -->

      <!-- ASCII whitespace characters -->
      <character set="SPACE"/> <!-- SPACE -->
      <character set="TAB"/> <!-- (Horisontal) Tab -->
      <character set="LF"/> <!-- Line Feed -->
      <character set="VT"/> <!-- Vertical Tab -->
      <character set="FF"/> <!-- Form Feed -->
      <character set="CR"/> <!-- Carriage Return -->
      <character set="FS"/> <!-- File Separator -->
      <character set="GS"/> <!-- Group Separator -->
      <character set="RS"/> <!-- Record Separator -->
      <character set="US"/> <!-- Unit Separator -->
      <!-- Unicode whitespace characters -->
      <literal value="&#x1680;"/> <!-- OGHAM SPACE MARK -->
      <literal value="&#x180e;"/> <!-- MONGOLIAN VOWEL SEPARATOR -->
      <literal value="&#x2000;"/> <!-- EN QUAD -->
      <literal value="&#x2001;"/> <!-- EM QUAD -->
      <literal value="&#x2002;"/> <!-- EN SPACE -->
      <literal value="&#x2003;"/> <!-- EM SPACE -->
      <literal value="&#x2004;"/> <!-- THREE-PER-EM SPACE -->
      <literal value="&#x2005;"/> <!-- FOUR-PER-EM SPACE -->
      <literal value="&#x2006;"/> <!-- SIX-PER-EM SPACE -->
      <literal value="&#x2008;"/> <!-- PUNCTUATION SPACE -->
      <literal value="&#x2009;"/> <!-- THIN SPACE -->
      <literal value="&#x200a;"/> <!-- HAIR SPACE -->
      <literal value="&#x2028;"/> <!-- LINE SEPARATOR -->
      <literal value="&#x2029;"/> <!-- PARAGRAPH SEPARATOR -->
      <literal value="&#x205f;"/> <!-- MEDIUM MATHEMATICAL SPACE -->
      <literal value="&#x3000;"/> <!-- IDEOGRAPHIC SPACE -->

      <!-- Other whitespace characters -->

      <!-- Non-breaking space characters -->
      <literal value="&#x00a0;"/> <!-- NO-BREAK SPACE -->
      <literal value="&#x2007;"/> <!-- FIGURE SPACE -->
      <literal value="&#x202f;"/> <!-- NARROW NO-BREAK SPACE -->

      <!-- Comments are parsed as whitespace -->
      <non-terminal ref="Comment"/>
    </alt>
  </production>

  <production name="Comment" oc:lexer="true">
    <alt>
      <seq>/* <repeat><alt>
        <character><except literal="*"/></character>
        <seq>* <character><except literal="/"/></character></seq>
      </alt></repeat> */</seq>
      <seq>//
        <repeat>
          <character>
            <except literal="&#10;"/> <!-- Line Feed -->
            <except literal="&#13;"/> <!-- Carriage Return -->
          </character>
        </repeat>
        <opt><literal value="&#13;"/></opt> <!-- Carriage Return -->
        <alt>
          <literal value="&#10;"/> <!-- Line Feed -->
          <character set="EOI"/>
        </alt>
      </seq>
    </alt>
  </production>

  <production name="LeftArrowHead">
    <alt>
      &#x003c; <!-- '<' less-than sign -->
      &#x27e8; <!-- '⟨' mathematical left angle bracket -->
      &#x3008; <!-- '〈' left angle bracket -->
      &#xfe64; <!-- '﹤' small less-than sign -->
      &#xff1c; <!-- '<' full-width less-than sign -->
    </alt>
  </production>
  <production name="RightArrowHead">
    <alt>
      &#x003e; <!-- '>' greater-than sign -->
      &#x27e9; <!-- '⟩' mathematical left angle bracket -->
      &#x3009; <!-- '〉' right angle bracket -->
      &#xfe65; <!-- '﹥' small greater-than sign -->
      &#xff1e; <!-- '>' full-width greater-than sign -->
    </alt>
  </production>
  <production name="Dash">
    <alt>
      &#x002D; <!-- '‑' hyphen-minus -->
      &#x00AD; <!-- '-' soft hyphen -->
      &#x2010; <!-- '-' hyphen -->
      &#x2011; <!-- '‐' non-breaking hyphen -->
      &#x2012; <!-- '‒' figure dash -->
      &#x2013; <!-- '–' en dash -->
      &#x2014; <!-- '—' em dash -->
      &#x2015; <!-- '―' horizontal bar -->
      &#x2212; <!-- '−' minus sign -->
      &#xFE58; <!-- '﹘' small em dash -->
      &#xFE63; <!-- '﹣' small hyphen-minus -->
      &#xFF0D; <!-- '-' full-width hyphen-minus -->
    </alt>
  </production>

  <!-- \ UTILITY DEFINITIONS / -->

</grammar>




© 2015 - 2024 Weber Informatics LLC | Privacy Policy