On 13-09-20 12:00 PM, Tory Gaurnier wrote:
[...]
Well, it's actually proving more difficult then I thought to get the ID,
what I was planning on doing is when my function finds a valid Object,
it would store the name and continue to loop through the lines until it
either finds an ID or '}' (unless of course another '{' was found, for
instance if for some reason someone put a function before an ID
declaration in an Item/Component, I was prepared for this stuff ;] ),
and in the mean time while it was scanning it would still be on the
lookout for Javascript functions and add them when it sees them, then
when it was ready (found ID or end of Object), it would create the tag,
however, I reallized that it's probably getting the line # to point at
from the current line number in File when you actually create the tag,
so I traced down the functions, and it appears to be the case, so with
that method it would most definitely not be pointing at the correct line
for the tag.


I've never written a CTags parser, but writing other parsers, a common technique is to use a stack data structure and each time you encounter a `{`, you push a new "scope" onto the stack and each time you encounter a `}`, you pop the top "scope" off of the stack. This way when you encounter an `id:` token, you go (in pseudo-code):

    if (iHaveFoundAnId)
        theScopeStack->peekTop()->setId(theId);

And you'll always be putting the id on the right thing. It also works good for scoping sub-objects or whatever else too:

    if (iHaveFoundASubObjectDecl) {
        // Add theObject to the current scope
        theScopeStack->peekTop()->addChild(theObject);
    }

I'm not sure this is at all relevant in the context of a CTags parser, but maybe it'll give some ideas.

Cheers,
Matthew Brush
_______________________________________________
Devel mailing list
Devel@lists.geany.org
https://lists.geany.org/cgi-bin/mailman/listinfo/devel

Reply via email to