Understanding the AST...
RazvanN
razvan.nitu1305 at gmail.com
Thu Feb 22 13:44:51 UTC 2018
On Thursday, 22 February 2018 at 13:21:04 UTC, joe wrote:
> On Monday, 12 February 2018 at 08:47:58 UTC, RazvanN wrote:
>> Hi Joe,
>>
>> /SNIP
>>
>> On Tuesday, 6 February 2018 at 12:03:06 UTC, joe wrote:
>>>[...]
>>
>> The FuncDeclaration node contains all the information for that.
>> For example, you can access fd.parent to see if the function is
>> declared at top-level (in which case, the parent is going to
>> be a module
>> declaration ) or if it is a nested function (in a class, in a
>> struct, in a function).
>> Every AST node contains information about the position in the
>> AST, all you
>> have to do is find how to get that information: which field to
>> access or which
>> member function to call.
>>
>> /SNIP
>>
>> Cheers,
>> RazvanN
>
> Follow up question...
>
> Why is *.parent always null?
> e.g.:
>
> extern(C++) class MyVisitor(AST): ParseTimeTransitiveVisitor!AST
> {
> override void visit(AST.Import i)
> {
> assert(i.parent is null); // always true
> }
>
> override void visitFuncBody(AST.FuncDeclaration f)
> {
> assert(f.parent is null); // always true
> }
> }
Indeed, @Stefan is right. The ParseTimeVisitor only contains
information available at parse time. If you are interested in the
parent you have 2 options: either (1) use the ParseTimeVisitor
and implement the AST traversal logic yourself or (2) you can use
the SemanticTimeTransitiveVisitor in which case the parent is not
going to be null. In the case of (2) you need to also do some
semantic analysis (so you need the whole dmd library, not just
the parsing one). Here's an example on using the dmd library
(including semantic) [1]. You can copy paste that example and add
a few lines of code where you instantiate your visitor (which
will inherit SemanticTimeTransitiveVisitor).
[1]
https://github.com/dlang/dmd/blob/master/test/dub_package/frontend.d
RazvanN
More information about the Digitalmars-d-learn
mailing list