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)
BasicString(b []byte)
Dot(b []byte)
Boolean(b []byte)
Equal(b []byte)
}
type position struct {
@@ -36,6 +38,16 @@ type documentBuilder struct {
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) {
s := string(b)
fmt.Printf("DOT: '%s'\n", s)
@@ -268,10 +280,93 @@ func (p *parser) parseExpression() error {
func (p *parser) parseKeyval() error {
// key keyval-sep val
//keyval-sep = ws %x3D ws ; =
err := p.parseKey()
if err != nil {
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
}
+9 -9
View File
@@ -15,15 +15,15 @@ func TestParse(t *testing.T) {
`#`,
"\n\n\n",
"#one\n # two \n",
`a`,
`abc`,
` abc # foo`,
`'abc'`,
`"foo bar"`,
`"hello\tworld"`,
`"hello \u1234 foo"`,
`a.b.c`,
`a."b".c`,
`a = false`,
`abc = false`,
` abc = false # foo`,
`'abc' = false`,
`"foo bar" = false`,
`"hello\tworld" = false`,
`"hello \u1234 foo" = false`,
`a.b.c = false`,
`a."b".c = true`,
}
for i, data := range inputs {