You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@freemarker.apache.org by Jonathan Revusky <re...@yandex.ru> on 2019/12/11 03:25:05 UTC

Blast from the Past, FreeCC Parser Generator

Hi all.

I don't know offhand how many of the people receiving this email know 
who I am.  For those of you who don't, I was quite heavily involved with 
the FreeMarker project from some point in late 2001 to late 2008 or so. 
About 7 years. I was the original author of the first JavaCC grammar for 
FreeMarker. Before that, it was a hand-written parser.

As a result of that, and the evolution of FreeMarker, I became quite a 
JavaCC power user and eventually I did a lot of work on JavaCC, which I 
tried to donate to that project. Well, they basically refused to look at 
my work, so I ended up forking it and I labeled that as FreeCC.

Well, also, recently, I was trying to take a look at what was going on 
here and I noticed that the whole subject of parser generators came up 
-- this is a couple of years ago now, and nobody seemed to even know 
that FreeCC existed. Well, it was kind of abandoned and the only place 
to find it would have been on its archived Google Code site, which is 
still there. https://code.google.com/archive/p/freecc/

Of course, Google Code is basically defunct, so the first step to 
resuscitating the project was to put it on Github, which I did just 
yesterday. Here: https://github.com/revusky/freecc

If you want to get your hands on it and play with it, that is quite 
easy. It is simply:

git clone https://github.com/revusky/freecc.git

There are freecc and freecc.bat launchers that run straight out of the 
box since there is a "bootstrap" freecc.jar file, which is needed to do 
a build of freecc!

To do a build is really easy. After checking it out, it's just

cd freecc

ant

That builds a freecc.jar in the root directory that the launchers use in 
preference to the one in bin (if it is there, obviously...)

You can run the test cases such as they are with:

ant test

and generate some (rather limited) docs with

ant docs

In the examples, there is an example grammar for FreeMarker which I had 
actually intended to be the basis of the grammar in newer versions of 
FreeMarker. You can also eyeball those files here:

https://github.com/revusky/freecc/tree/master/examples/freemarker

Note how the FreeMarker grammar is broken into two files, FTL.freecc and 
FEL.freecc. The first is the grammar for directives while the second 
file is just for expressions, FEL being FreeMarker Expression Language. 
In fact, it would be fairly simple to have separate builds in which you 
swap in and out different FEL.freecc files and have alternative syntax 
for expressions. (I don't know how useful that is, but it is nifty and 
it is something that is, to all intents and purposes, not even possible 
with JavaCC, which is a much more inflexible and cumbersome tool.)

I had originally thought that, having abandoned FreeCC for a decade, 
that the work had no value now, since there would be so much progress 
over that time, but actually, I look at this, and see that, 
surprisingly, FreeCC could still be pretty useful, so I thought to try 
get it to a 1.0 release level.

Over the last few days, I've been updating the included Java grammar to 
handle more modern constructs. It now handles the newer try-catch 
blocks, the double colon :: operator, but I still haven't implemented 
the lambda expression syntax. But I intend to. I ran the java parser 
over the entire freemarker codebase and it fails on 2 files, precisely 
because those are the two that use lambda expressions.

Also, I fixed a couple of bugs that had been in the GoogleCode bug 
tracker for like 11 years.

FreeCC in its very core algorithmically is the same as JavaCC, but since 
it uses FreeMarker templates to generate the code, it is actually far 
more configurable and flexible than JavaCC. You can get an idea of the 
new (actually, not so new features at this point!) from these Wiki posts 
I wrote about 11 years ago.

https://code.google.com/archive/p/freecc/wikis

I had the beginnings of a tutorial written about 11 years ago. I put 
that up right here:

https://revusky.com/freecc/docs/

Well, the whole thing has quite a bit of potential, and it is a very 
good example of how FreeMarker can be used outside the web space, for 
code generation. It is quite striking to compare FreeCC's code with 
JavaCC and see how much more tersely and cleanly the whole thing is 
expressed using FreeMarker templates to generate the code of the parsers 
rather than the println statements approach used by JavaCC.

Well, I write this hoping that some people could really get interested 
in this. You might or might not, but it is easy to check out the project 
and play with it. There are some very old examples that are from JavaCC 
and then some examples I added. In particular, the included FTL.freecc 
and FEL.freecc are quite worthy of study, in particular, if you are 
interested in reworking FreeMarker.

I'll close the note here.

Best Regards,

Jonathan Revusky