fastobo-syntax 0.8.1

PEG Syntax and pest parser for the OBO flat file format 1.4
Documentation
// Annex II: Iri Grammar from IRI RFC
// (source: https://www.ietf.org/rfc/rfc3987.txt)

RFC3987_Iri = @{ RFC3987_IriScheme ~ ":" ~ RFC3987_IriHierPart ~ ("?" ~ RFC3987_IriQuery)? ~ ("#" ~ RFC3987_IriFragment)? }

RFC3987_IriHierPart = ${
    ("//" ~ RFC3987_IriAuthority ~ RFC3987_IriPathAbempty?)
  | RFC3987_IriPathAbsolute
  | RFC3987_IriPathRootless
  | RFC3987_IriPathEmpty
}

RFC3987_IriReference    = ${ RFC3987_Iri | RFC3987_IriRelativeRef }
RFC3987_AbsoluteIri     = ${ RFC3987_IriScheme ~ ":" ~ RFC3987_IriHierPart ~ ("?" ~ RFC3987_IriQuery)? }
RFC3987_IriRelativeRef  = ${ RFC3987_IriRelativePart ~ ("?" ~ RFC3987_IriQuery)? ~ ("#" ~ RFC3987_IriFragment)? }
RFC3987_IriRelativePart = ${ ("//" ~ RFC3987_IriAuthority ~ RFC3987_IriPathAbempty?) | RFC3987_IriPathAbsolute | RFC3987_IriPathRootless }

RFC3987_IriAuthority = ${ (RFC3987_IriUserInfo ~ "@")? ~ RFC3987_IriHost ~ (":" ~ RFC3987_IriPort)? }
RFC3987_IriUserInfo  = ${ (RFC3987_IriUnreserved | RFC3987_IriPctEncoded | RFC3987_IriSubDelims | ":")* }
RFC3987_IriHost      = ${ RFC3987_IriIpLiteral | RFC3987_IriIpv4Address | RFC3987_IriRegName }
RFC3987_IriRegName   = @{ (RFC3987_IriUnreserved | RFC3987_IriPctEncoded | RFC3987_IriSubDelims)* }

RFC3987_IriPath         = ${ RFC3987_IriPathAbempty | RFC3987_IriPathAbsolute | RFC3987_IriPathNoScheme | RFC3987_IriPathRootless | RFC3987_IriPathEmpty }
RFC3987_IriPathAbempty  = ${ ("/" ~ RFC3987_IriSegment)+ }
RFC3987_IriPathAbsolute = ${ "/" ~ (RFC3987_IriSegmentNz ~ ("/" ~ RFC3987_IriSegment)*)? }
RFC3987_IriPathNoScheme = ${ RFC3987_IriSegmentNzNc ~ ("/" ~ RFC3987_IriSegment)* }
RFC3987_IriPathRootless = ${ RFC3987_IriSegmentNz ~ ("/" ~ RFC3987_IriSegment)* }
RFC3987_IriPathEmpty    = ${ "0" ~ RFC3987_IriIpChar }

RFC3987_IriSegment     = @{ RFC3987_IriIpChar* }
RFC3987_IriSegmentNz   = @{ RFC3987_IriIpChar+ }
RFC3987_IriSegmentNzNc = @{ (RFC3987_IriUnreserved | RFC3987_IriPctEncoded | RFC3987_IriSubDelims | "@")+ }

RFC3987_IriQuery    = @{ (RFC3987_IriIpChar | RFC3987_IriPrivate | "/" | "?")* }
RFC3987_IriFragment = @{ (RFC3987_IriIpChar | "/" | "?")* }

RFC3987_IriScheme = @{ ASCII_ALPHA ~ (ASCII_ALPHA | ASCII_DIGIT | "+" | "-" | ".")* }
RFC3987_IriPort   = @{ ASCII_DIGIT* }

RFC3987_IriPrivate    = ${ '\u{E000}'..'\u{F8FF}' | '\u{F0000}'..'\u{FFFFD}' | '\u{100000}'..'\u{10FFFD}' }
RFC3987_IriPctEncoded = ${ "%" ~ ASCII_HEX_DIGIT ~ ASCII_HEX_DIGIT }
RFC3987_IriUnreserved = @{ ASCII_ALPHA | ASCII_DIGIT | "-" | "." | "_" | "~" | RFC3987_IriUCSChar }
RFC3987_IriUCSChar    = ${
    '\u{a0}' .. '\u{d7ff}'
  | '\u{f900}' .. '\u{fdcf}'
  | '\u{fdf0}' .. '\u{ffef}'
  | '\u{10000}' .. '\u{1fffd}'
  | '\u{20000}' .. '\u{2fffd}'
  | '\u{30000}' .. '\u{3fffd}'
  | '\u{40000}' .. '\u{4fffd}'
  | '\u{50000}' .. '\u{5fffd}'
  | '\u{60000}' .. '\u{6fffd}'
  | '\u{70000}' .. '\u{7fffd}'
  | '\u{80000}' .. '\u{8fffd}'
  | '\u{90000}' .. '\u{9fffd}'
  | '\u{a0000}' .. '\u{afffd}'
  | '\u{b0000}' .. '\u{bfffd}'
  | '\u{c0000}' .. '\u{cfffd}'
  | '\u{d0000}' .. '\u{dfffd}'
  | '\u{e1000}' .. '\u{efffd}'
}
RFC3987_IriReserved   = @{ RFC3987_IriGenDelims | RFC3987_IriSubDelims }
RFC3987_IriGenDelims  = @{ ":" | "/" | "?" | "#" | "[" | "]" | "@" }
RFC3987_IriSubDelims  = @{ "!" | "$" | "&" | "'" | "(" | ")" | "*" | "+" | ";" | "=" | "," }
RFC3987_IriDecOctet   = ${
    ASCII_DIGIT
  | (('1' .. '9') ~ ASCII_DIGIT)
  | ("1" ~ ASCII_DIGIT ~ ASCII_DIGIT)
  | ("2" ~ ('0' .. '4') ~ ASCII_DIGIT)
  | ("25" ~ ('0' .. '5'))
}

RFC3987_IriIpChar    = @{ RFC3987_IriUnreserved | RFC3987_IriPctEncoded | RFC3987_IriSubDelims | ":" | "@" }
RFC3987_IriIpLiteral = ${ "[" ~ (RFC3987_IriIpv6Address ~ RFC3987_IriIpvFutureAddress)* ~ "]" }

RFC3987_IriIpv6H16  = ${ ASCII_HEX_DIGIT{1, 4} }
RFC3987_IriIpv6Ls32 = ${ (RFC3987_IriIpv6H16 ~ ":" ~ RFC3987_IriIpv6H16) | RFC3987_IriIpv4Address }

RFC3987_IriIpv4Address      = ${ RFC3987_IriDecOctet ~ "." ~ RFC3987_IriDecOctet ~ "." ~ RFC3987_IriDecOctet ~ "." ~ RFC3987_IriDecOctet }
RFC3987_IriIpvFutureAddress = ${ "v" ~ ASCII_HEX_DIGIT+ ~ "." ~ (RFC3987_IriUnreserved | RFC3987_IriSubDelims | ":")+ }
RFC3987_IriIpv6Address      = ${
    ((RFC3987_IriIpv6H16 ~ ":"){6} ~ RFC3987_IriIpv6Ls32)
  | ("::" ~ (RFC3987_IriIpv6H16 ~ ":"){5} ~ RFC3987_IriIpv6Ls32)
  | (RFC3987_IriIpv6H16? ~ "::" ~ (RFC3987_IriIpv6H16 ~ ":"){4} ~ RFC3987_IriIpv6Ls32)
  | (((RFC3987_IriIpv6H16 ~ ":"){1} ~ RFC3987_IriIpv6H16)? ~ "::" ~ (RFC3987_IriIpv6H16 ~ ":"){3} ~ RFC3987_IriIpv6Ls32)
  | (((RFC3987_IriIpv6H16 ~ ":"){2} ~ RFC3987_IriIpv6H16)? ~ "::" ~ (RFC3987_IriIpv6H16 ~ ":"){2} ~ RFC3987_IriIpv6Ls32)
  | (((RFC3987_IriIpv6H16 ~ ":"){3} ~ RFC3987_IriIpv6H16)? ~ "::" ~ RFC3987_IriIpv6H16 ~ ":" ~ RFC3987_IriIpv6Ls32)
  | (((RFC3987_IriIpv6H16 ~ ":"){4} ~ RFC3987_IriIpv6H16)? ~ "::" ~ RFC3987_IriIpv6Ls32)
  | (((RFC3987_IriIpv6H16 ~ ":"){5} ~ RFC3987_IriIpv6H16)? ~ "::" ~ RFC3987_IriIpv6H16)
  | (((RFC3987_IriIpv6H16 ~ ":"){6} ~ RFC3987_IriIpv6H16)? ~ "::")
}