[antlr-interest] Serious doubts on usage of incremental parsinginides

Jean Bovet antlr-list at arizona-software.ch
Mon Apr 25 14:31:17 PDT 2005


Hi,

I have been reading your last e-mails with great interest because I 
have similar problems in ANTLRWorks. I would like to share my comments 
about that and if you have any suggestions or comments, I would be 
delighted to read them!

Currently, I have to update the following things at each keystroke:

1) background parser (thread A)
2) syntax coloring (thread B)
3) list of all rules/tokens (thread C)
4) syntax diagram/NFA (thread D)
5) gutter information (thread E)

There is not as many elements as Prashant is talking about, but this is 
enough to slow down the editor depending on how you implement that. I 
am currently using the following methods which doesn't slow the editor 
(except when the syntax diagram is displayed - see my comments below) 
while trying to keep everything in sync as fast as possible:

1) At each keystroke, I awake my parsing thread (thread A) and, if the 
user doesn't press any key before a certain amount of time (let says a 
threshold of 100 ms), thread A runs. If the user presses a key before 
this threshold, thread A is put back to sleep again. Because the parser 
in thread A is running fast (full parsing, not incremental), the user 
won't notice any slow down.

2) When the parsing thread A is done, it notifies the other threads (B, 
C, D and E) so they starts to work. Again, if the user presses a key 
before a certain threshold in time, threads B, C, D and E are 
cancelled. If the user pauses long enough (let say more than 500 ms), 
threads B, C, D and E will have time to complete there work and the 
window will be updated.

3) On thread B (syntax coloring), I have the following problem: I need 
to lock the editor while the colorization is being made because 
otherwise the user can insert/delete a character and the color will not 
be applied at the right place. I currently cache the previous tokens 
list so when the new tokens list is available, I only colorize the 
modified tokens (using a fast diff comparaison). This is fast enough so 
the user doesn't notice anything. But this is maybe not the best 
solution - any idea ?

4) As Prashant wrote, the only time I notice a slowdown is when Swing 
updates the syntax diagram view. Because it is doing that in the events 
thread, if the display is taking too much time, the text zone will be 
"frozen" for a few ms and the user will notice that. I didn't find a 
nice way to solve that (is Swing able to update a view in another 
thread than the event thread?): I am currently caching the syntax 
diagram in a image (in thread C) so when Swing updates the view, only 
the image has to be drawn (and this is done only when the user pauses 
long enough).

In short, everything is fast and doesn't alter the edit experience of 
the user except when Swing is updating part of the window. How are 
other IDEs doing to update graphic elements without delaying the user 
input ? Are they updating them in another thread than the event thread 
or is it simply a matter of speed when rendering these elements ?

Best regards,

Jean



More information about the antlr-interest mailing list