aboutsummaryrefslogtreecommitdiff
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
parentee2e07ea567b6eb66399389c88d73e2e1926298f (diff)
Fix invalid top-level declaration errors causing a deadlock
-rw-r--r--cer.go9
-rw-r--r--parse.go16
2 files changed, 17 insertions, 8 deletions
diff --git a/cer.go b/cer.go
index 2bc4d61..310f2d0 100644
--- a/cer.go
+++ b/cer.go
@@ -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 {
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) {