Boolean values

This commit is contained in:
Thomas Pelletier
2021-02-01 19:19:40 -05:00
parent 1c7e9fe3af
commit fd961100c1
2 changed files with 104 additions and 9 deletions
+95
View File
@@ -25,6 +25,8 @@ type builder interface {
LiteralString(b []byte) LiteralString(b []byte)
BasicString(b []byte) BasicString(b []byte)
Dot(b []byte) Dot(b []byte)
Boolean(b []byte)
Equal(b []byte)
} }
type position struct { type position struct {
@@ -36,6 +38,16 @@ type documentBuilder struct {
document Document document Document
} }
func (d *documentBuilder) Equal(b []byte) {
s := string(b)
fmt.Printf("EQUAL: '%s'\n", s)
}
func (d *documentBuilder) Boolean(b []byte) {
s := string(b)
fmt.Printf("Boolean: '%s'\n", s)
}
func (d *documentBuilder) Dot(b []byte) { func (d *documentBuilder) Dot(b []byte) {
s := string(b) s := string(b)
fmt.Printf("DOT: '%s'\n", s) fmt.Printf("DOT: '%s'\n", s)
@@ -268,10 +280,93 @@ func (p *parser) parseExpression() error {
func (p *parser) parseKeyval() error { func (p *parser) parseKeyval() error {
// key keyval-sep val // key keyval-sep val
//keyval-sep = ws %x3D ws ; =
err := p.parseKey() err := p.parseKey()
if err != nil { if err != nil {
return err return err
} }
err = p.parseWhitespace()
if err != nil {
return err
}
err = p.expect('=')
if err != nil {
return err
}
p.builder.Equal(p.accept())
err = p.parseWhitespace()
if err != nil {
return err
}
return p.parseVal()
}
func (p *parser) parseVal() error {
//val = string / boolean / array / inline-table / date-time / float / integer
// string = ml-basic-string / basic-string / ml-literal-string / literal-string
r, err := p.peek()
if err != nil {
return err
}
switch r {
case 't', 'f':
return p.parseBool()
// TODO
default:
return &InvalidCharacter{r: r}
}
}
func (p *parser) parseBool() error {
r, err := p.peek()
if err != nil {
return err
}
if r == 't' {
p.sureNext()
err = p.expect('r')
if err != nil {
return err
}
err = p.expect('u')
if err != nil {
return err
}
err = p.expect('e')
if err != nil {
return err
}
} else if r == 'f' {
p.sureNext()
err = p.expect('a')
if err != nil {
return err
}
err = p.expect('l')
if err != nil {
return err
}
err = p.expect('s')
if err != nil {
return err
}
err = p.expect('e')
if err != nil {
return err
}
} else {
return &InvalidCharacter{r: r}
}
p.builder.Boolean(p.accept())
return nil return nil
} }
+9 -9
View File
@@ -15,15 +15,15 @@ func TestParse(t *testing.T) {
`#`, `#`,
"\n\n\n", "\n\n\n",
"#one\n # two \n", "#one\n # two \n",
`a`, `a = false`,
`abc`, `abc = false`,
` abc # foo`, ` abc = false # foo`,
`'abc'`, `'abc' = false`,
`"foo bar"`, `"foo bar" = false`,
`"hello\tworld"`, `"hello\tworld" = false`,
`"hello \u1234 foo"`, `"hello \u1234 foo" = false`,
`a.b.c`, `a.b.c = false`,
`a."b".c`, `a."b".c = true`,
} }
for i, data := range inputs { for i, data := range inputs {