@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix ttl: <http://www.w3.org/2000/10/swap/grammar/turtle#>.
@prefix : <http://www.w3.org/2000/10/swap/grammar/turtle#>.
@prefix re: <http://www.w3.org/2000/10/swap/grammar/regex#>.
@prefix g: <http://www.w3.org/2000/10/swap/grammar/ebnf#>.

:language rdfs:isDefinedBy <>; g:start :parse.

:parse rdfs:label "parse"; rdf:value "1";
 rdfs:comment "[1]    parse                   ::=   Statement*";
  g:star 
    :Statement
.

:Statement rdfs:label "Statement"; rdf:value "2";
 rdfs:comment "[2]    Statement               ::=   ( Directive | TriplesSameSubject ) '.'";
  g:seq (
    [ g:alt (
      :Directive
      :TriplesSameSubject
     ) ]
    "."
   )
.

:Directive rdfs:label "Directive"; rdf:value "3";
 rdfs:comment "[3]    Directive               ::=   'PREFIX' QNAME_NS Q_IRI_REF";
  g:seq (
    "PREFIX"
    :QNAME_NS
    :Q_IRI_REF
   )
.

:TriplesSameSubject rdfs:label "TriplesSameSubject"; rdf:value "4";
 rdfs:comment "[4]    TriplesSameSubject      ::=   VarOrTerm PropertyListNotEmpty | TriplesNode PropertyList";
  g:alt (
    [ g:seq (
      :VarOrTerm
      :PropertyListNotEmpty
     ) ]
    [ g:seq (
      :TriplesNode
      :PropertyList
     ) ]
   )
.

:PropertyList rdfs:label "PropertyList"; rdf:value "5";
 rdfs:comment "[5]    PropertyList            ::=   PropertyListNotEmpty?";
  g:opt 
    :PropertyListNotEmpty
.

:PropertyListNotEmpty rdfs:label "PropertyListNotEmpty"; rdf:value "6";
 rdfs:comment "[6]    PropertyListNotEmpty    ::=   Verb ObjectList ( ';' ( Verb ObjectList )? )*";
  g:seq (
    :Verb
    :ObjectList
    [ g:star 
      [ g:seq (
        ";"
        [ g:opt 
          [ g:seq (
            :Verb
            :ObjectList
           ) ]
         ]
       ) ]
     ]
   )
.

:ObjectList rdfs:label "ObjectList"; rdf:value "7";
 rdfs:comment "[7]    ObjectList              ::=   Object ( ',' Object )*";
  g:seq (
    :Object
    [ g:star 
      [ g:seq (
        ","
        :Object
       ) ]
     ]
   )
.

:Object rdfs:label "Object"; rdf:value "8";
 rdfs:comment "[8]    Object                  ::=   GraphNode";
  g:seq ( :GraphNode )
.

:Verb rdfs:label "Verb"; rdf:value "9";
 rdfs:comment "[9]    Verb                    ::=   IRIref | 'a' | '=>'";
  g:alt (
    :IRIref
    "a"
    "=>"
   )
.

:TriplesNode rdfs:label "TriplesNode"; rdf:value "10";
 rdfs:comment "[10]   TriplesNode             ::=   Collection | BlankNodePropertyList";
  g:alt (
    :Collection
    :BlankNodePropertyList
   )
.

:BlankNodePropertyList rdfs:label "BlankNodePropertyList"; rdf:value "11";
 rdfs:comment "[11]   BlankNodePropertyList   ::=   '[' PropertyListNotEmpty ']'";
  g:seq (
    "["
    :PropertyListNotEmpty
    "]"
   )
.

:Collection rdfs:label "Collection"; rdf:value "12";
 rdfs:comment "[12]   Collection              ::=   '(' GraphNode+ ')'";
  g:seq (
    "("
    [ g:rep 
      :GraphNode
     ]
    ")"
   )
.

:GraphNode rdfs:label "GraphNode"; rdf:value "13";
 rdfs:comment "[13]   GraphNode               ::=   VarOrTerm | TriplesNode";
  g:alt (
    :VarOrTerm
    :TriplesNode
   )
.

:VarOrTerm rdfs:label "VarOrTerm"; rdf:value "14";
 rdfs:comment "[14]   VarOrTerm               ::=   Var | GraphTerm | Formula";
  g:alt (
    :Var
    :GraphTerm
    :Formula
   )
.

:Formula rdfs:label "Formula"; rdf:value "15";
 rdfs:comment "[15]   Formula                 ::=   '{' TriplesSameSubject ( '.' TriplesSameSubject? )* '}'";
  g:seq (
    "{"
    :TriplesSameSubject
    [ g:star 
      [ g:seq (
        "."
        [ g:opt 
          :TriplesSameSubject
         ]
       ) ]
     ]
    "}"
   )
.

:Var rdfs:label "Var"; rdf:value "16";
 rdfs:comment "[16]   Var                     ::=   VAR1 | VAR2";
  g:alt (
    :VAR1
    :VAR2
   )
.

:GraphTerm rdfs:label "GraphTerm"; rdf:value "17";
 rdfs:comment "[17]   GraphTerm               ::=   IRIref | RDFLiteral | ( '-' | '+' )? NumericLiteral | BlankNode | NIL";
  g:alt (
    :IRIref
    :RDFLiteral
    [ g:seq (
      [ g:opt 
        [ g:alt (
          "-"
          "+"
         ) ]
       ]
      :NumericLiteral
     ) ]
    :BlankNode
    :NIL
   )
.

:NumericLiteral rdfs:label "NumericLiteral"; rdf:value "18";
 rdfs:comment "[18]   NumericLiteral          ::=   INTEGER | DECIMAL | DOUBLE";
  g:alt (
    :INTEGER
    :DECIMAL
    :DOUBLE
   )
.

:RDFLiteral rdfs:label "RDFLiteral"; rdf:value "19";
 rdfs:comment "[19]   RDFLiteral              ::=   String ( Langtag | ( '^^' IRIref ) )?";
  g:seq (
    :String
    [ g:opt 
      [ g:alt (
        :Langtag
        [ g:seq (
          "^^"
          :IRIref
         ) ]
       ) ]
     ]
   )
.

:Langtag rdfs:label "Langtag"; rdf:value "20";
 rdfs:comment "[20]   Langtag                 ::=   LANGTAG | 'PREFIX'";
  g:alt (
    :LANGTAG
    "PREFIX"
   )
.

:String rdfs:label "String"; rdf:value "21";
 rdfs:comment "[21]   String                  ::=   STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2";
  g:alt (
    :STRING_LITERAL1
    :STRING_LITERAL2
    :STRING_LITERAL_LONG1
    :STRING_LITERAL_LONG2
   )
.

:IRIref rdfs:label "IRIref"; rdf:value "22";
 rdfs:comment "[22]   IRIref                  ::=   Q_IRI_REF | QName";
  g:alt (
    :Q_IRI_REF
    :QName
   )
.

:QName rdfs:label "QName"; rdf:value "23";
 rdfs:comment "[23]   QName                   ::=   QNAME | QNAME_NS";
  g:alt (
    :QNAME
    :QNAME_NS
   )
.

:BlankNode rdfs:label "BlankNode"; rdf:value "24";
 rdfs:comment "[24]   BlankNode               ::=   BLANK_NODE_LABEL | ANON";
  g:alt (
    :BLANK_NODE_LABEL
    :ANON
   )
.

:Q_IRI_REF rdfs:label "Q_IRI_REF"; rdf:value "25";
 rdfs:comment "[25]   Q_IRI_REF               ::=   '<' ([^<>'{}|^`]-[#x00-#x20])* '>'";
  re:seq (
    "<"
    [ re:star 
      [ re:diff (
        [  re:matches "[^<>'{}|^`]"  ]
        [  re:matches "[\u0000-\u0020]"  ]
       ) ]
     ]
    ">"
   )
.

:QNAME_NS rdfs:label "QNAME_NS"; rdf:value "26";
 rdfs:comment "[26]   QNAME_NS                ::=   NCNAME_PREFIX? ':'";
  re:seq (
    [ re:opt 
      :NCNAME_PREFIX
     ]
    ":"
   )
.

:QNAME rdfs:label "QNAME"; rdf:value "27";
 rdfs:comment "[27]   QNAME                   ::=   NCNAME_PREFIX? ':' NCNAME?";
  re:seq (
    [ re:opt 
      :NCNAME_PREFIX
     ]
    ":"
    [ re:opt 
      :NCNAME
     ]
   )
.

:BLANK_NODE_LABEL rdfs:label "BLANK_NODE_LABEL"; rdf:value "28";
 rdfs:comment "[28]   BLANK_NODE_LABEL        ::=   '_:' NCNAME";
  re:seq (
    "_:"
    :NCNAME
   )
.

:VAR1 rdfs:label "VAR1"; rdf:value "29";
 rdfs:comment "[29]   VAR1                    ::=   '?' VARNAME";
  re:seq (
    "?"
    :VARNAME
   )
.

:VAR2 rdfs:label "VAR2"; rdf:value "30";
 rdfs:comment "[30]   VAR2                    ::=   '$' VARNAME";
  re:seq (
    "$"
    :VARNAME
   )
.

:LANGTAG rdfs:label "LANGTAG"; rdf:value "31";
 rdfs:comment "[31]   LANGTAG                 ::=   '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)*";
  re:seq (
    "@"
    [ re:rep 
      [  re:matches "[a-zA-Z]"  ]
     ]
    [ re:star 
      [ re:seq (
        "-"
        [ re:rep 
          [  re:matches "[a-zA-Z0-9]"  ]
         ]
       ) ]
     ]
   )
.

:INTEGER rdfs:label "INTEGER"; rdf:value "32";
 rdfs:comment "[32]   INTEGER                 ::=   [0-9]+";
  re:rep 
    [  re:matches "[0-9]"  ]
.

:DECIMAL rdfs:label "DECIMAL"; rdf:value "33";
 rdfs:comment "[33]   DECIMAL                 ::=   [0-9]+ '.' [0-9]* | '.' [0-9]+";
  re:alt (
    [ re:seq (
      [ re:rep 
        [  re:matches "[0-9]"  ]
       ]
      "."
      [ re:star 
        [  re:matches "[0-9]"  ]
       ]
     ) ]
    [ re:seq (
      "."
      [ re:rep 
        [  re:matches "[0-9]"  ]
       ]
     ) ]
   )
.

:DOUBLE rdfs:label "DOUBLE"; rdf:value "34";
 rdfs:comment "[34]   DOUBLE                  ::=   [0-9]+ '.' [0-9]* EXPONENT | '.' ([0-9])+ EXPONENT | ([0-9])+ EXPONENT";
  re:alt (
    [ re:seq (
      [ re:rep 
        [  re:matches "[0-9]"  ]
       ]
      "."
      [ re:star 
        [  re:matches "[0-9]"  ]
       ]
      :EXPONENT
     ) ]
    [ re:seq (
      "."
      [ re:rep 
        [  re:matches "[0-9]"  ]
       ]
      :EXPONENT
     ) ]
    [ re:seq (
      [ re:rep 
        [  re:matches "[0-9]"  ]
       ]
      :EXPONENT
     ) ]
   )
.

:EXPONENT rdfs:label "EXPONENT"; rdf:value "35";
 rdfs:comment "[35]   EXPONENT                ::=   [eE] [+-]? [0-9]+";
  re:seq (
    [  re:matches "[eE]"  ]
    [ re:opt 
      [  re:matches "[+-]"  ]
     ]
    [ re:rep 
      [  re:matches "[0-9]"  ]
     ]
   )
.

:STRING_LITERAL1 rdfs:label "STRING_LITERAL1"; rdf:value "36";
 rdfs:comment "[36]   STRING_LITERAL1         ::=   \"'\" ( ([^#x27#x5C#xA#xD]) | ECHAR | UCHAR )* \"'\"";
  re:seq (
    "'"
    [ re:star 
      [ re:alt (
        [  re:matches "[^\u0027\\\u005C\u000A\u000D]"  ]
        :ECHAR
        :UCHAR
       ) ]
     ]
    "'"
   )
.

:STRING_LITERAL2 rdfs:label "STRING_LITERAL2"; rdf:value "37";
 rdfs:comment "[37]   STRING_LITERAL2         ::=   '\"' ( ([^#x22#x5C#xA#xD]) | ECHAR | UCHAR )* '\"'";
  re:seq (
    "\""
    [ re:star 
      [ re:alt (
        [  re:matches "[^\u0022\\\u005C\u000A\u000D]"  ]
        :ECHAR
        :UCHAR
       ) ]
     ]
    "\""
   )
.

:STRING_LITERAL_LONG1 rdfs:label "STRING_LITERAL_LONG1"; rdf:value "38";
 rdfs:comment "[38]   STRING_LITERAL_LONG1    ::=   \"'''\" ( ( \"'\" | \"''\" )? ( [^'\\] | ECHAR | UCHAR ) )* \"'''\"";
  re:seq (
    "'''"
    [ re:star 
      [ re:seq (
        [ re:opt 
          [ re:alt (
            "'"
            "''"
           ) ]
         ]
        [ re:alt (
          [  re:matches "[^'\\]"  ]
          :ECHAR
          :UCHAR
         ) ]
       ) ]
     ]
    "'''"
   )
.

:STRING_LITERAL_LONG2 rdfs:label "STRING_LITERAL_LONG2"; rdf:value "39";
 rdfs:comment "[39]   STRING_LITERAL_LONG2    ::=   '\"\"\"' ( ( '\"' | '\"\"' )? ( [^\"\\] | ECHAR | UCHAR ) )* '\"\"\"'";
  re:seq (
    "\"\"\""
    [ re:star 
      [ re:seq (
        [ re:opt 
          [ re:alt (
            "\""
            "\"\""
           ) ]
         ]
        [ re:alt (
          [  re:matches "[^\"\\]"  ]
          :ECHAR
          :UCHAR
         ) ]
       ) ]
     ]
    "\"\"\""
   )
.

:ECHAR rdfs:label "ECHAR"; rdf:value "40";
 rdfs:comment "[40]   ECHAR                   ::=   '\\' [tbnrf\\\"']";
  re:seq (
    "\\"
    [  re:matches "[tbnrf\\\"']"  ]
   )
.

:UCHAR rdfs:label "UCHAR"; rdf:value "41";
 rdfs:comment "[41]   UCHAR                   ::=   '\\' ( 'u' HEX HEX HEX HEX | 'U' HEX HEX HEX HEX HEX HEX HEX HEX )";
  re:seq (
    "\\"
    [ re:alt (
      [ re:seq (
        "u"
        :HEX
        :HEX
        :HEX
        :HEX
       ) ]
      [ re:seq (
        "U"
        :HEX
        :HEX
        :HEX
        :HEX
        :HEX
        :HEX
        :HEX
        :HEX
       ) ]
     ) ]
   )
.

:HEX rdfs:label "HEX"; rdf:value "42";
 rdfs:comment "[42]   HEX                     ::=   [0-9] | [A-F] | [a-f]";
  re:alt (
    [  re:matches "[0-9]"  ]
    [  re:matches "[A-F]"  ]
    [  re:matches "[a-f]"  ]
   )
.

:NIL rdfs:label "NIL"; rdf:value "43";
 rdfs:comment "[43]   NIL                     ::=   '(' WS* ')'";
  re:seq (
    "("
    [ re:star 
      :WS
     ]
    ")"
   )
.

:WS rdfs:label "WS"; rdf:value "44";
 rdfs:comment "[44]   WS                      ::=   #x20 | #x9 | #xD | #xA";
  re:alt (
    [  re:matches "[\u0020]"  ]
    [  re:matches "[\u0009]"  ]
    [  re:matches "[\u000D]"  ]
    [  re:matches "[\u000A]"  ]
   )
.

:ANON rdfs:label "ANON"; rdf:value "45";
 rdfs:comment "[45]   ANON                    ::=   '[' WS* ']'";
  re:seq (
    "["
    [ re:star 
      :WS
     ]
    "]"
   )
.

:NCCHAR1p rdfs:label "NCCHAR1p"; rdf:value "46";
 rdfs:comment "[46]   NCCHAR1p                ::=     [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] | UCHAR";
  re:alt (
    [  re:matches "[A-Z]"  ]
    [  re:matches "[a-z]"  ]
    [  re:matches "[\u00C0-\u00D6]"  ]
    [  re:matches "[\u00D8-\u00F6]"  ]
    [  re:matches "[\u00F8-\u02FF]"  ]
    [  re:matches "[\u0370-\u037D]"  ]
    [  re:matches "[\u037F-\u1FFF]"  ]
    [  re:matches "[\u200C-\u200D]"  ]
    [  re:matches "[\u2070-\u218F]"  ]
    [  re:matches "[\u2C00-\u2FEF]"  ]
    [  re:matches "[\u3001-\uD7FF]"  ]
    [  re:matches "[\uF900-\uFDCF]"  ]
    [  re:matches "[\uFDF0-\uFFFD]"  ]
    [  re:matches "[\u0000-\uFFFF]"  ]
    :UCHAR
   )
.

:NCCHAR1 rdfs:label "NCCHAR1"; rdf:value "47";
 rdfs:comment "[47]   NCCHAR1                 ::=   NCCHAR1p | '_'";
  re:alt (
    :NCCHAR1p
    "_"
   )
.

:VARNAME rdfs:label "VARNAME"; rdf:value "48";
 rdfs:comment "[48]   VARNAME                 ::=   ( NCCHAR1 | [0-9] ) ( NCCHAR1 | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*";
  re:seq (
    [ re:alt (
      :NCCHAR1
      [  re:matches "[0-9]"  ]
     ) ]
    [ re:star 
      [ re:alt (
        :NCCHAR1
        [  re:matches "[0-9]"  ]
        [  re:matches "[\u00B7]"  ]
        [  re:matches "[\u0300-\u036F]"  ]
        [  re:matches "[\u203F-\u2040]"  ]
       ) ]
     ]
   )
.

:NCCHAR rdfs:label "NCCHAR"; rdf:value "49";
 rdfs:comment "[49]   NCCHAR                  ::=   NCCHAR1 | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]";
  re:alt (
    :NCCHAR1
    "-"
    [  re:matches "[0-9]"  ]
    [  re:matches "[\u00B7]"  ]
    [  re:matches "[\u0300-\u036F]"  ]
    [  re:matches "[\u203F-\u2040]"  ]
   )
.

:NCNAME_PREFIX rdfs:label "NCNAME_PREFIX"; rdf:value "50";
 rdfs:comment "[50]   NCNAME_PREFIX           ::=   NCCHAR1p ((NCCHAR|'.')* NCCHAR)?";
  re:seq (
    :NCCHAR1p
    [ re:opt 
      [ re:seq (
        [ re:star 
          [ re:alt (
            :NCCHAR
            "."
           ) ]
         ]
        :NCCHAR
       ) ]
     ]
   )
.

:NCNAME rdfs:label "NCNAME"; rdf:value "51";
 rdfs:comment "[51]   NCNAME                  ::=   NCCHAR1 ((NCCHAR|'.')* NCCHAR)?";
  re:seq (
    :NCCHAR1
    [ re:opt 
      [ re:seq (
        [ re:star 
          [ re:alt (
            :NCCHAR
            "."
           ) ]
         ]
        :NCCHAR
       ) ]
     ]
   )
.
