Fix numbers parsing
diff --git a/src/toml/lexer.go b/src/toml/lexer.go index 876817e..510adc8 100644 --- a/src/toml/lexer.go +++ b/src/toml/lexer.go
@@ -199,7 +199,7 @@ case '\n': l.ignore() l.pos += 1 - l.emit(tokenEOF) + /*l.emit(tokenEOF)*/ return lexVoid } @@ -270,6 +270,7 @@ } func lexKey(l *lexer) stateFn { + l.ignore() for isAlpha(l.next()) { } l.backup() @@ -363,12 +364,16 @@ next := l.next() if next == '.' { point_seen = true } else if isDigit(next) { digit_seen = true - } else { break } + } else { + l.backup() + break + } } if !digit_seen { return l.errorf("no digit in that number") } + fmt.Println("-->", l.input[l.pos:]) if point_seen { l.emit(tokenFloat) } else {
diff --git a/src/toml/lexer_test.go b/src/toml/lexer_test.go index 5a67038..dfb5fb4 100644 --- a/src/toml/lexer_test.go +++ b/src/toml/lexer_test.go
@@ -218,3 +218,15 @@ token{tokenEOF, ""}, }) } + +func TestMultiline(t *testing.T) { + testFlow(t, "foo = 42\nbar=21", []token{ + token{tokenKey, "foo"}, + token{tokenEqual, "="}, + token{tokenInteger, "42"}, + token{tokenKey, "bar"}, + token{tokenEqual, "="}, + token{tokenInteger, "21"}, + token{tokenEOF, ""}, + }) +}
diff --git a/src/toml/parser.go b/src/toml/parser.go index e4188a0..a700b91 100644 --- a/src/toml/parser.go +++ b/src/toml/parser.go
@@ -73,6 +73,8 @@ return parseGroup case tokenKey: return parseAssign + case tokenEOF: + return nil default: panic("unexpected token") } @@ -95,7 +97,12 @@ key := p.getToken() p.assume(tokenEqual) value := parseRvalue(p) - p.tree.Set(key.val, value) + final_key := key.val + if p.currentGroup != "" { + final_key = p.currentGroup + "." + key.val + } + fmt.Println("Setting k:", final_key, "val:", value) + p.tree.Set(final_key, value) return parseStart(p) }
diff --git a/src/toml/parser_test.go b/src/toml/parser_test.go index 00b86bc..acc9307 100644 --- a/src/toml/parser_test.go +++ b/src/toml/parser_test.go
@@ -12,7 +12,7 @@ } } -func testCreateSubTree(t *testing.T) { +func TestCreateSubTree(t *testing.T) { tree := make(TomlTree) tree.createSubTree("a.b.c") tree.Set("a.b.c", 42) @@ -22,25 +22,32 @@ } -func testSimpleKV(t *testing.T) { +func TestSimpleKV(t *testing.T) { tree := Load("a = 42") assertTree(t, tree, map[string]interface{}{ - "a": 42, + "a": int64(42), }) tree = Load("a = 42\nb = 21") assertTree(t, tree, map[string]interface{}{ - "a": 42, - "b": 21, + "a": int64(42), + "b": int64(21), }) } -func testSimpleIntegers(t *testing.T) { +func TestSimpleNumbers(t *testing.T) { tree := Load("a = +42\nb = -21\nc = +4.2\nd = -2.1") assertTree(t, tree, map[string]interface{}{ - "a": 42, - "b": -21, - "c": 4.2, - "d": -4.2, + "a": int64(42), + "b": int64(-21), + "c": float64(4.2), + "d": float64(-2.1), }) } + +/*func TestSimpleDate(t *testing.T) {*/ + /*tree := Load("a = 12")*/ + /*assertTree(t, tree, map[string]interface{}{*/ + /*"a": 42,*/ + /*})*/ +/*}*/
diff --git a/src/toml/toml.go b/src/toml/toml.go index 9c84455..137a9fe 100644 --- a/src/toml/toml.go +++ b/src/toml/toml.go
@@ -9,6 +9,17 @@ // This is the result of the parsing of a TOML file. type TomlTree map[string]interface{} +// Keys returns the keys of the toplevel tree. +// Warning: this is a costly operation. +func (t *TomlTree) Keys() []string { + keys := make([]string, 0) + mp := (map[string]interface{})(*t) + for k, _ := range mp { + keys = append(keys, k) + } + return keys +} + // Get an element from the tree. // If the path described by the key does not exist, nil is returned. func (t *TomlTree) Get(key string) interface{} { @@ -32,11 +43,12 @@ for _, intermediate_key := range keys[:len(keys)-1] { _, exists := (*subtree)[intermediate_key] if !exists { - (*subtree)[intermediate_key] = make(TomlTree) + var new_tree TomlTree = make(TomlTree) + (*subtree)[intermediate_key] = &new_tree } subtree = (*subtree)[intermediate_key].(*TomlTree) } - (*subtree)[keys[len(key) - 1]] = value + (*subtree)[keys[len(keys) - 1]] = value } // createSubTree takes a tree and a key andcreate the necessary intermediate @@ -49,9 +61,10 @@ for _, intermediate_key := range strings.Split(key, ".") { _, exists := (*subtree)[intermediate_key] if !exists { - (*subtree)[intermediate_key] = make(TomlTree) + var new_tree TomlTree = make(TomlTree) + (*subtree)[intermediate_key] = &new_tree } - subtree = (*subtree)[intermediate_key].(*TomlTree) + subtree = ((*subtree)[intermediate_key]).(*TomlTree) } }