announcing synfl, the next generation of fontlock
"Stephen J. Turnbull" <[email protected]> Tue, 11 May 2004 23:39:20 +0900
| Newsgroups | gmane.emacs.xemacs.design |
|---|---|
| Organization | The XEmacs Project |
| Message-ID | <[email protected]> |
That should get your attention! Returning to reason and modesty, this is a rather primitive module based on an LR parser engine and an SLR parser generator. The parser wants tuning and optimization, but is perfectly servicable for experimentation. The parser generator probably should be extended to a LALR parser generator for general use, but that should be reasonably straightforward (though a little time-consuming) for anybody with a copy of The Dragon Book to hand. (Aho, Sethi, and Ullman, _Compilers: ..._) I probably shouldn't play with it much for the next few weeks, so, now that it's basically working, here it is: cvs -d :pserver:[email protected]:/pack/xemacscvs \ checkout -d synfl XEmacs/packages/unsupported/stephen/synfl http://turnbull.sk.tsukuba.ac.jp/Tools/XEmacs/synfl.tar.gz To use it, you should just byte-compile everything and load up. The Makefile is untested. It expects to find XEmacs.rules in the grandparent directory, as usual. "distribution" in package-info.in is set to "unsupported", so "make install" is not a good idea; I don't think it has a chance of working at all. Features: There's a built-in trace/debug facility, so the package is of educational interest. You can watch the LR parser, and the SLR parser-generator, as they do their things. I thought it was pretty cool, but maybe that's just me. The token stream implementation used to catch the results of lexical analysis is probably OK. The "interface" used to mesh the token stream, the grammar, and the parser output is an abortion; cleaning that up is the next task, so my apologies in advance to anybody who spontaneously combusts from looking at it. It just didn't want to be abstracted yet, but I tried to force it.... The font-lock capability looks to be about twice as fast as (uncached, nonlazy) traditional font-lock already, but all of that is due to not using complex regular expressions; the syntax analyzer is currently just along for the ride, wasting a small amount of time in the interest of making sure it's reasonably efficient. It is. The C grammar used so far is trivial, just a stream of tokens. Profile data for fontlock+cc-mode, a lock-c grammar, and a lex'n'lock implementation applied to src/emacs.c are in doc/profile_emacs.c_*. Tick counts are purely notional, as the XEmacs used for profiling is fully pessimized. (Sorry, Hrvoje. :-) I will say that since so much of the time for font-lock is spent in regexp matching (all in C), and so little is for synfl, I'll bet that the advantage for synfl _increases_ with optimization of XEmacs. It probably wouldn't be too difficult to arrange to call the parser recursively on a different grammar (for the same kinds of files that mmm-mode is used for). Haven't done that, but I have given a little thought to avoiding introducing code that would prevent it. The lex'n'lock strategy is of independent interest. What's giving the speed for both the synfl locker and the lex'n'locker is to lex the tokens and then figure out what the keywords are by looking up the tokens in a hash table---this can be done without the parser stuff, and it's at least 5 times as fast as traditional font-lock. I am not yet willing to conjecture whether either strategy will handle bogus syntax or re-font-lock on-the-fly and still maintain efficiency. Documentation, outside of the sources, is non-existent, of course. They are pretty extensively commented, cross-referenced to the Dragon Book, and the docstrings are fairly good, I hope. You know where to find me if you have questions. :-) -- Institute of Policy and Planning Sciences http://turnbull.sk.tsukuba.ac.jp University of Tsukuba Tennodai 1-1-1 Tsukuba 305-8573 JAPAN Ask not how you can "do" free software business; ask what your business can "do for" free software.