Files
gonum/graph/formats/rdf/extract_actions.rl
Dan Kortschak d39af6a71b graph/formats/rdf: new package for RDF N-Quad parsing
This code is based on the RDF N-Quad parsing code that I wrote for the Cayley
graph database project in 2014. The code here does not include any code that
was written by other members of the Cayley project and so is unencumbered by
copyright ownership from that project.

License addition is for the test suite from [1] linked from [2]. A second more
restrictive license is possible if we are claiming spec compliance[3].

[1]https://www.w3.org/Consortium/Legal/2008/03-bsd-license
[2]https://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html
[3]https://www.w3.org/Consortium/Legal/2008/04-testsuite-license.html
2021-01-13 20:31:06 +10:30

85 lines
1.6 KiB
Ragel

// Copyright ©2020 The Gonum Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
%%{
machine extract;
action StartIRI {
iri = p
}
action EndIRI {
if iri < 0 {
panic("unexpected parser state: iri start not set")
}
iriText = unEscape(data[iri:p])
if kind == Invalid {
kind = IRI
}
}
action StartBlank {
blank = p
}
action EndBlank {
if blank < 0 {
panic("unexpected parser state: blank start not set")
}
blankText = string(data[blank:p])
kind = Blank
}
action StartLiteral {
literal = p
}
action EndLiteral {
if literal < 0 {
panic("unexpected parser state: literal start not set")
}
literalText = unEscape(data[literal:p])
kind = Literal
}
action StartLang {
lang = p
}
action EndLang {
if lang < 0 {
panic("unexpected parser state: lang start not set")
}
langText = string(data[lang:p])
}
action Return {
switch kind {
case IRI:
return iriText, "", kind, nil
case Blank:
return blankText, "", kind, nil
case Literal:
qual = iriText
if qual == "" {
qual = langText
}
return literalText, qual, kind, nil
default:
return "", "", kind, ErrInvalidTerm
}
}
action Error {
if p < len(data) {
if r := data[p]; r < unicode.MaxASCII {
return "", "", Invalid, fmt.Errorf("%w: unexpected rune %q at %d", ErrInvalidTerm, data[p], p)
} else {
return "", "", Invalid, fmt.Errorf("%w: unexpected rune %q (\\u%04[2]x) at %d", ErrInvalidTerm, data[p], p)
}
}
return "", "", Invalid, ErrIncompleteTerm
}
}%%