1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// 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 nquads;
action StartSubject {
subject = p
}
action StartPredicate {
predicate = p
}
action StartObject {
object = p
}
action StartLabel {
label = p
}
action StartIRI {
iri = p
}
action SetSubject {
if subject < 0 {
panic("unexpected parser state: subject start not set")
}
s.Subject.Value = string(data[subject:p])
}
action SetPredicate {
if predicate < 0 {
panic("unexpected parser state: predicate start not set")
}
s.Predicate.Value = string(data[predicate:p])
}
action SetObject {
if object < 0 {
panic("unexpected parser state: object start not set")
}
s.Object.Value = string(data[object:p])
}
action SetLabel {
if label < 0 {
panic("unexpected parser state: label start not set")
}
s.Label.Value = string(data[label:p])
}
action EndIRI {
if iri < 0 {
panic("unexpected parser state: iri start not set")
}
switch u, err := url.Parse(string(data[iri:p])); {
case err != nil:
return s, err
case !u.IsAbs():
return s, fmt.Errorf("%w: relative IRI ref %q", ErrInvalid, string(data[iri:p]))
}
}
action Return {
return s, nil
}
action Comment {
}
action Error {
if p < len(data) {
if r := data[p]; r < unicode.MaxASCII {
return s, fmt.Errorf("%w: unexpected rune %q at %d", ErrInvalid, data[p], p)
} else {
return s, fmt.Errorf("%w: unexpected rune %q (\\u%04[2]x) at %d", ErrInvalid, data[p], p)
}
}
return s, ErrIncomplete
}
}%%
|