hydra-0.1.0: src/main/haskell/Hydra/Impl/Haskell/Sources/Ext/Shex/Syntax.hs
{-# LANGUAGE OverloadedStrings #-}
module Hydra.Impl.Haskell.Sources.Ext.Shex.Syntax where
import Hydra.Core
import Hydra.Compute
import Hydra.Module
import Hydra.Grammar
import Hydra.Impl.Haskell.Dsl.Grammars
import Hydra.Util.GrammarToModule
import qualified Hydra.Impl.Haskell.Dsl.Standard as Standard
base_ = terminal "BASE"
prefix_ = terminal "PREFIX"
start_ = terminal "start"
equal_ = terminal "="
or_ = terminal "OR"
and_ = terminal "AND"
not_ = terminal "NOT"
true_ = terminal "true"
false_ = terminal "false"
iri_ = terminal "IRI"
bnode_ = terminal "BNODE"
literal_ = terminal "LITERAL"
nonLiteral_ = terminal "NONLITERAL"
length_ = terminal "LENGTH"
minLength_ = terminal "MINLENGTH"
maxLength_ = terminal "MAXLENGTH"
external_ = terminal "EXTERNAL"
percent_ = terminal "%"
at_ = terminal "@"
dollar_ = terminal "$"
ampersand_ = terminal "&"
colon_ = terminal ":"
period_ = terminal "."
coma_ = terminal ","
semicolon_ = terminal ";"
underscore_ = terminal "_"
dash_ = terminal "-"
parenOpen_ = terminal "("
parenClose_ = terminal ")"
braceOpen_ = terminal "{"
braceClose_ = terminal "}"
pipe_ = terminal "|"
star_ = terminal "*"
plus_ = terminal "+"
question_ = terminal "?"
tilde_ = terminal "~"
doubleFrwSlash_ = terminal "\\"
singleQuote_ = terminal "'"
doubleQuote_ = terminal "\""
minInclusive_ = terminal "MININCLUSIVE"
minExclusive_ = terminal "MINEXCLUSIVE"
maxInclusive_ = terminal "MAXINCLUSIVE"
maxExclusive_ = terminal "MAXEXCLUSIVE"
totalDigits_ = terminal "TOTALDIGITS"
fractionDigits_ = terminal "FRACTIONDIGITS"
extra_ = terminal "EXTRA"
closed_ = terminal "CLOSED"
shexSyntaxModule :: Module Meta
shexSyntaxModule = grammarToModule ns shexGrammar $
Just ("A Shex model. Based on the BNF at:\n" ++
" https://github.com/shexSpec/grammar/blob/master/bnf")
where
ns = Namespace "hydra/ext/shex/syntax"
shexGrammar :: Grammar
shexGrammar = Grammar [
-- [1] ShexDoc ::= Directive* ((NotStartAction | StartActions) Statement*)?
define "ShexDoc" [
list[star"Directive", opt(list[ alts["NotStartAction", "StartActions"], star "Statement" ]), "PrefixDecl"]],
-- [2] Directive ::= BaseDecl | PrefixDecl
define "Directive" [
"BaseDecl", "PrefixDecl"],
-- [3] BaseDecl ::= "BASE" IriRef
define "BaseDecl" [
list[base_, "IriRef"]],
-- [4] PrefixDecl ::= "PREFIX" PnameNs IriRef
define "PrefixDecl" [
list[prefix_, "PnameNs", "IriRef"]],
-- [5] NotStartAction ::= start | shapeExprDecl
-- [6] start ::= "start" '=' ShapeExpression
-- [9] shapeExprDecl ::= ShapeExprLabel (ShapeExpression|"EXTERNAL")
define "NotStartAction" [
"start">: list[start_, equal_, "ShapeExpression"],
"shapeExprDecl">: list["ShapeExprLabel", alts["ShapeExpression", external_]]],
-- [7] StartActions ::= CodeDecl+
define "StartActions" [
plus("CodeDecl")],
-- [8] Statement ::= Directive | NotStartAction
define "Statement" [
alts[ "Directive", "NotStartAction"]],
-- [10] ShapeExpression ::= ShapeOr
define "ShapeExpression" [
"ShapeOr"],
-- [11] InlineShapeExpression ::= InlineShapeOr
define "InlineShapeExpression" [
"InlineShapeOr"],
-- [12] ShapeOr ::= ShapeAnd ("OR" ShapeAnd)*
define "ShapeOr" [
list["ShapeAnd", star(list[or_, "ShapeAnd"])]],
-- [13] InlineShapeOr ::= InlineShapeAnd ("OR" InlineShapeAnd)*
define "InlineShapeOr" [
list["ShapeAnd", star(list[or_, "InlineShapeAnd"])]],
-- [14] ShapeAnd ::= ShapeNot ("AND" ShapeNot)*
define "ShapeAnd" [
list["ShapeNot", star(list[and_, "ShapeNot"])]],
-- [15] InlineShapeAnd ::= InlineShapeNot ("AND" InlineShapeNot)*
define "InlineShapeAnd" [
list["InlineShapeNot", star(list[and_, "InlineShapeNot"])]],
-- [16] ShapeNot ::= "NOT"? ShapeAtom
define "ShapeNot" [
list[opt (not_), "ShapeAtom"]],
-- [17] InlineShapeNot ::= "NOT"? InlineShapeAtom
define "InlineShapeNot" [
list[opt(not_), "InlineShapeAtom"]],
-- [18] ShapeAtom ::= NodeConstraint ShapeOrRef?
-- | ShapeOrRef
-- | "(" ShapeExpression ")"
-- | '.' # no constraint
define "ShapeAtom" [
list["NodeConstraint", opt("ShapeOrRef")],
"ShapeOrRef",
list[parenOpen_, "ShapeExpression", parenClose_],
period_],
-- [19] InlineShapeAtom ::= NodeConstraint InlineShapeOrRef?
-- | InlineShapeOrRef NodeConstraint?
-- | "(" ShapeExpression ")"
-- | '.' # no constraint
define "InlineShapeAtom" [
list["NodeConstraint", opt("InlineShapeOrRef")],
list["InlineShapeOrRef", opt("NodeConstraint")],
list[parenOpen_, "ShapeExpression", parenClose_],
period_],
-- [20] ShapeOrRef ::= ShapeDefinition
-- | AtpNameLn | AtpNameNs | '@' ShapeExprLabel
define "ShapeOrRef" [
"ShapeDefinition",
"AtpNameLn",
"AtpNameNs",
list[at_,"ShapeExprLabel"]],
-- [21] InlineShapeOrRef ::= InlineShapeDefinition
-- | AtpNameLn | AtpNameNs | '@' ShapeExprLabel
define "InlineShapeOrRef" [
"InlineShapeDefinition",
"AtpNameLn",
"AtpNameNs",
list[at_,"ShapeExprLabel"]],
-- [22] NodeConstraint ::= "LITERAL" XsFacet*
-- | NonLiteralKind StringFacet*
-- | Datatype XsFacet*
-- | ValueSet XsFacet*
-- | XsFacet+
define "NodeConstraint" [
list[literal_, star("XsFacet")],
list["NonLiteralKind", star("StringFacet")],
list["Datatype", star("XsFacet")],
list["ValueSet", star("XsFacet")],
list["ValueSet", star("XsFacet")],
plus("XsFacet")],
-- [23] NonLiteralKind ::= "IRI" | "BNODE" | "NONLITERAL"
define "NonLiteralKind" [iri_, bnode_, nonLiteral_],
-- [24] XsFacet ::= StringFacet | NumericFacet
define "XsFacet" ["StringFacet", "NumericFacet"],
-- [25] StringFacet ::= StringLength Integer | Regexp
define "StringFacet" [
list ["StringLength", "Integer"],
"Regexp" ],
-- [26] StringLength ::= "LENGTH" | "MINLENGTH" | "MAXLENGTH"
define "StringLength" [
length_, minLength_, maxLength_],
-- [27] NumericFacet ::= NumericRange NumericLiteral
-- | NumericLength Integer
define "NumericFacet" [
list ["NumericRange", "NumericLiteral"],
list ["NumericLength", "Integer"]],
-- [28] NumericRange ::= "MININCLUSIVE" | "MINEXCLUSIVE" | "MAXINCLUSIVE" | "MAXEXCLUSIVE"
define "NumericRange" [
minInclusive_, minExclusive_, maxInclusive_, maxExclusive_],
-- [29] NumericLength ::= "TOTALDIGITS" | "FRACTIONDIGITS"
define "NumericLength" [
totalDigits_, fractionDigits_],
-- [30] ShapeDefinition ::= (IncludeSet | ExtraPropertySet | "CLOSED")* '{' TripleExpression? '}' Annotation* SemanticActions
define "ShapeDefinition" [
list[star(alts["IncludeSet", "ExtraPropertySet", closed_]),
braceOpen_, opt("TripleExpression"), braceClose_,
star("Annotation"), "SemanticActions"]],
-- [31] InlineShapeDefinition ::= (IncludeSet | ExtraPropertySet | "CLOSED")* '{' TripleExpression? '}'
define "InlineShapeDefinition" [
list[star(alts["IncludeSet", "ExtraPropertySet", closed_]), braceOpen_, opt("TripleExpression"), braceClose_]],
-- [32] ExtraPropertySet ::= "EXTRA" Predicate+
define "ExtraPropertySet" [
list[extra_, plus"Predicate"]],
-- [33] TripleExpression ::= OneOfTripleExpr
define "TripleExpression" [
"OneOfTripleExpr"],
-- [34] OneOfTripleExpr ::= GroupTripleExpr | MultiElementOneOf
define "OneOfTripleExpr" [
"GroupTripleExpr",
"MultiElementOneOf"],
-- [35] MultiElementOneOf ::= GroupTripleExpr ('|' GroupTripleExpr)+
define "MultiElementOneOf" [
list["GroupTripleExpr", plus(list[pipe_, "GroupTripleExpr"])]],
-- [36] InnerTripleExpr ::= MultiElementGroup | MultiElementOneOf
define "InnerTripleExpr" [
"MultiElementGroup",
"MultiElementOneOf"],
-- [37] GroupTripleExpr ::= SingleElementGroup | MultiElementGroup
define "GroupTripleExpr" [
"SingleElementGroup",
"MultiElementGroup"],
-- [38] SingleElementGroup ::= UnaryTripleExpr ';'?
define "SingleElementGroup" [
list["UnaryTripleExpr", opt(semicolon_)]],
-- [39] MultiElementGroup ::= UnaryTripleExpr (';' UnaryTripleExpr)+ ';'?
define "MultiElementGroup" [
list["UnaryTripleExpr", plus(list[semicolon_, "UnaryTripleExpr"]), opt(semicolon_)]],
-- [40] UnaryTripleExpr ::= ('$' TripleExprLabel)? (TripleConstraint | BracketedTripleExpr) | Include
define "UnaryTripleExpr" [
list[opt(list[dollar_, "TripleExprLabel"]), alts["TripleConstraint", "BracketedTripleExpr"]],
"Include"],
-- [41] BracketedTripleExpr ::= '(' InnerTripleExpr ')' Cardinality? Annotation* SemanticActions
define "BracketedTripleExpr" [
list[parenOpen_, "InnerTripleExpr", parenClose_, opt"Cardinality", star"Annotation", "SemanticActions"]],
-- [43] TripleConstraint ::= SenseFlags? Predicate InlineShapeExpression Cardinality? Annotation* SemanticActions
define "TripleConstraint" [
list[opt"SenseFlags", "Predicate", "InlineShapeExpression", opt"Cardinality", star"Annotation", "SemanticActions"]],
-- [44] Cardinality ::= '*' | '+' | '?' | RepeatRange
define "Cardinality" [
star_, plus_, question_, "RepeatRange"],
-- [45] SenseFlags ::= '^'
define "SenseFlags" [
terminal "^"],
-- [46] ValueSet ::= '[' ValueSetValue* ']'
define "ValueSet" [
list[terminal "[", star"ValueSetValue", terminal "]"]],
-- [47] ValueSetValue ::= IriRange | Literal
define "ValueSetValue" [
"IriRange",
"Literal"],
-- [48] IriRange ::= Iri ('~' Exclusion*)? | '.' Exclusion+
define "IriRange" [
list["Iri", opt(list[tilde_, star"Exclusion"])],
list[period_, plus"Exclusion"]],
-- [49] Exclusion ::= '-' Iri '~'?
define "Exclusion" [
list[dash_, "Iri", tilde_]],
-- [50] Include ::= '&' TripleExprLabel
define "Include" [
list[ampersand_, "TripleExprLabel"]],
-- [51] Annotation ::= '//' Predicate (Iri | Literal)
define "Annotation" [
list[terminal "//", "Predicate", alts["Iri", "Literal"]]],
-- [52] SemanticActions ::= CodeDecl*
define "SemanticActions" [
star"CodeDecl"],
-- [53] CodeDecl ::= '%' Iri (Code | "%")
define "CodeDecl" [
list[percent_, "Iri", alts["Code", percent_]]],
-- [13t] Literal ::= RdfLiteral | NumericLiteral | BooleanLiteral
define "Literal" [
"RdfLiteral",
"NumericLiteral",
"BooleanLiteral"],
-- [54] Predicate ::= Iri | RdfType
define "Predicate" [
"Iri",
"RdfType"],
-- [55] Datatype ::= Iri
define "Datatype" [
"Iri"],
-- [56] ShapeExprLabel ::= Iri | BlankNode
define "ShapeExprLabel" [
"Iri",
"BlankNode"],
-- [42] TripleExprLabel ::= '$' (Iri | BlankNode)
define "TripleExprLabel" [
list[dollar_, alts["Iri", "BlankNode"]]],
-- [16t] NumericLiteral ::= Integer | Decimal | Double
define "NumericLiteral" [
"Integer", "Decimal", "Double"],
-- [129s] RdfLiteral ::= String (LangTag | '^^' Datatype)?
define "RdfLiteral" [
list["String", opt(alts["LangTag", list[terminal "^^", "Datatype"]])]],
-- [134s] BooleanLiteral ::= 'true' | 'false'
define "BooleanLiteral" [
true_, false_],
-- [135s] String ::= StringLiteral1 | StringLiteralLong1
-- | StringLiteral2 | StringLiteralLong2
define "String" [
"StringLiteral1",
"StringLiteralLong1",
"StringLiteral2",
"StringLiteralLong2"],
-- [136s] Iri ::= IriRef | PrefixedName
define "Iri" [
"IriRef",
"PrefixedName"],
-- [137s] PrefixedName ::= PnameLn | PnameNs
define "PrefixedName" [
"PnameLn",
"PnameNs"],
-- [138s] BlankNode ::= BlankNodeLabel
define "BlankNode" [
"BlankNodeLabel"],
-- # Reserved for future use
-- [57] IncludeSet ::= '&' ShapeExprLabel+
define "IncludeSet" [
list[ampersand_, plus"ShapeExprLabel"]],
-- [58] Code ::= '{' ([^%\\] | '\\' [%\\] | Uchar)* '%' '}'
define "Code" [
list[braceOpen_, star(alts[ regex "[^%\\]", list[doubleFrwSlash_, regex "[%\\]"], "Uchar" ]), percent_, braceClose_]],
-- [59] RepeatRange ::= '{' Integer (',' (Integer | '*')?)? '}'
define "RepeatRange" [
list[braceOpen_, "Integer", opt(list[coma_, opt(opt(alts["Integer", star_]))]), braceClose_]],
-- [60] RdfType ::= 'a'
define "RdfType" [
terminal "a"],
-- [18t] IriRef ::= '<' ([^#x00-#x20<>\"{}|^`\\] | Uchar)* '>' /* #x00=NULL #01-#x1F=control codes #x20=space */
define "IriRef" [
list[terminal "<", star(alts[ regex "[^#x00-#x20<>\"{}|^`\\]", "Uchar"]), terminal ">"]],
-- [140s] PnameNs ::= PnPrefix? ':'
define "PnameNs" [
list[opt"PnPrefix", semicolon_]],
-- [141s] PnameLn ::= PnameNs PnLocal
define "PnameLn" [
list["PnameNs", "PnLocal"]],
-- [61] AtpNameNs ::= '@' PnPrefix? ':'
define "AtpNameNs" [
list[at_, opt"PnPrefix", colon_]],
-- [62] AtpNameLn ::= '@' PnameNs PnLocal
define "AtpNameLn" [
list[at_, "PnameNs", "PnLocal"]],
-- [63] Regexp ::= '~/' ([^#x2f#x5C#xA#xD] | '\\' [tbnrf\\/] | Uchar)* '/' [smix]*
define "Regexp" [
list[terminal "~/", star(alts[
regex "[^#x2f#x5C#xA#xD]",
list[terminal "\\", regex "[tbnrf\\/]"], "Uchar"]),
terminal "/", star( regex "[smix]")
]],
-- [142s] BlankNodeLabel ::= '_:' (PnCharsU | [0-9]) ((PnChars | '.')* PnChars)?
define "BlankNodeLabel" [
list[terminal "_:", alts["PnCharsU", regex "[0-9]"], opt(star(alts["PnChars", period_])),"PnChars"]],
-- [145s] LangTag ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)*
define "LangTag" [
regex "@[a-zA-Z]+('-'[a-zA-Z0-9]+)*"],
-- [19t] Integer ::= [+-]? [0-9]+
define "Integer" [
regex "[+-]? [0-9]+"],
-- [20t] Decimal ::= [+-]? [0-9]* '.' [0-9]+
define "Decimal" [
regex "[+-]? [0-9]*\\.[0-9]+"],
-- [21t] Double ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.'? [0-9]+ EXPONENT)
-- [155s] EXPONENT ::= [eE] [+-]? [0-9]+
define "Double" [
regex "([+-]?([0-9]+)?\\.[0-9]*[eE][+-]?[0-9]+"],
-- [156s] StringLiteral1 ::= "'" ([^#x27#x5C#xA#xD] | Echar | Uchar)* "'" /* #x27=' #x5C=\ #xA=new line #xD=carriage return */
define "StringLiteral1" [
list[singleQuote_, star(alts[regex "[^#x27#x5C#xA#xD]", "Echar", "Uchar"]), singleQuote_]],
-- [157s] StringLiteral2 ::= '"' ([^#x22#x5C#xA#xD] | Echar | Uchar)* '"' /* #x22=" #x5C=\ #xA=new line #xD=carriage return */
define "StringLiteral2" [
list[doubleQuote_, star(alts[regex "[^#x22#x5C#xA#xD]", "Echar", "Uchar"]), doubleQuote_]],
-- [158s] StringLiteralLong1 ::= "'''" (("'" | "''")? ([^\'\\] | Echar | Uchar))* "'''"
define "StringLiteralLong1" [
list[singleQuote_, singleQuote_, singleQuote_,
star(alts[list[ opt(alts[singleQuote_, list[singleQuote_,singleQuote_]]), regex "[^\'\\]"], "Echar", "Uchar"]),
singleQuote_, singleQuote_, singleQuote_]],
-- [159s] StringLiteralLong2 ::= '"""' (('"' | '""')? ([^\"\\] | Echar | Uchar))* '"""'
define "StringLiteralLong2" [
list[doubleQuote_, doubleQuote_, doubleQuote_,
star(alts[list[ opt(alts[doubleQuote_, list[doubleQuote_,doubleQuote_]]), regex "[^\"\\]"], "Echar", "Uchar"]),
doubleQuote_, doubleQuote_, doubleQuote_]],
-- [26t] Uchar ::= '\\u' Hex Hex Hex Hex
-- | '\\U' Hex Hex Hex Hex Hex Hex Hex Hex
define "Uchar" [
list[terminal "\\u", "Hex", "Hex", "Hex", "Hex"],
list[terminal "\\U", "Hex", "Hex", "Hex", "Hex", "Hex", "Hex", "Hex", "Hex"]],
-- [160s] Echar ::= '\\' [tbnrf\\\"\']
define "Echar" [
list[doubleFrwSlash_, regex "[tbnrf\\\"\']"]],
-- [164s] PnCharsBase ::= [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]
define "PnCharsBase" [
regex "[A-Z]",
regex "[a-z]"], -- TODO other chars
-- [165s] PnCharsU ::= PnCharsBase | '_'
define "PnCharsU" [
"PnCharsBase",
underscore_],
-- [167s] PnChars ::= PnCharsU | '-' | [0-9]
-- | [#x00B7] | [#x0300-#x036F] | [#x203F-#x2040]
define "PnChars" [
"PnCharsU",
dash_,
regex "0-9"], -- TODO other chars
-- [168s] PnPrefix ::= PnCharsBase ((PnChars | '.')* PnChars)?
define "PnPrefix" [
list["PnCharsBase",
opt(list[alts["PnChars", period_],"PnChars"])]],
-- [169s] PnLocal ::= (PnCharsU | ':' | [0-9] | Plx) ((PnChars | '.' | ':' | Plx)* (PnChars | ':' | Plx))?
define "PnLocal" [
list[
alts["PnCharsU", colon_, regex "0-9", "Plx"],
opt(list[
star(alts["PnChars", period_, colon_, "Plx"]),
alts["PnChars", colon_, "Plx"]]
)]],
-- [170s] Plx ::= Percent | PnLocalEsc
define "Plx" [
"Percent",
"PnLocalEsc"],
-- [171s] Percent ::= '%' Hex Hex
define "Percent" [
list[percent_, "Hex", "Hex"]],
-- [172s] Hex ::= [0-9] | [A-F] | [a-f]
define "Hex" [regex "[0-9][A-F][a-f]"],
-- [173s] PnLocalEsc ::= '\\' ('_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%')
define "PnLocalEsc" [
list[doubleFrwSlash_, regex "[_~\\.-!$&'\\(\\)\\*+,;=/\\?#@%]"]]]
-- @pass ::= [ \t\r\n]+ -- TODO
-- | "#" [^\r\n]*