diff --git a/conf/lex.go b/conf/lex.go index 847cede4..6290826f 100644 --- a/conf/lex.go +++ b/conf/lex.go @@ -25,6 +25,7 @@ const ( itemError itemType = iota itemNIL // used in the parser to indicate no type itemEOF + itemKey itemText itemString itemBool @@ -35,7 +36,6 @@ const ( itemArrayEnd itemMapStart itemMapEnd - itemKeyStart itemCommentStart ) @@ -261,7 +261,6 @@ func lexKeyStart(lx *lexer) stateFn { return lexSkip(lx, lexKeyStart) } lx.ignore() - lx.emit(itemKeyStart) lx.next() return lexKey } @@ -271,7 +270,7 @@ func lexKeyStart(lx *lexer) stateFn { func lexKey(lx *lexer) stateFn { r := lx.peek() if isWhitespace(r) || isNL(r) || isKeySeparator(r) { - lx.emit(itemText) + lx.emit(itemKey) return lexKeyEnd } lx.next() @@ -397,8 +396,6 @@ func lexArrayEnd(lx *lexer) stateFn { return lx.pop() } -// ======================= - // lexMapKeyStart consumes a key name up until the first non-whitespace character. // lexMapKeyStart will ignore whitespace. func lexMapKeyStart(lx *lexer) stateFn { @@ -414,7 +411,6 @@ func lexMapKeyStart(lx *lexer) stateFn { return lexSkip(lx, lexMapEnd) } lx.ignore() - lx.emit(itemKeyStart) lx.next() return lexMapKey } @@ -424,7 +420,7 @@ func lexMapKeyStart(lx *lexer) stateFn { func lexMapKey(lx *lexer) stateFn { r := lx.peek() if isWhitespace(r) || isNL(r) || isKeySeparator(r) { - lx.emit(itemText) + lx.emit(itemKey) return lexMapKeyEnd } lx.next() @@ -795,8 +791,8 @@ func (itype itemType) String() string { return "Float" case itemDatetime: return "DateTime" - case itemKeyStart: - return "KeyStart" + case itemKey: + return "Key" case itemArrayStart: return "ArrayStart" case itemArrayEnd: diff --git a/conf/lex_test.go b/conf/lex_test.go index 379d56b3..ad1b4701 100644 --- a/conf/lex_test.go +++ b/conf/lex_test.go @@ -14,15 +14,15 @@ func expect(t *testing.T, lx *lexer, items []item) { t.Fatal(item.val) } if item != items[i] { - t.Fatalf("Testing: '%s'\nExpected %+v, received %+v\n", lx.input, items[i], item) + t.Fatalf("Testing: '%s'\nExpected %+v, received %+v\n", + lx.input, items[i], item) } } } func TestSimpleKeyStringValues(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemString, "bar", 1}, {itemEOF, "", 1}, } @@ -42,8 +42,7 @@ func TestSimpleKeyStringValues(t *testing.T) { func TestSimpleKeyIntegerValues(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemInteger, "123", 1}, {itemEOF, "", 1}, } @@ -57,8 +56,7 @@ func TestSimpleKeyIntegerValues(t *testing.T) { func TestSimpleKeyFloatValues(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemFloat, "22.2", 1}, {itemEOF, "", 1}, } @@ -72,8 +70,7 @@ func TestSimpleKeyFloatValues(t *testing.T) { func TestSimpleKeyBoolValues(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemBool, "true", 1}, {itemEOF, "", 1}, } @@ -101,8 +98,7 @@ func TestComments(t *testing.T) { func TestArrays(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemArrayStart, "", 1}, {itemInteger, "1", 1}, {itemInteger, "2", 1}, @@ -133,8 +129,7 @@ func TestMultilineArrays(t *testing.T) { expectedItems := []item{ {itemCommentStart, "", 2}, {itemText, " top level comment", 2}, - {itemKeyStart, "", 3}, - {itemText, "foo", 3}, + {itemKey, "foo", 3}, {itemArrayStart, "", 3}, {itemInteger, "1", 4}, {itemCommentStart, "", 4}, @@ -168,8 +163,7 @@ func TestMultilineArraysNoSep(t *testing.T) { expectedItems := []item{ {itemCommentStart, "", 2}, {itemText, " top level comment", 2}, - {itemKeyStart, "", 3}, - {itemText, "foo", 3}, + {itemKey, "foo", 3}, {itemArrayStart, "", 3}, {itemInteger, "1", 4}, {itemInteger, "2", 5}, @@ -185,14 +179,11 @@ func TestMultilineArraysNoSep(t *testing.T) { func TestSimpleMap(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemMapStart, "", 1}, - {itemKeyStart, "", 1}, - {itemText, "ip", 1}, + {itemKey, "ip", 1}, {itemString, "127.0.0.1", 1}, - {itemKeyStart, "", 1}, - {itemText, "port", 1}, + {itemKey, "port", 1}, {itemInteger, "4242", 1}, {itemMapEnd, "", 1}, {itemEOF, "", 1}, @@ -211,14 +202,11 @@ foo = { func TestMultilineMap(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 2}, - {itemText, "foo", 2}, + {itemKey, "foo", 2}, {itemMapStart, "", 2}, - {itemKeyStart, "", 3}, - {itemText, "ip", 3}, + {itemKey, "ip", 3}, {itemString, "127.0.0.1", 3}, - {itemKeyStart, "", 4}, - {itemText, "port", 4}, + {itemKey, "port", 4}, {itemInteger, "4242", 4}, {itemMapEnd, "", 5}, {itemEOF, "", 5}, @@ -239,17 +227,13 @@ foo = { func TestNestedMaps(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 2}, - {itemText, "foo", 2}, + {itemKey, "foo", 2}, {itemMapStart, "", 2}, - {itemKeyStart, "", 3}, - {itemText, "host", 3}, + {itemKey, "host", 3}, {itemMapStart, "", 3}, - {itemKeyStart, "", 4}, - {itemText, "ip", 4}, + {itemKey, "ip", 4}, {itemString, "127.0.0.1", 4}, - {itemKeyStart, "", 5}, - {itemText, "port", 5}, + {itemKey, "port", 5}, {itemInteger, "4242", 5}, {itemMapEnd, "", 6}, {itemMapEnd, "", 7}, @@ -262,8 +246,7 @@ func TestNestedMaps(t *testing.T) { func TestColonKeySep(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemInteger, "123", 1}, {itemEOF, "", 1}, } @@ -279,8 +262,7 @@ func TestColonKeySep(t *testing.T) { func TestWhitespaceKeySep(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 1}, - {itemText, "foo", 1}, + {itemKey, "foo", 1}, {itemInteger, "123", 1}, {itemEOF, "", 1}, } @@ -305,17 +287,13 @@ foo { func TestNestedWhitespaceMaps(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 2}, - {itemText, "foo", 2}, + {itemKey, "foo", 2}, {itemMapStart, "", 2}, - {itemKeyStart, "", 3}, - {itemText, "host", 3}, + {itemKey, "host", 3}, {itemMapStart, "", 3}, - {itemKeyStart, "", 4}, - {itemText, "ip", 4}, + {itemKey, "ip", 4}, {itemString, "127.0.0.1", 4}, - {itemKeyStart, "", 5}, - {itemText, "port", 5}, + {itemKey, "port", 5}, {itemInteger, "4242", 5}, {itemMapEnd, "", 6}, {itemMapEnd, "", 7}, @@ -336,20 +314,15 @@ map { ` func TestOptionalSemicolons(t *testing.T) { expectedItems := []item{ - {itemKeyStart, "", 2}, - {itemText, "foo", 2}, + {itemKey, "foo", 2}, {itemInteger, "123", 2}, - {itemKeyStart, "", 3}, - {itemText, "bar", 3}, + {itemKey, "bar", 3}, {itemString, "baz", 3}, - {itemKeyStart, "", 4}, - {itemText, "baz", 4}, + {itemKey, "baz", 4}, {itemString, "boo", 4}, - {itemKeyStart, "", 5}, - {itemText, "map", 5}, + {itemKey, "map", 5}, {itemMapStart, "", 5}, - {itemKeyStart, "", 6}, - {itemText, "id", 6}, + {itemKey, "id", 6}, {itemInteger, "1", 6}, {itemMapEnd, "", 7}, {itemEOF, "", 5},