[antlr-interest] packrat vs. LL(*)
Jim Idle
jimi at temporal-wave.com
Mon Jun 8 12:43:37 PDT 2009
Steven Obua wrote:
>
> On Jun 8, 2009, at 9:05 PM, Jim Idle wrote:
>
>> Steven Obua wrote:
>>> Hi,
>>>
>>> I am currently building a parser with ANTLR; I am really happy about
>>> this great tool!
>>>
>>> I found that the most convenient settings for my purposes are
>>>
>>> backtrack=true
>>> memoize=true
>>> k=1
>>>
>>> when leaving out the "k=1" option, antlr cannot process my grammar, it
>>> runs into a timeout or something like that.
>>>
>>
>> You need to use the extended option -X conversiontimeout 10000
>
> Does not work, I tried that before using 'k=1', it still does not
> terminate in reasonable time. I even give ANTLR at lot of RAM (12 GB),
> still doesn't cope.
>
Then I suggest that your grammar needs some serious work.,
>
>>>
>> Well, first of all, global backtracking should only be used if you don't
>> care about error messages or performance. It is sort of a "get the job
>> done" option that is useful for prototyping, proof of concept, or one
>> off conversion programs (where you know the input is valid, you just
>> want to change it to something else).
>>
>
> That is not true.
I assure you that it is.
> That is why I am referring to packrat parsing, which still guarantees
> linear time parsing.
And how are you guaranteeing linear time with global backtrack=true? All
this really means is that it tries every alt you specify n the order you
specify, which means that if your particular input is alt 12, it will
try 11 others first. Now, that isn't quite true because ANTLR is a bit
smarter than that, but it CAN be true. The parser time will be
predictable and provable, but will generally spend a lot of time doing
things it doesn't need to, and when there is a syntax error, it won't
have much of a clue why.
What I said still applies - if your task doesn't involve a parser that
will exist for 20 years, then who cares. If your task doesn't require
good error messages and you don't care about resources (though I think
you should if you will keep running the thing), then who cares.
But, if you turn on a timeout of 10000 and still cannot get through the
grammar, then you need to consider fixing up your grammar.
> You can't get better complexity for a parser :-)
I am not sure what you are trying to say here.
> About the constant factor slowdown I dont care so much, I just need to
> know that the speed I currently see from my parser scales.
Speed does not scale. Without more information, I can;t answer that
question. Do you mean, will the parser rip through a 500K file in
proportionate time to a 1K file, then that is one thing. If you mean
will it work on a system when there are 3000 processes doing it
simultaneously, then that is another (that probably doesn't involve Java
;-).
> About memory usage I dont care so much either, my application is using
> way more system resources after the parsing than the parser itself
> ever will.
Hmmmm.
Jim
More information about the antlr-interest
mailing list