Fixes #28 : Support of literal strings
diff --git a/lexer.go b/lexer.go index 7835116..cc4dc08 100644 --- a/lexer.go +++ b/lexer.go
@@ -169,6 +169,8 @@ return l.lexComment case '"': return l.lexString + case '\'': + return l.lexLiteralString case ',': return l.lexComma case '\n': @@ -279,6 +281,29 @@ return l.lexRvalue } +func (l *tomlLexer) lexLiteralString() tomlLexStateFn { + l.pos++ + l.ignore() + growingString := "" + + for { + if l.peek() == '\'' { + l.emitWithValue(tokenString, growingString) + l.pos++ + l.ignore() + return l.lexRvalue + } + + growingString += string(l.peek()) + + if l.next() == eof { + break + } + } + + return l.errorf("unclosed string") +} + func (l *tomlLexer) lexString() tomlLexStateFn { l.pos++ l.ignore()
diff --git a/lexer_test.go b/lexer_test.go index cc8fb47..2555a35 100644 --- a/lexer_test.go +++ b/lexer_test.go
@@ -460,6 +460,33 @@ }) } +func TestLiteralString(t *testing.T) { + testFlow(t, `foo = 'C:\Users\nodejs\templates'`, []token{ + token{Position{1, 1}, tokenKey, "foo"}, + token{Position{1, 5}, tokenEqual, "="}, + token{Position{1, 8}, tokenString, `C:\Users\nodejs\templates`}, + token{Position{1, 34}, tokenEOF, ""}, + }) + testFlow(t, `foo = '\\ServerX\admin$\system32\'`, []token{ + token{Position{1, 1}, tokenKey, "foo"}, + token{Position{1, 5}, tokenEqual, "="}, + token{Position{1, 8}, tokenString, `\\ServerX\admin$\system32\`}, + token{Position{1, 35}, tokenEOF, ""}, + }) + testFlow(t, `foo = 'Tom "Dubs" Preston-Werner'`, []token{ + token{Position{1, 1}, tokenKey, "foo"}, + token{Position{1, 5}, tokenEqual, "="}, + token{Position{1, 8}, tokenString, `Tom "Dubs" Preston-Werner`}, + token{Position{1, 34}, tokenEOF, ""}, + }) + testFlow(t, `foo = '<\i\c*\s*>'`, []token{ + token{Position{1, 1}, tokenKey, "foo"}, + token{Position{1, 5}, tokenEqual, "="}, + token{Position{1, 8}, tokenString, `<\i\c*\s*>`}, + token{Position{1, 19}, tokenEOF, ""}, + }) +} + func TestUnicodeString(t *testing.T) { testFlow(t, `foo = "hello ♥ world"`, []token{ token{Position{1, 1}, tokenKey, "foo"},