// Assumes '"' has already been encountered. func lexLiteral(l *lex.Lexer) lex.StateFn { for { r := l.Next() if r == '\u005c' { // backslash r = l.Next() continue // This would skip over the escaped rune. } if r == lex.EOF || isEndLiteral(r) { break } } l.Backup() l.Emit(itemLiteral) l.Next() // Move to end literal. l.Ignore() // Ignore end literal. l.Depth++ r := l.Peek() if r == '@' { return lexLanguage(l) } if r == '^' { return lexObjectType(l) } return lexText }
// Assumes that the current rune is '_'. func lexBlankNode(l *lex.Lexer, styp lex.ItemType, sfn lex.StateFn) lex.StateFn { // RDF Blank Node. // TODO: At some point do checkings based on the guidelines. For now, // just accept everything until space. l.AcceptUntil(isSpace) r := l.Peek() if r == lex.EOF { return l.Errorf("Unexpected end of subject") } if isSpace(r) { l.Emit(styp) return sfn } return l.Errorf("Invalid character %v found for itemType: %v", r, styp) }
func lexUidNode(l *lex.Lexer, styp lex.ItemType, sfn lex.StateFn) lex.StateFn { l.AcceptUntil(isSpace) r := l.Peek() if r == lex.EOF { return l.Errorf("Unexpected end of uid subject") } in := l.Input[l.Start:l.Pos] if !strings.HasPrefix(in, "_uid_:") { return l.Errorf("Expected _uid_: Found: %v", l.Input[l.Start:l.Pos]) } if _, err := strconv.ParseUint(in[6:], 0, 64); err != nil { return l.Errorf("Unable to convert '%v' to UID", in[6:]) } if isSpace(r) { l.Emit(styp) return sfn } return l.Errorf("Invalid character %v found for UID node itemType: %v", r, styp) }