[erlang-questions] Parse Transform with Macros
Tristan Sloughter
tristan.sloughter@REDACTED
Sun Mar 6 19:46:07 CET 2011
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/
>
More information about the erlang-questions
mailing list