Fixes #28 : Support of literal strings
This commit is contained in:
@@ -169,6 +169,8 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn {
|
|||||||
return l.lexComment
|
return l.lexComment
|
||||||
case '"':
|
case '"':
|
||||||
return l.lexString
|
return l.lexString
|
||||||
|
case '\'':
|
||||||
|
return l.lexLiteralString
|
||||||
case ',':
|
case ',':
|
||||||
return l.lexComma
|
return l.lexComma
|
||||||
case '\n':
|
case '\n':
|
||||||
@@ -279,6 +281,29 @@ func (l *tomlLexer) lexLeftBracket() tomlLexStateFn {
|
|||||||
return l.lexRvalue
|
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 {
|
func (l *tomlLexer) lexString() tomlLexStateFn {
|
||||||
l.pos++
|
l.pos++
|
||||||
l.ignore()
|
l.ignore()
|
||||||
|
|||||||
@@ -460,6 +460,33 @@ func TestKeyEqualStringUnicodeEscape(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
func TestUnicodeString(t *testing.T) {
|
||||||
testFlow(t, `foo = "hello ♥ world"`, []token{
|
testFlow(t, `foo = "hello ♥ world"`, []token{
|
||||||
token{Position{1, 1}, tokenKey, "foo"},
|
token{Position{1, 1}, tokenKey, "foo"},
|
||||||
|
|||||||
Reference in New Issue
Block a user