Implement tables

This commit is contained in:
Thomas Pelletier
2021-02-06 09:09:41 -05:00
parent 540c2a7b59
commit 165f65408d
+43 -2
View File
@@ -58,8 +58,7 @@ func parseExpression(b []byte) ([]byte, error) {
var err error var err error
if b[0] == '[' { if b[0] == '[' {
// TODO: parse 'table' b, err = parseTable(b)
panic("todo")
} else { } else {
b, err = parseKeyval(b) b, err = parseKeyval(b)
} }
@@ -77,6 +76,48 @@ func parseExpression(b []byte) ([]byte, error) {
return b, nil return b, nil
} }
func parseTable(b []byte) ([]byte, error) {
//table = std-table / array-table
if len(b) > 1 && b[1] == '[' {
return parseArrayTable(b)
}
return parseStdTable(b)
}
func parseArrayTable(b []byte) ([]byte, error) {
//array-table = array-table-open key array-table-close
//array-table-open = %x5B.5B ws ; [[ Double left square bracket
//array-table-close = ws %x5D.5D ; ]] Double right square bracket
b = b[2:]
b = parseWhitespace(b)
b, err := parseKey(b)
if err != nil {
return nil, err
}
b = parseWhitespace(b)
b, err = expect(']', b)
if err != nil {
return nil, err
}
return expect(']', b)
}
func parseStdTable(b []byte) ([]byte, error) {
//std-table = std-table-open key std-table-close
//std-table-open = %x5B ws ; [ Left square bracket
//std-table-close = ws %x5D ; ] Right square bracket
b = b[1:]
b = parseWhitespace(b)
b, err := parseKey(b)
if err != nil {
return nil, err
}
b = parseWhitespace(b)
return expect(']', b)
}
func parseKeyval(b []byte) ([]byte, error) { func parseKeyval(b []byte) ([]byte, error) {
//keyval = key keyval-sep val //keyval = key keyval-sep val