Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

many-till quickly hits stack overflow #22

Open
jpe90 opened this issue Sep 14, 2021 · 1 comment
Open

many-till quickly hits stack overflow #22

jpe90 opened this issue Sep 14, 2021 · 1 comment

Comments

@jpe90
Copy link

jpe90 commented Sep 14, 2021

I'm hitting stack overflows while using many-till on non-small inputs. The parsers I'm working on are:

(def between-brackets (between (sym* \{) (sym* \}) (many (none-of* "}"))))
(def parse-enclosed-words (many-till (<|> between-brackets (skip any-char)) (token* "END")))

I'm trying to grab a list of all the words enclosed in brackets up until the input contains the string END. On small inputs it works once I filter out nils from the resulting vector, but many-till fails pretty quickly on larger inputs such as https://gist.github.com/jpe90/05c2af77c54de5d5dc1ae3e19bdc03d1.

If I'm doing anything dumb please let me know, I'm brand new to clojure. As a workaround I tried writing a recursive parser that parses character by character and acts based on whether it's looking at a "between brackets" or a terminal sequence, but I ran into situations where I would be writing logic into the tail position, which seems to conflict with the "recur" keyword and I wasn't sure how to proceed.

P.S. thanks for the library, this is so cool!!

@serioga
Copy link

serioga commented Sep 9, 2022

Hi @jpe90

I cannot reproduce this:

(:ok (p/parse (p/many-till (p/<|> (p/between (p/sym* \{) (p/sym* \}) (p/many (p/none-of* "}")))
                                  (p/skip p/any-char)) (p/token* "END"))
              "aaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaa{cat}aaaaaaaaaaaaaaaaaa{dog}aaaaaaaaaaaaaaaaaaaaaaaaaaa{barn}aaaaaaaaaaaaaaaaaaaaaENDaaaaaaaaa{noshow}"))

=> true

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants