diff --git a/node.go b/node.go index f6d9b4f..81d5c9f 100644 --- a/node.go +++ b/node.go @@ -284,17 +284,24 @@ func (n *numberNode) Type() nodeType { func (n *numberNode) parse(p *parser) error { t := p.next() - if t.t != t_real_number { - return fmt.Errorf("unexpected %s token while parsing number", t.t) - } - - if p.peek().t == t_imaginary_number { + switch t.t { + case t_real_number: + if p.peek().t == t_imaginary_number { + n.t = num_complex + s := t.s + p.next().s + if _, err := fmt.Sscan(s, &n.c); err != nil { + return fmt.Errorf("ungood imaginary number format %s: %s", s, err) + } + return nil + } + case t_imaginary_number: n.t = num_complex - s := t.s + p.next().s - if _, err := fmt.Sscan(s, &n.c); err != nil { - return fmt.Errorf("ungood imaginary number format %s: %s", s, err) + if _, err := fmt.Sscan("0+"+t.s, &n.c); err != nil { + return fmt.Errorf("ungood imaginary number format %s: %s", t.s, err) } return nil + default: + return fmt.Errorf("unexpected %s token while parsing number", t.t) } i, err := strconv.ParseInt(t.s, 0, 64) diff --git a/parse.go b/parse.go index 960c7ee..11895aa 100644 --- a/parse.go +++ b/parse.go @@ -11,13 +11,14 @@ import ( const () var nodes = map[tokenType]func(p *parser) node{ - t_string: func(p *parser) node { return new(stringNode) }, - t_real_number: func(p *parser) node { return new(numberNode) }, - t_list_start: func(p *parser) node { p.next(); return &listNode{} }, - t_object_start: func(p *parser) node { p.next(); return &objectNode{} }, - t_variable: func(p *parser) node { return new(variableNode) }, - t_bool: func(p *parser) node { return new(boolNode) }, - t_duration: func(p *parser) node { return new(durationNode) }, + t_string: func(p *parser) node { return new(stringNode) }, + t_real_number: func(p *parser) node { return new(numberNode) }, + t_imaginary_number: func(p *parser) node { return new(numberNode) }, + t_list_start: func(p *parser) node { p.next(); return &listNode{} }, + t_object_start: func(p *parser) node { p.next(); return &objectNode{} }, + t_variable: func(p *parser) node { return new(variableNode) }, + t_bool: func(p *parser) node { return new(boolNode) }, + t_duration: func(p *parser) node { return new(durationNode) }, } var DefaultPath = "./config.moon"