Hi.

Great work on the parser. It's looking smashing.

You get hanging when you have a rule that can execute without consuming
anything.

I find that naming any rule that can possibly consume nothing with a "?" at
then end of the rule name makes it easier to statically analyse the rules
in turn to find the problem.

I have seen people monkey patch the parser to get a trace of the parse as
it runs.. so you can see where your grammar gets stuck.
That sounds like it might help.



---
"No man is an island... except Philip"


On Tue, Jun 3, 2014 at 4:59 PM, Torsten Ruger <[email protected]> wrote:

> So,
>
> I am adding features to my parser at an amazing rate, 250+ tests
> already. It's so easy that i catch myself thinking i am cheating.
> The other day i added qualified function calls in like 10 minutes or so.
> _Great_
>
> But now i have hit this "hanging" issue and am not sure how to even
> debug. Generally speaking, sometimes when i make a small typing mistake,
> instead of getting an error from parslet i get silence. No matter how
> long i let it run, when i interrupt, it's always about the same
> stack-trace (below):
>
> I put a test case for this up :
>
> https://github.com/ruby-in-ruby/crystal/blob/master/test/parser/test_fails.rb
> If you look, it defines a function in a class, and generally speaking
> that works.
> But the case has no brackets on the function, as is legal in ruby. But I
> haven't implemented that, so in my parser it's not legal.
> Iif i add () after the function it works.
>
> The function is defined here:
> https://github.com/ruby-in-ruby/crystal/blob/master/lib/parser/call_site.rb
> but i that alone can't be the problem, because outside a class
> definition i do get the error, not the hang.
>
> So, as i said, any clues to how i can debug that kind of thing ?
>
> Torsten
>
>
>
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/source.rb:84:in
> `bytepos=': Interrupt
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:46:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/repetition.rb:35:in
> `block in try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/repetition.rb:34:in
> `loop'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/repetition.rb:34:in
> `try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:31:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/named.rb:17:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/sequence.rb:29:in
> `block in try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/sequence.rb:27:in
> `each'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/sequence.rb:27:in
> `each_with_index'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/sequence.rb:27:in
> `try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:31:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/entity.rb:21:in
> `try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:31:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/alternative.rb:35:in
> `block in try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/alternative.rb:34:in
> `map'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/alternative.rb:34:in
> `try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:31:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/repetition.rb:35:in
> `block in try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/repetition.rb:34:in
> `loop'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/repetition.rb:34:in
> `try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:31:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/entity.rb:21:in
> `try'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/context.rb:31:in
> `try_with_cache'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:83:in
> `apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:70:in
> `setup_and_apply'
>      from
>
> /Users/raisa/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/parslet-1.6.1/lib/parslet/atoms/base.rb:30:in
> `parse'
>
>

Reply via email to