[erlang-questions] Parse Transform with Macros

Tristan Sloughter tristan.sloughter@REDACTED
Sun Mar 6 20:24:45 CET 2011


Sweet, that worked, thanks!

Tristan

On Sun, Mar 6, 2011 at 12:51 PM, Evan Miller <emmiller@REDACTED> wrote:

> Aleppo adds an "eof" token at the end if one is not present. Perhaps
> try removing it before passing to erl_parse? It's a new "feature" and
> perhaps a cause of bugs.
>
> On Sun, Mar 6, 2011 at 12:46 PM, Tristan Sloughter
> <tristan.sloughter@REDACTED> wrote:
> > This was working for me with erl_scan and erl_parse. The error I'm
> getting
> > is:
> > {{badmatch,
> >                                                  {error,
> >                                                   {0,erl_parse,
> >                                                    ["syntax error before:
> ",
> >                                                     "eof"]}}},
> > I got the code for what I'm doing by
> > reading:
> http://chlorophil.blogspot.com/2007/04/erlang-macro-processor-v2-part-v.html
> > But then I wanted to use a macro in what I am added to the module. So
> I've
> > modified 'ast_reversed_results' to:
> > ....
> >         String ->
> >             {done,{ok,Tokens,LineEnd},StringRest} =
> >                 erl_scan:tokens([], String, LineStart),
> >             {ok, NewTokens} = aleppo:process_tokens(Tokens),
> >             {ok, AST} = erl_parse:parse_form(NewTokens),
> > ....
> > But this fails with the above error.
> > Maybe I'm doing something else wrong, I'll keep working on it.
> > Thanks,
> > Tristan
> > On Sun, Mar 6, 2011 at 12:41 PM, Evan Miller <emmiller@REDACTED> wrote:
> >>
> >> IIRC erl_parse needs a full module as input, i.e. -module() at the top
> >> and all Erlang expressions inside of named functions.
> >>
> >> On Sun, Mar 6, 2011 at 11:46 AM, Tristan Sloughter
> >> <tristan.sloughter@REDACTED> wrote:
> >> > OK, so maybe it helps if I wrote the fun correctly :). I fixed it to
> >> > fun()
> >> > -> ?MACHINE end. and I get:
> >> > {error,{1,erl_parse,["syntax error before: ","'fun'"]}}
> >> >
> >> > On Sun, Mar 6, 2011 at 11:42 AM, Tristan Sloughter
> >> > <tristan.sloughter@REDACTED> wrote:
> >> >>
> >> >> Hey, this is great! But the result it gives me fails when sent to
> >> >> erl_parse:
> >> >> > {done,{ok,Tokens2,LineEnd2},StringRest2} = erl_scan:tokens([],
> "fun()
> >> >> > ->
> >> >> > ?MACHINE. ", 1).
> >> >> {done,{ok,[{'fun',1},
> >> >>            {'(',1},
> >> >>            {')',1},
> >> >>            {'->',1},
> >> >>            {'?',1},
> >> >>            {var,1,'MACHINE'},
> >> >>            {dot,1}],
> >> >>           1},
> >> >>       []}
> >> >> >  {ok, NewTokens2} = aleppo:process_tokens(Tokens2).
> >> >> >
> >> >> {ok,[{'fun',1},
> >> >>      {'(',1},
> >> >>      {')',1},
> >> >>      {'->',1},
> >> >>      {atom,1,'BEAM'},
> >> >>      {dot,1},
> >> >>      {eof,0}]}
> >> >> > erl_parse:parse_form(NewTokens2).
> >> >> {error,{1,erl_parse,["syntax error before: ","'fun'"]}}
> >> >> Any ideas?
> >> >> Thanks.
> >> >> On Sun, Mar 6, 2011 at 11:27 AM, Evan Miller <emmiller@REDACTED>
> >> >> wrote:
> >> >>>
> >> >>> Hi Tristan,
> >> >>>
> >> >>> Aleppo will apply preprocessor macros on tokens returned by
> erl_scan:
> >> >>>
> >> >>> https://github.com/evanmiller/aleppo
> >> >>>
> >> >>> I think it will fit your needs. Aleppo also lets you use -ifdef and
> >> >>> the like inside of functions since it uses a proper grammar for the
> >> >>> macro syntax.
> >> >>>
> >> >>> On Sun, Mar 6, 2011 at 9:41 AM, Tristan Sloughter
> >> >>> <tristan.sloughter@REDACTED> wrote:
> >> >>> > I'd like to construct a parse transform that has a macro in the
> >> >>> > inserted
> >> >>> > code. I've had no problem using erl_scan:tokens and
> >> >>> > erl_parse:parse_form to
> >> >>> > construct the AST as long as no macros exist.
> >> >>> >
> >> >>> > Since macros are expanded before getting to this point it fails if
> >> >>> > in
> >> >>> > the
> >> >>> > string scanned has something like ?MODULE. I looked at epp_dodger
> >> >>> > and
> >> >>> > elsewhere but I can't seem to find something I could use to send
> in
> >> >>> > a
> >> >>> > string
> >> >>> > like:
> >> >>> >
> >> >>> > "init() -> ?MODULE."
> >> >>> >
> >> >>> > And have tokens I could use to then generate the AST.
> >> >>> >
> >> >>> > Is this possible?
> >> >>> >
> >> >>> > Thanks,
> >> >>> > Tristan
> >> >>> >
> >> >>>
> >> >>>
> >> >>>
> >> >>> --
> >> >>> Evan Miller
> >> >>> http://www.evanmiller.org/
> >> >>
> >> >
> >> >
> >>
> >>
> >>
> >> --
> >> Evan Miller
> >> http://www.evanmiller.org/
> >
> >
>
>
>
> --
> Evan Miller
> http://www.evanmiller.org/
>


More information about the erlang-questions mailing list