[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: AST Transformations
Hi Kevin, All,
Thanks for the reply, it helped a lot. I have one other problem which I
am not sure can be met.... Is it possible to transform this:
translation_unit = external_declaration*;
external_declaration =
{decl} declaration |
{defn} definition ;
into this:
translation_unit = declaration* definition*;
I have not been able to find a way (without modifying the CST).
Any thoughts?
Cheers,
Roger
On Thu, May 15, 2003 at 03:10:48PM -0400, Kevin Agbakpem wrote:
>
> Hi Roger,
>
> Sorry about being silent so long time.
>
> Productions can be transformed to more than one elements.
> I think it will be more easy to explain this with an example, so i've
> joind a file called tar.grammar in which some precisions are given.
>
>
> > Hi Etienne, All,
> >
> > The new AST transformations are a great feature, and I'm just wondering
> > who wrote it I can direct a few questions their way. SableCC is sorely
> > in need of good documentation and I am happy to do this providing I
> > don't have to reverse engineer everything that is released! It is also
> > very difficult to understand the source code due to the lack of (i.e.
> > non-existance of) comments.
> >
> > My main question is "Do you have to have a 'New' statement for each
> > transform, or are there other shortcuts?".
>
> No, there are other shortcuts. We have four differents alternative
> transformations types (new, simple, list, null).
> I've joined a SableCC3 example grammar based on arithmetic expressions, in
> which all transformations types are specified(expression.grammar).
>
> The new statement must appear at least once in alternative
> transformations since the AST is composed by node(s) defined in Abstract
> Syntax Tree section.
> The only way to create new node in SableCC3 is to write 'New' followed by
> a production name and optionnally '.alternative_name' if there is an
> alternative name.
>
>
> I hope that this could help you.
> I you have any other question, i will be happy to help you.
>
> Cheers,
>
> Kevin
>
> >I ask this because I see the
> > mention of lists in the source, and also notice that the grammar allows
> > more than one transformation to be defined per alternative:
> >
> > alt_transform =
> > arrow [terms]: term*;
> >
>
> > Thanks,
> >
> > Roger
> >
> > On Wed, May 07, 2003 at 01:41:04PM -0400, Etienne Gagnon wrote:
> > > Indrek Mandre wrote:
> > > >What is the timeline of SableCC 3 anyway? When does it become available?
> > >
> > > The CST->AST stuff is ready. I should be making it public next week, if
> > > everything goes well.
> > >
> > > You can think of most of the other wish-list items as SableCC X (where X >
> > > 3)
> > > wishes.
> > >
> > > :-)
> > >
> > > Etienne
> > >
> > >
> > > --
> > > Etienne M. Gagnon, Ph.D. http://www.info.uqam.ca/~egagnon/
> > > SableVM: http://www.sablevm.org/
> > > SableCC: http://www.sablecc.org/
> > >
> >
> >
> >
> >
> Package tar;
>
> Helpers
>
> tab = 9;
> cr = 13;
> lf = 10;
> eol = [[cr + lf] + [cr + lf]];
> white = [[' ' + tab] + eol];
>
> lowercase = ['a' .. 'z'];
> uppercase = ['A' .. 'Z'];
> letter = uppercase;
> digit = ['0'..'9'];
> id_part = lowercase (lowercase | digit)*;
> blank = (' ' | tab | eol)+;
>
> Tokens
>
> tar = 'tar';
> id = id_part ('_' id_part)*;
> minus = '-';
> semicolon = ';';
> l_bkt = '[';
> r_bkt = ']';
> letter = letter;
>
>
> blank = blank;
>
> Ignored Tokens
>
> /* These tokens are simply ignored by the parser. */
>
> blank;
>
> /*****************/
> Productions
>
> /***********************************************************************
> The first production of this section must be transformed to the first
> production of Abstract Syntax Tree section
> but it is not necessary to explicitely specify it if it has the same
> name.
> So, in this case, we should write :
> grammar -> grammar
> but the software automatically do it when nothing is specified.
> So we have less things to do :-)
> ***********************************************************************/
>
> /*#####*/
> grammar = P.tar -> New grammar((P.tar.letter), (P.tar.id));
> /*#####*/
>
>
> /***********************************************************************
> Here the production #tar# is supposed to be transformed to a list of #letter#
> followed by a list of #id#.
> Since the unique alternative of #options# is composed by
> token #tar#, production #options# and production #files#,
> we can get a list of letter by productions #options# transformations
> and a list of id by production #files# one's.
>
> As it can be notice here, there is no new statement in this transformation.
> So the 'New' statement is not needed in all cases.
> ***********************************************************************/
>
> /*#####*/
> tar -> letter* id* = T.tar options files -> (options.letter) (files.id);
> /*#####*/
>
> /***********************************************************************
> #options# is transformed to a list of letter.
> So the alternative transformation #(letter)# means that we created a new list
> in which we add all elements of #elem+#
> So there is no more #options# node in the AST. They are all transformed to lists
> of #letter#.
> ***********************************************************************/
>
> /*#####*/
> options -> letter* = minus letter+ -> (letter);
> /*#####*/
>
>
> /***********************************************************************
> This transformation is similar production #tar# transformation
> ***********************************************************************/
> /*#####*/
> files -> id* = file_name+ semicolon? -> (file_name.id) ;
> /*#####*/
>
> /***********************************************************************
> In this case, #file_name# is transformed to #id#. So we only get the already
> existing #id# from the unique alternative.
> ***********************************************************************/
> file_name -> id = l_bkt id r_bkt -> id;
>
>
> /*****************/
> Abstract Syntax Tree
>
> grammar = letter* id*;
> Package expressionlist;
>
> Helpers
>
> digit = ['0' .. '9'];
>
> tab = 9;
> cr = 13;
> lf = 10;
> eol = cr lf | cr | lf; // This takes care of different platforms
> tous = [0 .. 0xffff];
> blank = (' ' | tab | eol)+;
>
> Tokens
> l_par = '(';
> r_par = ')';
> plus = '+';
> minus = '-';
> mult = '*';
> div = '/';
> dot = '.';
> comma = ',';
>
> blank = blank;
> number = digit+;
> toto = 'toto';
> titi = 'titi';
> tata = 'tata';
>
> Ignored Tokens
>
> blank;
>
> Productions
>
> grammar -> grammar = exp_list -> New grammar((exp_list.exp));
>
> exp_list -> exp* = exp exp_list_tail -> (exp exp_list_tail.exp);
>
> exp_list_tail -> exp = comma exp -> exp;
>
> exp = {plus} exp plus factor -> New exp.plus(exp, factor.exp) |
> {minus} exp minus factor -> New exp.minus(exp, factor.exp) |
> {factor} factor -> factor.exp;
>
>
> factor -> exp = {mult} factor mult term -> New exp.mult(factor.exp, term.exp ) |
> {div} factor div term -> New exp.div(factor.exp, term.exp ) |
> {term} term -> term.exp;
>
> term -> exp = {number} number dummy -> New exp.number(number) |
> {exp} l_par exp r_par -> exp;
>
> dummy -> = dummychild tata* -> ;
>
> dummychild -> toto = toto titi -> Null;
>
> Abstract Syntax Tree
>
> grammar = exp+;
>
> exp = {plus} [l]:exp [r]:exp |
> {minus} [l]:exp [r]:exp |
> {div} [l]:exp [r]:exp |
> {mult} [l]:exp [r]:exp |
> {number} number ;
------------------------------------------------------------------------
ninthave.net p: +61 7 3870 8494
Web Hosting m: +61 405 048 371
Web Design w: http://www.ninthave.net
Programming e: r.keays@ninthave.net
------------------------------------------------------------------------
http://groups.ninthave.net Complete hosting solution for communities
http://billshare.ninthave.net The easy way to manage your bills!
http://pic.ninthave.net THE C compiler for PIC micros
------------------------------------------------------------------------
http://clubs.sport.uq.edu.au/uqtrifit UQ Triathlon Club
http://groups.msn.com/SunshineCoastCycling Sunshine Coast Cycling Club
http://groups.ninthave.net/dance UQ Dance Club
http://www.cashflowclub.org.au UQ Cashflow Club
------------------------------------------------------------------------