Boolean values
This commit is contained in:
@@ -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
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user