aboutsummaryrefslogtreecommitdiff
path: root/parse.go
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-09-05 13:43:57 +0200
committerHimbeer <himbeer@disroot.org>2024-09-05 13:43:57 +0200
commitc9dc7f17a33c87cb671f5313931438643ae6e4e0 (patch)
tree8627a7cbfc2b0279765b4f55ec63d51fd1591449 /parse.go
parentee2e07ea567b6eb66399389c88d73e2e1926298f (diff)
Fix invalid top-level declaration errors causing a deadlock
Diffstat (limited to 'parse.go')
-rw-r--r--parse.go16
1 files changed, 11 insertions, 5 deletions
diff --git a/parse.go b/parse.go
index b204468..8ac4c5d 100644
--- a/parse.go
+++ b/parse.go
@@ -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) {