@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix : <http://www.dajobe.org/2004/01/turtle/grammar#>.
@prefix g: <http://www.w3.org/2001/sw/DataAccess/rq23/parsers/grammar@@#>.
#@@ case insensitivity of 'BASE' and the like is not expressed.

:turtleDoc rdfs:label "turtleDoc"; rdf:value "1";
 rdfs:comment "[1] turtleDoc ::= statement*";
 a g:NonTerminal;
  g:star 
    :statement
.

:statement rdfs:label "statement"; rdf:value "2";
 rdfs:comment "[2] statement ::= directive '.' | triples '.' | ws+";
 a g:NonTerminal;
  g:alt (
    [ g:seq (
      :directive
      "."
     ) ]
    [ g:seq (
      :triples
      "."
     ) ]
    [ g:rep 
      :ws
     ]
   )
.

:directive rdfs:label "directive"; rdf:value "3";
 rdfs:comment "[3] directive ::= prefixID | base";
 a g:NonTerminal;
  g:alt (
    :prefixID
    :base
   )
.

:prefixID rdfs:label "prefixID"; rdf:value "4";
 rdfs:comment "[4] prefixID ::= '@prefix' ws+ prefixName? ':' uriref";
 a g:NonTerminal;
  g:seq (
    "@prefix"
    [ g:rep 
      :ws
     ]
    [ g:opt 
      :prefixName
     ]
    ":"
    :uriref
   )
.

:base rdfs:label "base"; rdf:value "5";
 rdfs:comment "[5] base ::= '@base' ws+ uriref";
 a g:NonTerminal;
  g:seq (
    "@base"
    [ g:rep 
      :ws
     ]
    :uriref
   )
.

:triples rdfs:label "triples"; rdf:value "6";
 rdfs:comment "[6] triples ::= subject predicateObjectList";
 a g:NonTerminal;
  g:seq (
    :subject
    :predicateObjectList
   )
.

:predicateObjectList rdfs:label "predicateObjectList"; rdf:value "7";
 rdfs:comment "[7] predicateObjectList ::= verb objectList ( ';' verb objectList )* ( ';')?";
 a g:NonTerminal;
  g:seq (
    :verb
    :objectList
    [ g:star 
      [ g:seq (
        ";"
        :verb
        :objectList
       ) ]
     ]
    [ g:opt 
      ";"
     ]
   )
.

:objectList rdfs:label "objectList"; rdf:value "8";
 rdfs:comment "[8] objectList ::= object ( ',' object)*";
 a g:NonTerminal;
  g:seq (
    :object
    [ g:star 
      [ g:seq (
        ","
        :object
       ) ]
     ]
   )
.

:verb rdfs:label "verb"; rdf:value "9";
 rdfs:comment "[9] verb ::= predicate | 'a'";
 a g:NonTerminal;
  g:alt (
    :predicate
    "a"
   )
.

:comment rdfs:label "comment"; rdf:value "10";
 rdfs:comment "[10] comment ::= '#' ( [^#xA#xD] )*";
 a g:NonTerminal;
  g:seq (
    "#"
    [ g:star 
      [  g:matches "[^#xA#xD]"  ]
     ]
   )
.

:subject rdfs:label "subject"; rdf:value "11";
 rdfs:comment "[11] subject ::= resource | blank";
 a g:NonTerminal;
  g:alt (
    :resource
    :blank
   )
.

:predicate rdfs:label "predicate"; rdf:value "12";
 rdfs:comment "[12] predicate ::= resource";
 a g:NonTerminal;
  g:seq ( :resource )
.

:object rdfs:label "object"; rdf:value "13";
 rdfs:comment "[13] object ::= resource | blank | literal";
 a g:NonTerminal;
  g:alt (
    :resource
    :blank
    :literal
   )
.

:literal rdfs:label "literal"; rdf:value "14";
 rdfs:comment "[14] literal ::= quotedString ( '@' language )? | datatypeString | integer | double | decimal | boolean";
 a g:NonTerminal;
  g:alt (
    [ g:seq (
      :quotedString
      [ g:opt 
        [ g:seq (
          "@"
          :language
         ) ]
       ]
     ) ]
    :datatypeString
    :integer
    :double
    :decimal
    :boolean
   )
.

:datatypeString rdfs:label "datatypeString"; rdf:value "15";
 rdfs:comment "[15] datatypeString ::= quotedString '^^' resource";
 a g:NonTerminal;
  g:seq (
    :quotedString
    "^^"
    :resource
   )
.

:integer rdfs:label "integer"; rdf:value "16";
 rdfs:comment "[16] integer ::= ('-' | '+') ? [0-9]+";
 a g:NonTerminal;
  g:seq (
    [ g:opt 
      [ g:alt (
        "-"
        "+"
       ) ]
     ]
    [ g:rep 
      [  g:matches "[0-9]"  ]
     ]
   )
.

:double rdfs:label "double"; rdf:value "17";
 rdfs:comment "[17] double ::= ('-' | '+') ? ( [0-9]+ '.' [0-9]* exponent | '.' ([0-9])+ exponent | ([0-9])+ exponent )";
 a g:NonTerminal;
  g:seq (
    [ g:opt 
      [ g:alt (
        "-"
        "+"
       ) ]
     ]
    [ g:alt (
      [ g:seq (
        [ g:rep 
          [  g:matches "[0-9]"  ]
         ]
        "."
        [ g:star 
          [  g:matches "[0-9]"  ]
         ]
        :exponent
       ) ]
      [ g:seq (
        "."
        [ g:rep 
          [  g:matches "[0-9]"  ]
         ]
        :exponent
       ) ]
      [ g:seq (
        [ g:rep 
          [  g:matches "[0-9]"  ]
         ]
        :exponent
       ) ]
     ) ]
   )
.

:decimal rdfs:label "decimal"; rdf:value "18";
 rdfs:comment "[18] decimal ::= ('-' | '+')? ( [0-9]+ '.' [0-9]* | '.' ([0-9])+ | ([0-9])+ )";
 a g:NonTerminal;
  g:seq (
    [ g:opt 
      [ g:alt (
        "-"
        "+"
       ) ]
     ]
    [ g:alt (
      [ g:seq (
        [ g:rep 
          [  g:matches "[0-9]"  ]
         ]
        "."
        [ g:star 
          [  g:matches "[0-9]"  ]
         ]
       ) ]
      [ g:seq (
        "."
        [ g:rep 
          [  g:matches "[0-9]"  ]
         ]
       ) ]
      [ g:rep 
        [  g:matches "[0-9]"  ]
       ]
     ) ]
   )
.

:exponent rdfs:label "exponent"; rdf:value "19";
 rdfs:comment "[19] exponent ::= [eE] ('-' | '+')? [0-9]+";
 a g:NonTerminal;
  g:seq (
    [  g:matches "[eE]"  ]
    [ g:opt 
      [ g:alt (
        "-"
        "+"
       ) ]
     ]
    [ g:rep 
      [  g:matches "[0-9]"  ]
     ]
   )
.

:boolean rdfs:label "boolean"; rdf:value "20";
 rdfs:comment "[20] boolean ::= 'true' | 'false'";
 a g:NonTerminal;
  g:alt (
    "true"
    "false"
   )
.

:blank rdfs:label "blank"; rdf:value "21";
 rdfs:comment "[21] blank ::= nodeID | '[]' | '[' predicateObjectList ']' | collection";
 a g:NonTerminal;
  g:alt (
    :nodeID
    "[]"
    [ g:seq (
      "["
      :predicateObjectList
      "]"
     ) ]
    :collection
   )
.

:itemList rdfs:label "itemList"; rdf:value "22";
 rdfs:comment "[22] itemList ::= object+";
 a g:NonTerminal;
  g:rep 
    :object
.

:collection rdfs:label "collection"; rdf:value "23";
 rdfs:comment "[23] collection ::= '(' itemList? ')'";
 a g:NonTerminal;
  g:seq (
    "("
    [ g:opt 
      :itemList
     ]
    ")"
   )
.

:ws rdfs:label "ws"; rdf:value "24";
 rdfs:comment "[24] ws ::= #x9 | #xA | #xD | #x20 | comment";
 a g:NonTerminal;
  g:alt (
    [  g:matches "\\x9"  ]
    [  g:matches "\\xA"  ]
    [  g:matches "\\xD"  ]
    [  g:matches "\\x20"  ]
    :comment
   )
.

:resource rdfs:label "resource"; rdf:value "25";
 rdfs:comment "[25] resource ::= uriref | qname";
 a g:NonTerminal;
  g:alt (
    :uriref
    :qname
   )
.

:nodeID rdfs:label "nodeID"; rdf:value "26";
 rdfs:comment "[26] nodeID ::= '_:' name";
 a g:NonTerminal;
  g:seq (
    "_:"
    :name
   )
.

:qname rdfs:label "qname"; rdf:value "27";
 rdfs:comment "[27] qname ::= prefixName? ':' name?";
 a g:NonTerminal;
  g:seq (
    [ g:opt 
      :prefixName
     ]
    ":"
    [ g:opt 
      :name
     ]
   )
.

:uriref rdfs:label "uriref"; rdf:value "28";
 rdfs:comment "[28] uriref ::= '<' relativeURI '>'";
 a g:NonTerminal;
  g:seq (
    "<"
    :relativeURI
    ">"
   )
.

:language rdfs:label "language"; rdf:value "29";
 rdfs:comment "[29] language ::= [a-z]+ ('-' [a-z0-9]+ )*";
 a g:NonTerminal;
  g:seq (
    [ g:rep 
      [  g:matches "[a-z]"  ]
     ]
    [ g:star 
      [ g:seq (
        "-"
        [ g:rep 
          [  g:matches "[a-z0-9]"  ]
         ]
       ) ]
     ]
   )
.

:nameStartChar rdfs:label "nameStartChar"; rdf:value "30";
 rdfs:comment "[30] nameStartChar ::= [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]";
 a g:NonTerminal;
  g:alt (
    [  g:matches "[A-Z]"  ]
    "_"
    [  g:matches "[a-z]"  ]
    [  g:matches "[#x00C0-#x00D6]"  ]
    [  g:matches "[#x00D8-#x00F6]"  ]
    [  g:matches "[#x00F8-#x02FF]"  ]
    [  g:matches "[#x0370-#x037D]"  ]
    [  g:matches "[#x037F-#x1FFF]"  ]
    [  g:matches "[#x200C-#x200D]"  ]
    [  g:matches "[#x2070-#x218F]"  ]
    [  g:matches "[#x2C00-#x2FEF]"  ]
    [  g:matches "[#x3001-#xD7FF]"  ]
    [  g:matches "[#xF900-#xFDCF]"  ]
    [  g:matches "[#xFDF0-#xFFFD]"  ]
    [  g:matches "[#x10000-#xEFFFF]"  ]
   )
.

:nameChar rdfs:label "nameChar"; rdf:value "31";
 rdfs:comment "[31] nameChar ::= nameStartChar | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]";
 a g:NonTerminal;
  g:alt (
    :nameStartChar
    "-"
    [  g:matches "[0-9]"  ]
    [  g:matches "\\x00B7"  ]
    [  g:matches "[#x0300-#x036F]"  ]
    [  g:matches "[#x203F-#x2040]"  ]
   )
.

:name rdfs:label "name"; rdf:value "32";
 rdfs:comment "[32] name ::= nameStartChar nameChar*";
 a g:NonTerminal;
  g:seq (
    :nameStartChar
    [ g:star 
      :nameChar
     ]
   )
.

:prefixName rdfs:label "prefixName"; rdf:value "33";
 rdfs:comment "[33] prefixName ::= ( nameStartChar - '_' ) nameChar*";
 a g:NonTerminal;
  g:seq (
    [ g:diff (
      :nameStartChar
      "_"
     ) ]
    [ g:star 
      :nameChar
     ]
   )
.

:relativeURI rdfs:label "relativeURI"; rdf:value "34";
 rdfs:comment "[34] relativeURI ::= ucharacter*";
 a g:NonTerminal;
  g:star 
    :ucharacter
.

:quotedString rdfs:label "quotedString"; rdf:value "35";
 rdfs:comment "[35] quotedString ::= string | longString";
 a g:NonTerminal;
  g:alt (
    :string
    :longString
   )
.

:string rdfs:label "string"; rdf:value "36";
 rdfs:comment "[36] string ::= #x22 scharacter* #x22";
 a g:NonTerminal;
  g:seq (
    [  g:matches "\\x22"  ]
    [ g:star 
      :scharacter
     ]
    [  g:matches "\\x22"  ]
   )
.

:longString rdfs:label "longString"; rdf:value "37";
 rdfs:comment "[37] longString ::= #x22 #x22 #x22 lcharacter* #x22 #x22 #x22";
 a g:NonTerminal;
  g:seq (
    [  g:matches "\\x22"  ]
    [  g:matches "\\x22"  ]
    [  g:matches "\\x22"  ]
    [ g:star 
      :lcharacter
     ]
    [  g:matches "\\x22"  ]
    [  g:matches "\\x22"  ]
    [  g:matches "\\x22"  ]
   )
.

:character rdfs:label "character"; rdf:value "38";
 rdfs:comment "[38] character ::= '\\u' hex hex hex hex |";
 a g:NonTerminal;
  g:seq (
    "\\u"
    :hex
    :hex
    :hex
    :hex
   )
.

:echaracter rdfs:label "echaracter"; rdf:value "39";
 rdfs:comment "[39] echaracter ::= character | '\\t' | '\\n' | '\\r'";
 a g:NonTerminal;
  g:alt (
    :character
    "\\t"
    "\\n"
    "\\r"
   )
.

:hex rdfs:label "hex"; rdf:value "40";
 rdfs:comment "[40] hex ::= [#x30-#x39] | [#x41-#x46]";
 a g:NonTerminal;
  g:alt (
    [  g:matches "[#x30-#x39]"  ]
    [  g:matches "[#x41-#x46]"  ]
   )
.

:ucharacter rdfs:label "ucharacter"; rdf:value "41";
 rdfs:comment "[41] ucharacter ::= ( character - #x3E ) | '\\>'";
 a g:NonTerminal;
  g:alt (
    [ g:diff (
      :character
      [  g:matches "\\x3E"  ]
     ) ]
    "\\>"
   )
.

:scharacter rdfs:label "scharacter"; rdf:value "42";
 rdfs:comment "[42] scharacter ::= ( echaracter - #x22 ) | '\\\"'";
 a g:NonTerminal;
  g:alt (
    [ g:diff (
      :echaracter
      [  g:matches "\\x22"  ]
     ) ]
    "\\\""
   )
.

:lcharacter rdfs:label "lcharacter"; rdf:value "43";
 rdfs:comment "[43] lcharacter ::= echaracter | '\\\"' | #x9 | #xA | #xD";
 a g:NonTerminal;
  g:alt (
    :echaracter
    "\\\""
    [  g:matches "\\x9"  ]
    [  g:matches "\\xA"  ]
    [  g:matches "\\xD"  ]
   )
.
