feat: tokenizer accepts braces, line terminator, and equal sign
This commit is contained in:
@@ -28,6 +28,19 @@ func parseRune(i *iterator.Iterator[rune], expected func(rune) bool) (rune, erro
|
||||
}
|
||||
}
|
||||
|
||||
func parseCharacter(i *iterator.Iterator[rune], expected rune) (rune, error) {
|
||||
i2 := i.Copy()
|
||||
|
||||
if r, err := i2.Next(); err != nil {
|
||||
return r, err
|
||||
} else if r != expected {
|
||||
return r, fmt.Errorf("got unexpected rune %v'", r)
|
||||
} else {
|
||||
i.Sync(i2)
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
|
||||
// Pulls the next token from an iterator over runes. If it cannot, it will
|
||||
// return nil. If an error occurs, it will return that.
|
||||
func getToken(i *iterator.Iterator[rune]) (*token.Token, error) {
|
||||
@@ -53,6 +66,18 @@ func getToken(i *iterator.Iterator[rune]) (*token.Token, error) {
|
||||
return token.NewSlash(index), nil
|
||||
case letter == '\n':
|
||||
return token.NewNewline(index), nil
|
||||
case letter == '{':
|
||||
return token.NewNewline(index), nil
|
||||
case letter == '}':
|
||||
return token.NewNewline(index), nil
|
||||
case letter == ':':
|
||||
if _, err := parseCharacter(i, '='); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return token.NewAssign(index), nil
|
||||
}
|
||||
case letter == ';':
|
||||
return token.NewEnd(index), nil
|
||||
case unicode.IsSpace(letter):
|
||||
return nil, nil
|
||||
case isVariable(letter):
|
||||
|
||||
Reference in New Issue
Block a user