Hi,

Since ANTLR v4 is in development, I was wondering if there were any thoughts
on making it possible to hook into the code generation earlier in order to
be able to add support for weird functional languages such as Haskell,
Lisp, Scheme, Racket, etc.  There were some earlier thoughts on this which
I copied below.

I did have a look earlier at the feasibility of writing an ANTLR runtime
target for Haskell.  This seemed difficult for ANTLR v3, I could not
see how to easily hook into code generation earlier.  Since ANTLR v3
does not seem to have support for weird functional language targets, the
string templates ended up being designed for imperative languages.

As a workaround for ANTLR v3, I have written a Haskell binding to the
ANTLR v3.2 C runtime library:

http://hackage.haskell.org/package/antlrc
https://github.com/markwright/antlrc

Thanks, Mark

http://antlr.org/blog/antlr3/codegen.html

November 18, 2003

A primary goal is easy code gen for a variety of languages. This necessarily
requires a multi-phase translation approach so people can jump in wherever
they want in the code gen process. Here is what I'm thinking 

grammar -> NFA -> NFA+DFA -> ParseLang -> NIL -> C, C++, Java, Perl, ...
                     |           |
                     |           |-------------> Perl, ...
                     |
                     |-------------------------> LISP, other weird stuff

where ParseLang is some antlr parser intermediate form and NIL is some
"neutral imperative language". NIL (just a random name now) would also be
presumably the ANTLR grammar action language as well. Given a NIL translator
to language L, you could translate actions as well as generate parses in L. 

If your language is sort of an imperative language, but perhaps with higher
level recognition capabilities, you would probably generate code from the
ParseLang stage as imperative method calls etc.. would be too low level. 

If you have a truly non-imperative language such as LISP or other functional
language, you would branch off the grammar representation containing the
lookahead analysis: NFA+DFA stage. 

ParseLang would look like the AST for a high-level language. The reason I
don't go straight to NIL or Java for example is that ANTLR has to break apart
some alternative lists due to lookahead and to insert tree actions. There
should be an easy way to dump this from the internal grammar NFA
representation. From there, it's a simple matter of translating to a
imperative-language neutral form and then to final instruction selection. 

ParseLang would also be a convenient place to interpret ANTLR for prototyping. 

As an example, consider 
s : a[42] | Z ;
a[int i] : A B | C ;

The ParseLang tree might be 
RULE
 |
 s -- ARGS -- SELECT
                |
               CASE ---------------------------- CASE
                |                                 |
               SET{A,C} -- SLIST                TOKEN(Z) -- SLIST
                             |                                |
                           INVOKE                           MATCH
                             |                                |
                             a -- ARGS                        Z
                                   |
                                   INT(42)

Note that there would be no infrastrutcure variable definition like AST
pointers and labels etc... That would only appear in an actual output language
or in the NIL format. 

>From ParseLang you would translate the SELECT to a SWITCH in a NIL format
etc... Using translation templates, you could even go straight to a
programming language like this: 

#(SELECT #(CASE expr slist)) ==> "switch (LA(1)) <cases:{"case <expr> : 
<slist>; break;"> }" 

#(INVOKE ID #(ARGS (arg)+)) => "<ID>(<arg>);" 

Or, more likely, these output templates could be used as a convenient way to
generate NIL trees by running the NIL parser over the output templates. This
lets you use text as humans like to read as the output of a translation phase
while still getting out a trees. :) Cute. From the NIL tree you could
translate to any imperative language easily. 

I'm getting more and more fond of the notion that ANTLR will have a simple
standard imperative language as it's action language format. This way all
grammars are portable to all languages even with symbol table actions
etc.... :) Woohoo!
_______________________________________________
antlr-dev mailing list
antlr-dev@antlr.org
http://www.antlr.org/mailman/listinfo/antlr-dev

Reply via email to