Thread overview
[dmd-internals] A dmd hacking question
Mar 26, 2012
deadal nix
Mar 26, 2012
kenji hara
Mar 26, 2012
deadal nix
March 26, 2012
Hi,

I wanted to try out to do some hacking into DMD. I ran in a problem that I have no clue how to solve.

I did the following to generate some function with an alternative syntax :
    Type* type = new TypeIdentifier(loc, typeId);
    Parameters* ps = new Parameters();
    ps->push(new Parameter(0, type, new Identifier("argument",
TOKidentifier), NULL));

    Statement* body = parseStatement(PScurly);
    f = new FuncDeclaration(loc, this->loc, id, STCundefined, new
TypeFunction(ps, type, 0, LINKd, STCundefined));
    f->fbody = body;

    Dsymbols *decldefs = new Dsymbols();
    decldefs->push(f);

    return new TemplateDeclaration(loc, id, tpl, constraint, decldefs, 0);

It works great, except that I can't use argument in the function body. I got an identifier missing message. What is missing to enable this identifier to be resolved as a regular function parameter ?


March 26, 2012
2012$BG/(B3$B7n(B26$BF|(B10:31 deadal nix <deadalnix@gmail.com>:
> Hi,
>
> I wanted to try out to do some hacking into DMD. I ran in a problem that I have no clue how to solve.
>
> I did the following to generate some function with an alternative syntax :
>     Type* type = new TypeIdentifier(loc, typeId);
>     Parameters* ps = new Parameters();
>     ps->push(new Parameter(0, type, new Identifier("argument",
> TOKidentifier), NULL));

      ps->push(new Parameter(0, type, Lexer::idPool("argument"), NULL));

>     Statement* body = parseStatement(PScurly);
>     f = new FuncDeclaration(loc, this->loc, id, STCundefined, new
> TypeFunction(ps, type, 0, LINKd, STCundefined));
>     f->fbody = body;
>
>     Dsymbols *decldefs = new Dsymbols();
>     decldefs->push(f);
>
>     return new TemplateDeclaration(loc, id, tpl, constraint, decldefs, 0);
>
> It works great, except that I can't use argument in the function body. I got an identifier missing message. What is missing to enable this identifier to be resolved as a regular function parameter ?

In basic, each identifier object is unique, and in semantic they are compared only their address.

Kenji Hara
_______________________________________________
dmd-internals mailing list
dmd-internals@puremagic.com
http://lists.puremagic.com/mailman/listinfo/dmd-internals

March 26, 2012
Thank a lot ! That solved it !

Le 26 mars 2012 05:31, kenji hara <k.hara.pg@gmail.com> a écrit :

> 2012年3月26日10:31 deadal nix <deadalnix@gmail.com>:
> > Hi,
> >
> > I wanted to try out to do some hacking into DMD. I ran in a problem that
> I
> > have no clue how to solve.
> >
> > I did the following to generate some function with an alternative syntax
> :
> >     Type* type = new TypeIdentifier(loc, typeId);
> >     Parameters* ps = new Parameters();
> >     ps->push(new Parameter(0, type, new Identifier("argument",
> > TOKidentifier), NULL));
>
>       ps->push(new Parameter(0, type, Lexer::idPool("argument"), NULL));
>
> >     Statement* body = parseStatement(PScurly);
> >     f = new FuncDeclaration(loc, this->loc, id, STCundefined, new
> > TypeFunction(ps, type, 0, LINKd, STCundefined));
> >     f->fbody = body;
> >
> >     Dsymbols *decldefs = new Dsymbols();
> >     decldefs->push(f);
> >
> >     return new TemplateDeclaration(loc, id, tpl, constraint, decldefs,
> 0);
> >
> > It works great, except that I can't use argument in the function body. I
> got
> > an identifier missing message. What is missing to enable this identifier
> to
> > be resolved as a regular function parameter ?
>
> In basic, each identifier object is unique, and in semantic they are compared only their address.
>
> Kenji Hara
> _______________________________________________
> dmd-internals mailing list
> dmd-internals@puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-internals
>