Source File
lexer.go
Belonging Package
github.com/kevinburke/ssh_config
package ssh_config
import (
)
type sshLexStateFn func() sshLexStateFn
type sshLexer struct {
inputIdx int
input []rune // Textual source
buffer []rune // Runes composing the current token
tokens chan token
line int
col int
endbufferLine int
endbufferCol int
}
func ( *sshLexer) ( sshLexStateFn) sshLexStateFn {
return func() sshLexStateFn {
:= ""
for := .peek(); != '\n' && != eof; = .peek() {
if == '\r' && .follow("\r\n") {
break
}
+= string()
.next()
}
.emitWithValue(tokenComment, )
.skip()
return
}
}
func ( *sshLexer) () sshLexStateFn {
for {
:= .peek()
if !isSpace() {
break
}
.skip()
}
return .lexRvalue
}
func ( *sshLexer) () sshLexStateFn {
for {
:= .peek()
if == '=' {
.emit(tokenEquals)
.skip()
return .lexRspace
if !isSpace() {
break
}
.skip()
}
return .lexRvalue
}
func ( *sshLexer) () sshLexStateFn {
:= ""
if isSpace() || == '=' {
.emitWithValue(tokenKey, )
.skip()
return .lexEquals
}
+= string()
.next()
}
.emitWithValue(tokenKey, )
return .lexEquals
}
func ( *sshLexer) () sshLexStateFn {
:= ""
for {
:= .peek()
switch {
case '\r':
if .follow("\r\n") {
.emitWithValue(tokenString, )
.skip()
return .lexVoid
}
case '\n':
.emitWithValue(tokenString, )
.skip()
return .lexVoid
case '#':
.emitWithValue(tokenString, )
.skip()
return .lexComment(.lexVoid)
case eof:
.next()
}
if == eof {
break
}
+= string()
.next()
}
.emit(tokenEOF)
return nil
}
func ( *sshLexer) () rune {
:= .peek()
if == '\n' {
.endbufferLine++
.endbufferCol = 1
} else {
.endbufferCol++
}
.inputIdx++
return
}
func ( *sshLexer) () rune {
:= .read()
if != eof {
.buffer = append(.buffer, )
}
return
}
func ( *sshLexer) () sshLexStateFn {
for {
:= .peek()
switch {
case '#':
.skip()
return .lexComment(.)
case '\r':
fallthrough
case '\n':
.emit(tokenEmptyLine)
.skip()
continue
}
if isSpace() {
.skip()
}
if isKeyStartChar() {
return .lexKey
}
if == eof {
.next()
break
}
}
.emit(tokenEOF)
return nil
}
func ( *sshLexer) () {
.buffer = make([]rune, 0)
.line = .endbufferLine
.col = .endbufferCol
}
func ( *sshLexer) () {
.next()
.ignore()
}
func ( *sshLexer) ( tokenType) {
.emitWithValue(, string(.buffer))
}
func ( *sshLexer) ( tokenType, string) {
:= token{
Position: Position{.line, .col},
typ: ,
val: ,
}
.tokens <-
.ignore()
}
func ( *sshLexer) () rune {
if .inputIdx >= len(.input) {
return eof
}
:= .input[.inputIdx]
return
}
func ( *sshLexer) ( string) bool {
:= .inputIdx
for , := range {
if >= len(.input) {
return false
}
:= .input[]
++
if != {
return false
}
}
return true
}
func ( *sshLexer) () {
for := .lexVoid; != nil; {
= ()
}
close(.tokens)
}
func ( []byte) chan token {
:= bytes.Runes()
:= &sshLexer{
input: ,
tokens: make(chan token),
line: 1,
col: 1,
endbufferLine: 1,
endbufferCol: 1,
}
go .run()
return .tokens
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |