[antlr-interest] how do you make Antlr work with a recursively changing input stream

Mark Wright markwright at internode.on.net
Tue Jun 29 16:29:00 PDT 2010


On Tue, Jun 29, 2010 at 03:18:55PM -0700, Alex McMains wrote:
> Hi all,
> 
> I'm new to Antlr.  I've bought and read portions of the Antlr book,
> and I've read dozens of postings and tutorials, but I still can't
> see how to do deal with a recursively changing input stream in
> Antlr.  Do I somehow use TokenRewriteStream, or am I missing
> something?

Hi Alex,

Yes, you are missing something, the Antlr book does not say much about
symbol tables or type systems.

For simple type systems, it is probably easier to just use the
approach which is called a "symbol table" in old school books
on compiler construction.  A really good description of this
approach is in chapter 7 of the book Language Implementation Patterns
by Terence Parr.  An introduction to this approach is at:

http://www.antlr.org/wiki/display/CS652/Symbol+tables

You obviously need to implement forward references scopes.

Mainly for the mailing list archive, I would just like to say that I
find this symbol table approach seems difficult to use for
complex type systems.  For complex type systems the approach I
recommend is described in the book "Types and Programming Languages"
by Benjamin Pierce, the online book "Software Foundations", see the
course:

http://www.seas.upenn.edu/~cis500/current/index.html

and the book "Certified Programming with Dependent Types" by
Adam Chlipala:

http://adam.chlipala.net/cpdt/

Regards, Mark
 
> Here's the situation:
> 
> I start with an input stream.  As I move through the input I will
> either encounter something that can be parsed directly, or I will
> encounter something that tells me to go to a table and substitute an
> entire row of the table at the node where I currently am.  This can
> continue to happen recursively since each field from the substituted
> row can again call for a substitution. 
>  
> Here's an example:
>  
> Person table:
>  Identifier     Name   {Address}
> Person1        Jon       Jon's Address
>  
> Address table:
>  Identifier      HouseNumber  StreetName
> Jon's Address   3477               Blue Lane
>  
> The {} around Address says to name the current node "Address" and
> substitute the current value for whatever is at "Jon's Address" in
> the Address table.
>  
> Eventually this will become XML that would look like:
>  
> <Person>
>     <Name>Jon</Name>
>     <Address>
>          <HouseNumber>3477</HouseNumber>
>          <StreetName>Blue Lane</StreetName>
>      </Address>
> </Person>
>  
> Any ideas would be appreciated.
>  
> Thanks.
>  
>        -- alex
> 
> 
>       
> 
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
> 


More information about the antlr-interest mailing list