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
|
// 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
}
}%%
|