summaryrefslogtreecommitdiff
path: root/conf/scanner.go
diff options
context:
space:
mode:
Diffstat (limited to 'conf/scanner.go')
-rw-r--r--conf/scanner.go49
1 files changed, 41 insertions, 8 deletions
diff --git a/conf/scanner.go b/conf/scanner.go
index 54546aa..975a8e4 100644
--- a/conf/scanner.go
+++ b/conf/scanner.go
@@ -14,15 +14,19 @@ type tokentype int
const (
Name tokentype = iota
Literal
- DeliOpen
- DeliClose
+ ListOpen
+ ListClose
+ ObjectOpen
+ ObjectClose
+ EmptyList
+ EmptyObject
Nothing
IfStatement
)
var tokentypestrings []string = []string{Name: "Name", Literal: "Literal",
- DeliOpen: "Opening delimiter", DeliClose: "Closing delimiter",
- Nothing: "Nothing", IfStatement: "If statement"}
+ ListOpen: "List Open", ListClose: "List Close", ObjectOpen: "Object Open",
+ ObjectClose: "Object Close", Nothing: "Nothing", IfStatement: "If statement"}
func (tt tokentype) String() string {
return tokentypestrings[tt]
@@ -39,6 +43,8 @@ type scanner struct {
data []byte
offset int
curline int
+
+ peeked *token
}
func newScanner(r io.Reader) *scanner {
@@ -58,18 +64,36 @@ func newScanner(r io.Reader) *scanner {
}
func getTokenType(s []byte) tokentype {
- return Nothing
+ switch s[0] {
+ case '"', '\'':
+ return Literal
+ case '[':
+ return ListOpen
+ case ']':
+ return ListClose
+ case '{':
+ return ObjectOpen
+ case '}':
+ return ObjectClose
+ }
+
+ return Name
}
func (s *scanner) Scan() (token, error) {
processed := 0
tokenstarted := false
oldline := s.curline
+ if s.peeked != nil {
+ ret := *s.peeked
+ s.peeked = nil
+ return ret, nil
+ }
for {
r, rlen := utf8.DecodeRune(s.data[s.offset+processed:])
if r == utf8.RuneError {
if rlen == 1 {
- return token{}, fmt.Errorf("found invalid UTF8 at offset %d, before: %s", s.offset, s.data[s.offset])
+ return token{}, fmt.Errorf("found invalid UTF8 at offset %d, before: %s", s.offset, string(s.data[s.offset]))
} else if rlen == 0 {
return token{}, io.EOF
}
@@ -105,6 +129,15 @@ func (s *scanner) Scan() (token, error) {
return ret, nil
}
-func (s *scanner) peek() (tokentype, string, error) {
- return Nothing, "", nil
+func (s *scanner) Peek() (token, error) {
+ if s.peeked != nil {
+ return *s.peeked, nil
+ }
+
+ tok, err := s.Scan()
+ if err != nil {
+ return token{}, err
+ }
+ s.peeked = &tok
+ return tok, nil
}