dation.tck-integrity-tests.1.0.0-M12+01.source-code.basic-grammar.xml Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tck-integrity-tests Show documentation
Show all versions of tck-integrity-tests Show documentation
openCypher Technology Compatibility Kit Integrity Tests
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="<"/> &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=">"/> </seq> <seq> <non-terminal ref="LeftArrowHead" rr:title="<"/> &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=">"/> </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="<>"/> &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq> <seq> <literal value="<"/> &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq> <seq> <literal value=">"/> &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq> <seq> <literal value="<="/> &WS; <non-terminal ref="AddOrSubtractExpression"/> </seq> <seq> <literal value=">="/> &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=" "/> <!-- OGHAM SPACE MARK --> <literal value="᠎"/> <!-- MONGOLIAN VOWEL SEPARATOR --> <literal value=" "/> <!-- EN QUAD --> <literal value=" "/> <!-- EM QUAD --> <literal value=" "/> <!-- EN SPACE --> <literal value=" "/> <!-- EM SPACE --> <literal value=" "/> <!-- THREE-PER-EM SPACE --> <literal value=" "/> <!-- FOUR-PER-EM SPACE --> <literal value=" "/> <!-- SIX-PER-EM SPACE --> <literal value=" "/> <!-- PUNCTUATION SPACE --> <literal value=" "/> <!-- THIN SPACE --> <literal value=" "/> <!-- HAIR SPACE --> <literal value="
"/> <!-- LINE SEPARATOR --> <literal value="
"/> <!-- PARAGRAPH SEPARATOR --> <literal value=" "/> <!-- MEDIUM MATHEMATICAL SPACE --> <literal value=" "/> <!-- IDEOGRAPHIC SPACE --> <!-- Other whitespace characters --> <!-- Non-breaking space characters --> <literal value=" "/> <!-- NO-BREAK SPACE --> <literal value=" "/> <!-- FIGURE SPACE --> <literal value=" "/> <!-- 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=" "/> <!-- Line Feed --> <except literal=" "/> <!-- Carriage Return --> </character> </repeat> <opt><literal value=" "/></opt> <!-- Carriage Return --> <alt> <literal value=" "/> <!-- Line Feed --> <character set="EOI"/> </alt> </seq> </alt> </production> <production name="LeftArrowHead"> <alt> < <!-- '<' less-than sign --> ⟨ <!-- '⟨' mathematical left angle bracket --> 〈 <!-- '〈' left angle bracket --> ﹤ <!-- '﹤' small less-than sign --> < <!-- '<' full-width less-than sign --> </alt> </production> <production name="RightArrowHead"> <alt> > <!-- '>' greater-than sign --> ⟩ <!-- '⟩' mathematical left angle bracket --> 〉 <!-- '〉' right angle bracket --> ﹥ <!-- '﹥' small greater-than sign --> > <!-- '>' full-width greater-than sign --> </alt> </production> <production name="Dash"> <alt> - <!-- '‑' hyphen-minus --> ­ <!-- '-' soft hyphen --> ‐ <!-- '-' hyphen --> ‑ <!-- '‐' non-breaking hyphen --> ‒ <!-- '‒' figure dash --> – <!-- '–' en dash --> — <!-- '—' em dash --> ― <!-- '―' horizontal bar --> − <!-- '−' minus sign --> ﹘ <!-- '﹘' small em dash --> ﹣ <!-- '﹣' small hyphen-minus --> - <!-- '-' full-width hyphen-minus --> </alt> </production> <!-- \ UTILITY DEFINITIONS / --> </grammar>