diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-05 13:43:57 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-05 13:43:57 +0200 |
commit | c9dc7f17a33c87cb671f5313931438643ae6e4e0 (patch) | |
tree | 8627a7cbfc2b0279765b4f55ec63d51fd1591449 | |
parent | ee2e07ea567b6eb66399389c88d73e2e1926298f (diff) |
Fix invalid top-level declaration errors causing a deadlock
-rw-r--r-- | cer.go | 9 | ||||
-rw-r--r-- | parse.go | 16 |
2 files changed, 17 insertions, 8 deletions
@@ -14,7 +14,7 @@ import ( ) func main() { - errs := make(chan error, 1024) + errs := make(chan error, 1) toks := make(chan token, 1024) go lex(os.Stdin, toks, errs) @@ -23,7 +23,7 @@ func main() { // fmt.Println(token) // } - root := make(chan *rootExpr, 1) + root := make(chan *rootExpr) go parse(&tokens{ src: toks, toks: make([]token, 0, len(toks)), @@ -31,7 +31,10 @@ func main() { // fmt.Printf("%+v\n", <-expr) - go generate(<-root, os.Stdout, errs) + ast, ok := <-root + if ok { + go generate(ast, os.Stdout, errs) + } err := <-errs if err != nil { @@ -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) { |