From 886ff32c78c6f06c7d25d865f6d2f2208b6153d1 Mon Sep 17 00:00:00 2001 From: Manish R Jain <manishrjain@gmail.com> Date: Mon, 2 Nov 2015 19:42:51 +1100 Subject: [PATCH] also lex and parse labels --- rdf/parse.go | 3 +++ rdf/parse_test.go | 26 ++++++++++++++++++++++++++ rdf/state.go | 21 ++++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/rdf/parse.go b/rdf/parse.go index b9412d36..4d38ed2d 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 fa14448e..50a8741f 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 bc4d8925..623cd373 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 == '>' } -- GitLab