Fix parsing bugs + boolean impl

This commit is contained in:
Thomas Pelletier
2021-02-06 08:54:40 -05:00
parent a466f0ca79
commit 540c2a7b59
3 changed files with 68 additions and 36 deletions
+24 -11
View File
@@ -51,12 +51,20 @@ func parseExpression(b []byte) ([]byte, error) {
_, rest, err := scanComment(b)
return rest, err
}
if b[0] == '\n' || b[0] == '\r' {
_, rest, err := scanNewline(b)
return rest, err
}
var err error
if b[0] == '[' {
// TODO: parse 'table'
panic("todo")
} else {
rest, err := parseKeyval(b)
return rest, err
b, err = parseKeyval(b)
}
if err != nil {
return nil, err
}
b = parseWhitespace(b)
@@ -107,11 +115,20 @@ func parseVal(b []byte) ([]byte, error) {
case '\'':
if scanFollowsMultilineLiteralStringDelimiter(b) {
_, b, err = parseMultilineLiteralString(b)
} else {
_, b, err = scanLiteralString(b)
}
_, b, err = scanLiteralString(b)
return b, err
// TODO boolean
case 't':
if !scanFollowsTrue(b) {
return nil, fmt.Errorf("expected 'true'")
}
return b[4:], nil
case 'f':
if !scanFollowsFalse(b) {
return nil, fmt.Errorf("expected 'false'")
}
return b[5:], nil
// TODO array
// TODO inline-table
@@ -247,8 +264,8 @@ func parseKey(b []byte) ([]byte, error) {
}
for {
if len(b) > 0 && (b[0] == '.' || isWhitespace(b[0])) {
b = parseWhitespace(b)
b = parseWhitespace(b)
if len(b) > 0 && b[0] == '.' {
b, err = expect('.', b)
if err != nil {
return nil, err
@@ -266,10 +283,6 @@ func parseKey(b []byte) ([]byte, error) {
return b, nil
}
func isWhitespace(b byte) bool {
return b == ' ' || b == '\t'
}
func parseSimpleKey(b []byte) ([]byte, error) {
//simple-key = quoted-key / unquoted-key
//unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _