本文整理匯總了Golang中github.com/dgraph-io/dgraph/lex.Lexer.Backup方法的典型用法代碼示例。如果您正苦於以下問題:Golang Lexer.Backup方法的具體用法?Golang Lexer.Backup怎麽用?Golang Lexer.Backup使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/dgraph-io/dgraph/lex.Lexer
的用法示例。
在下文中一共展示了Lexer.Backup方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: lexInside
func lexInside(l *lex.Lexer) lex.StateFn {
for {
switch r := l.Next(); {
case r == rightCurl:
l.Depth -= 1
l.Emit(itemRightCurl)
if l.Depth == 0 {
return lexText
}
case r == leftCurl:
l.Depth += 1
l.Emit(itemLeftCurl)
case r == lex.EOF:
return l.Errorf("unclosed action")
case isSpace(r) || isEndOfLine(r) || r == ',':
l.Ignore()
case isNameBegin(r):
return lexName
case r == '#':
l.Backup()
return lexComment
case r == '(':
l.Emit(itemLeftRound)
return lexArgInside
default:
return l.Errorf("Unrecognized character in lexInside: %#U", r)
}
}
}
示例2: lexDirective
// lexDirective is called right after we see a @.
func lexDirective(l *lex.Lexer) lex.StateFn {
r := l.Next()
if !isNameBegin(r) {
return l.Errorf("Unrecognized character in lexDirective: %#U", r)
}
l.Backup()
// This gives our buffer an initial capacity. Its length is zero though. The
// buffer can grow beyond this initial capacity.
buf := bytes.NewBuffer(make([]byte, 0, 15))
for {
// The caller already checked isNameBegin, and absorbed one rune.
r = l.Next()
buf.WriteRune(r)
if isNameSuffix(r) {
continue
}
l.Backup()
l.Emit(itemDirectiveName)
directive := buf.Bytes()[:buf.Len()-1]
// The lexer may behave differently for different directives. Hence, we need
// to check the directive here and go into the right state.
if string(directive) == "filter" {
return lexFilterInside
}
return l.Errorf("Unhandled directive %s", directive)
}
return lexInside
}
示例3: lexText
// This function inspects the next rune and calls the appropriate stateFn.
func lexText(l *lex.Lexer) lex.StateFn {
Loop:
for {
switch r := l.Next(); {
case r == '<' || r == '_':
if l.Depth == atSubject {
l.Backup()
l.Emit(itemText) // emit whatever we have so far.
return lexSubject
}
if l.Depth == atPredicate {
l.Backup()
l.Emit(itemText)
return lexPredicate
}
if l.Depth == atObject {
l.Backup()
l.Emit(itemText)
return lexObject
}
if l.Depth == atLabel {
l.Backup()
l.Emit(itemText)
return lexLabel
}
return l.Errorf("Invalid input: %c at lexText", r)
case r == '"':
if l.Depth != atObject {
return l.Errorf("Invalid quote for non-object.")
}
l.Backup()
l.Emit(itemText)
return lexObject
case r == lex.EOF:
break Loop
case r == '.':
if l.Depth > atObject {
l.Emit(itemValidEnd)
}
break Loop
case isSpace(r):
continue
default:
l.Errorf("Invalid input: %c at lexText", r)
}
}
if l.Pos > l.Start {
l.Emit(itemText)
}
l.Emit(lex.ItemEOF)
return nil
}
示例4: lexObject
func lexObject(l *lex.Lexer) lex.StateFn {
for {
switch r := l.Next(); {
case r == rightCurl:
return lexText
case isSpace(r) || isEndOfLine(r):
l.Ignore()
case isNameBegin(r):
{
for {
r := l.Next()
if isNameSuffix(r) {
continue // absorb
}
l.Backup()
l.Emit(itemObject)
break
}
return lexObjectBlock
}
default:
return l.Errorf("Invalid schema. Unexpected %s", l.Input[l.Start:l.Pos])
}
}
}
示例5: lexLiteral
// 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
}
示例6: lexTextMutation
// lexTextMutation lexes and absorbs the text inside a mutation operation block.
func lexTextMutation(l *lex.Lexer) lex.StateFn {
for {
r := l.Next()
if r == lex.EOF {
return l.Errorf("Unclosed mutation text")
}
if r == quote {
return lexMutationValue
}
if r == leftCurl {
l.Depth++
}
if r == rightCurl {
if l.Depth > 2 {
l.Depth--
continue
}
}
if r != rightCurl {
// Absorb everything until we find '}'.
continue
}
l.Backup()
l.Emit(itemMutationContent)
break
}
return lexInsideMutation
}
示例7: lexOperationType
// lexOperationType lexes a query or mutation operation type.
func lexOperationType(l *lex.Lexer) lex.StateFn {
for {
r := l.Next()
if isNameSuffix(r) {
continue // absorb
}
l.Backup()
// l.Pos would be index of the end of operation type + 1.
word := l.Input[l.Start:l.Pos]
if word == "mutation" {
l.Emit(itemOpType)
l.Mode = mutationMode
} else if word == "fragment" {
l.Emit(itemOpType)
l.Mode = fragmentMode
} else if word == "query" {
l.Emit(itemOpType)
l.Mode = queryMode
} else {
if l.Mode == 0 {
l.Errorf("Invalid operation type")
}
}
break
}
return lexText
}
示例8: lexText
func lexText(l *lex.Lexer) lex.StateFn {
Loop:
for {
switch r := l.Next(); {
case r == leftCurl:
l.Backup()
l.Emit(itemText) // emit whatever we have so far.
l.Next() // advance one to get back to where we saw leftCurl.
l.Depth += 1 // one level down.
l.Emit(itemLeftCurl)
return lexInside // we're in.
case r == rightCurl:
return l.Errorf("Too many right characters")
case r == lex.EOF:
break Loop
case isNameBegin(r):
l.Backup()
l.Emit(itemText)
return lexOperationType
}
}
if l.Pos > l.Start {
l.Emit(itemText)
}
l.Emit(lex.ItemEOF)
return nil
}
示例9: lexFragmentSpread
func lexFragmentSpread(l *lex.Lexer) lex.StateFn {
for {
r := l.Next()
if isNameSuffix(r) {
continue
}
l.Backup()
l.Emit(itemFragmentSpread)
break
}
return lexInside
}
示例10: lexArgName
// lexArgName lexes and emits the name part of an argument.
func lexArgName(l *lex.Lexer) lex.StateFn {
for {
r := l.Next()
if isNameSuffix(r) {
continue
}
l.Backup()
l.Emit(itemArgName)
break
}
return lexArgInside
}
示例11: lexNameMutation
// lexNameMutation lexes the itemMutationOp, which could be set or delete.
func lexNameMutation(l *lex.Lexer) lex.StateFn {
for {
// The caller already checked isNameBegin, and absorbed one rune.
r := l.Next()
if isNameBegin(r) {
continue
}
l.Backup()
l.Emit(itemMutationOp)
break
}
return lexInsideMutation
}
示例12: lexFilterFuncName
// lexFilterFuncName expects input to look like equal("...", "...").
func lexFilterFuncName(l *lex.Lexer) lex.StateFn {
for {
// The caller already checked isNameBegin, and absorbed one rune.
r := l.Next()
if isNameSuffix(r) {
continue
}
l.Backup()
l.Emit(itemFilterFunc)
break
}
return lexFilterFuncInside
}
示例13: lexAlias
func lexAlias(l *lex.Lexer) lex.StateFn {
l.AcceptRun(isSpace)
l.Ignore() // Any spaces encountered.
for {
r := l.Next()
if isNameSuffix(r) {
continue
}
l.Backup()
l.Emit(itemAlias)
break
}
return lexInside
}
示例14: lexOperationType
func lexOperationType(l *lex.Lexer) lex.StateFn {
for {
r := l.Next()
if isNameSuffix(r) {
continue // absorb
}
l.Backup()
word := l.Input[l.Start:l.Pos]
if word == "query" || word == "mutation" {
l.Emit(itemOpType)
}
break
}
return lexText
}
示例15: lexScalarBlock
func lexScalarBlock(l *lex.Lexer) lex.StateFn {
for {
switch r := l.Next(); {
case r == ')':
l.Emit(itemRightRound)
return lexText
case isNameBegin(r):
l.Backup()
return lexScalarPair1
case isSpace(r) || isEndOfLine(r):
l.Ignore()
default:
return l.Errorf("Invalid schema. Unexpected %s", l.Input[l.Start:l.Pos])
}
}
}