diff options
Diffstat (limited to 'parse.go')
-rw-r--r-- | parse.go | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -65,16 +65,22 @@ func (t *tokens) mustMatch(kind tokenKind) error { } func parse(toks *tokens, root chan<- *rootExpr, errs chan<- error) { - root <- parseRoot(toks, errs) + defer close(root) + + expr, err := parseRoot(toks, errs) + if err != nil { + errs <- err + } else { + root <- expr + } } -func parseRoot(toks *tokens, errs chan<- error) *rootExpr { +func parseRoot(toks *tokens, errs chan<- error) (*rootExpr, error) { toplevels := make([]expression, 0) for !toks.eof() { toplevel, err := parseToplevel(toks) if err != nil { - errs <- err - continue + return nil, err } if toplevel != nil { @@ -84,7 +90,7 @@ func parseRoot(toks *tokens, errs chan<- error) *rootExpr { return &rootExpr{ toplevels: toplevels, - } + }, nil } func parseToplevel(toks *tokens) (expression, error) { |