diff --git a/rdf/parse.go b/rdf/parse.go index b9412d36bf82b514a2af917d1366338f3ef7e953..4d38ed2d741ab2c651fc9a837cf4d987c9dd31ab 100644 --- a/rdf/parse.go +++ b/rdf/parse.go @@ -76,6 +76,9 @@ func Parse(line string) (rnq NQuad, rerr error) { if item.Typ == itemValidEnd { vend = true } + if item.Typ == itemLabel { + rnq.Label = stripBracketsIfPresent(item.Val) + } } if !vend { return rnq, fmt.Errorf("Invalid end of input") diff --git a/rdf/parse_test.go b/rdf/parse_test.go index fa14448ec573c27a1d122642c553266d381879c8..50a8741f75aff7cbcbf140ec73bec1ab83c248ef 100644 --- a/rdf/parse_test.go +++ b/rdf/parse_test.go @@ -150,6 +150,32 @@ var testNQuads = []struct { }, hasErr: false, }, + { + input: `_:alice <knows> "stuff"^^<xs:string> <label> .`, + nq: NQuad{ + Subject: "_:alice", + Predicate: "knows", + ObjectId: "", + ObjectValue: "stuff@@xs:string", + Label: "label", + }, + hasErr: false, + }, + { + input: `_:alice <knows> "stuff"^^<xs:string> _:label .`, + nq: NQuad{ + Subject: "_:alice", + Predicate: "knows", + ObjectId: "", + ObjectValue: "stuff@@xs:string", + Label: "_:label", + }, + hasErr: false, + }, + { + input: `_:alice <knows> "stuff"^^<xs:string> "label" .`, + hasErr: true, + }, } func TestLex(t *testing.T) { diff --git a/rdf/state.go b/rdf/state.go index bc4d89255207d4c928df133959d3ad105d1e03ed..623cd37367b53f4cb5f1e6fa0a0821c98c63afc6 100644 --- a/rdf/state.go +++ b/rdf/state.go @@ -71,6 +71,11 @@ Loop: l.Emit(itemText) return lexObject + } else if l.Depth == AT_LABEL { + l.Backup() + l.Emit(itemText) + return lexLabel + } else { return l.Errorf("Invalid input: %v at lexText", r) } @@ -133,7 +138,6 @@ func lexBlankNode(l *lex.Lexer, styp lex.ItemType, } if isSpace(r) { l.Emit(styp) - l.Depth += 1 return sfn } return l.Errorf("Invalid character %v found for itemType: %v", r, styp) @@ -147,6 +151,7 @@ func lexSubject(l *lex.Lexer) lex.StateFn { } if r == '_' { + l.Depth += 1 return lexBlankNode(l, itemSubject, lexText) } @@ -221,6 +226,7 @@ func lexObject(l *lex.Lexer) lex.StateFn { return lexUntilClosing(l, itemObject, lexText) } if r == '_' { + l.Depth += 1 return lexBlankNode(l, itemObject, lexText) } if r == '"' { @@ -231,6 +237,19 @@ func lexObject(l *lex.Lexer) lex.StateFn { return l.Errorf("Invalid char: %v at lexObject", r) } +func lexLabel(l *lex.Lexer) lex.StateFn { + r := l.Next() + if r == '<' { + l.Depth += 1 + return lexUntilClosing(l, itemLabel, lexText) + } + if r == '_' { + l.Depth += 1 + return lexBlankNode(l, itemLabel, lexText) + } + return l.Errorf("Invalid char: %v at lexLabel", r) +} + func isClosingBracket(r rune) bool { return r == '>' }