
r.tck.1.0.0-M06.source-code.basic-grammar.xml Maven / Gradle / Ivy
<?xml version="1.0" encoding="UTF-8"?> <!-- Copyright (c) 2015-2017 "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. --> <!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> <seq> &WS; [ &expr; ] </seq> <seq> &WS; [ <opt>&expr;</opt> .. <opt>&expr;</opt> ] </seq> <seq> <alt> <seq>&WS; =~</seq> <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> <seq> &SP; IS &SP; NULL </seq> <seq> &SP; IS &SP; NOT &SP; NULL </seq> </alt></repeat> </production> <production name="PropertyOrLabelsExpression" rr:inline="true"> <non-terminal ref="Atom"/> <repeat> &WS; <alt> <non-terminal ref="PropertyLookup"/> <non-terminal ref="NodeLabels"/> </alt> </repeat> </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 ALL 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>
© 2015 - 2025 Weber Informatics LLC | Privacy Policy