[erlang-questions] Parse Transform with Macros
Evan Miller
emmiller@REDACTED
Sun Mar 6 19:51:26 CET 2011
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