Parse rvalue string
This commit is contained in:
@@ -110,11 +110,24 @@ type parser struct {
|
|||||||
lookahead lookahead
|
lookahead lookahead
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) peek() rune {
|
func (p *parser) at(i int) rune {
|
||||||
if p.end >= len(p.data) {
|
if p.end+i >= len(p.data) {
|
||||||
return eof
|
return eof
|
||||||
}
|
}
|
||||||
return rune(p.data[p.end])
|
return rune(p.data[p.end+i])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) follows(s string) bool {
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if rune(s[i]) != p.at(i) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) peek() rune {
|
||||||
|
return p.at(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *parser) next() rune {
|
func (p *parser) next() rune {
|
||||||
@@ -310,11 +323,34 @@ func (p *parser) parseVal() error {
|
|||||||
switch r {
|
switch r {
|
||||||
case 't', 'f':
|
case 't', 'f':
|
||||||
return p.parseBool()
|
return p.parseBool()
|
||||||
|
case '\'', '"':
|
||||||
|
return p.parseString()
|
||||||
// TODO
|
// TODO
|
||||||
default:
|
default:
|
||||||
return &InvalidCharacter{r: r}
|
return &InvalidCharacter{r: r}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (p *parser) parseString() error {
|
||||||
|
r := p.peek()
|
||||||
|
|
||||||
|
if r == '\'' {
|
||||||
|
if p.follows("'''") {
|
||||||
|
// TODO ml-literal-string
|
||||||
|
panic("TODO")
|
||||||
|
} else {
|
||||||
|
return p.parseLiteralString()
|
||||||
|
}
|
||||||
|
} else if r == '"' {
|
||||||
|
if p.follows("\"\"\"") {
|
||||||
|
// TODO ml-basic-string
|
||||||
|
panic("TODO")
|
||||||
|
} else {
|
||||||
|
return p.parseBasicString()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
panic("string should start with ' or \"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (p *parser) parseBool() error {
|
func (p *parser) parseBool() error {
|
||||||
r := p.peek()
|
r := p.peek()
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ var inputs = []string{
|
|||||||
`"hello \u1234 foo" = false`,
|
`"hello \u1234 foo" = false`,
|
||||||
`a.b.c = false`,
|
`a.b.c = false`,
|
||||||
`a."b".c = true`,
|
`a."b".c = true`,
|
||||||
|
`a = "foo"`,
|
||||||
|
`b = 'sample thingy'`,
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParse(t *testing.T) {
|
func TestParse(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user