# Yacker grammer for (Sh)ape (Ex)pressions language # by Eric Prud'hommeaux # todo: # (a:b ) in predicate # renumber # beautify [1] ShExDoc ::= directive* ((shape | start | CODE+) statement*)? # leading CODE [2] statement ::= directive | start | shape [3] directive ::= sparqlPrefix | sparqlBase [4] start ::= 'start' '=' ( label | typeSpec CODE* ) [4b] sparqlPrefix ::= SPARQL_PREFIX PNAME_NS IRIREF [5b] sparqlBase ::= SPARQL_BASE IRIREF [0] shape ::= 'VIRTUAL'? label typeSpec CODE* [0] typeSpec ::= include* '{' OrExpression? '}' [0] include ::= '&' label [111] OrExpression ::= AndExpression ( '|' AndExpression )* [112] AndExpression ::= UnaryExpression ( ',' UnaryExpression )* [118] UnaryExpression ::= id? ( arc | include | '(' OrExpression ')' CODE* ) [0] id ::= '$' label [0] label ::= iri | BlankNode # The arc, nameClassAndValue and fixedValues productions re-code this for LALR(1)/LL(1) # arc ::= nameClass valueSpec # nameClass ::= '^'? (iri | '*' | iri '*') # valueSpec ::= ('@' label | typeSpec | valueSet | object | '*') repeatCount? CODE* [0] arc ::= '!'? '^'? nameClassAndValue repeatCount? CODE* [0] nameClassAndValue ::= '*' exclusions ('*' | fixedValues) | 'a' ('*' | fixedValues) | iri ('*' ('*' | fixedValues) | fixedValues) [0] fixedValues ::= '@' label | typeSpec | valueSet | object [0] exclusions ::= ('-' iri)* [0] repeatCount ::= '*' | '+' | '?' | '{' INTEGER (',' INTEGER?)? '}' [0] valueSet ::= '(' object+ ')' [12] object ::= iri | BlankNode | literal [13] literal ::= RDFLiteral | NumericLiteral | BooleanLiteral [16] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE [128s] RDFLiteral ::= String (LANGTAG | '^^' iri)? [133s] BooleanLiteral ::= 'true' | 'false' [134s] String ::= STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2 [135s] iri ::= IRIREF | PrefixedName [136s] PrefixedName ::= PNAME_LN | PNAME_NS [137s] BlankNode ::= BLANK_NODE_LABEL | ANON @terminals [0] CODE ::= '%' ([a-zA-Z+#_][a-zA-Z0-9+#_]*)? '{' ([^%\\] | '\\' '%')* '%' '}' [4bb] SPARQL_PREFIX ::= [Pp][Rr][Ee][Ff][Ii][Xx] [5bb] SPARQL_BASE ::= [Bb][Aa][Ss][Ee] [3y] RDF_TYPE ::= 'a' [18] IRIREF ::= '<' ([^#x00-#x20<>\"{}|^`\\] | UCHAR)* '>' [139s] PNAME_NS ::= PN_PREFIX? ':' [140s] PNAME_LN ::= PNAME_NS PN_LOCAL [141s] BLANK_NODE_LABEL ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)? [144s] LANGTAG ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* [19] INTEGER ::= [+-]? [0-9]+ [20] DECIMAL ::= [+-]? [0-9]* '.' [0-9]+ [21] DOUBLE ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.'? [0-9]+ EXPONENT) [154s] EXPONENT ::= [eE] [+-]? [0-9]+ [156s] STRING_LITERAL1 ::= "'" ([^#x27#x5C#xA#xD] | ECHAR | UCHAR)* "'" [157s] STRING_LITERAL2 ::= '"' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR)* '"' [158s] STRING_LITERAL_LONG1 ::= "'''" (("'" | "''")? ([^'\\] | ECHAR | UCHAR))* "'''" [159s] STRING_LITERAL_LONG2 ::= '"""' (('"' | '""')? ([^\"\\] | ECHAR | UCHAR))* '"""' [22] UCHAR ::= '\\u' HEX HEX HEX HEX | '\\U' HEX HEX HEX HEX HEX HEX HEX HEX [159s] ECHAR ::= '\\' [tbnrf\\\"'] [161s] WS ::= #x20 | #x9 | #xD | #xA [162s] ANON ::= '[' WS* ']' [163s] PN_CHARS_BASE ::= [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] [164s] PN_CHARS_U ::= PN_CHARS_BASE | '_' [166s] PN_CHARS ::= PN_CHARS_U | '-' | [0-9] | [#x00B7] | [#x0300-#x036F] | [#x203F-#x2040] [167s] PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)? [168s] PN_LOCAL ::= ( PN_CHARS_U | ':' | [0-9] | PLX ) (( PN_CHARS | '.' | ':' | PLX )* (PN_CHARS | ':' | PLX))? [169s] PLX ::= PERCENT | PN_LOCAL_ESC [170s] PERCENT ::= '%' HEX HEX [171s] HEX ::= [0-9] | [A-F] | [a-f] [172s] PN_LOCAL_ESC ::= '\\' ('_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%') @pass ::= [ \t\r\n]+ | "#" [^\r\n]*