code completion help...

Daniel Berlin dberlin at redhat.com
Tue Feb 13 22:31:00 GMT 2001


christopher j bottaro <cjb at cs.utexas.edu> writes:

> accually, i've abandoned my old method (trying to work magic with regular 
> expressions).  whoever posted about this topic before was right, if i really 
> want to do it right, i have to come up with a context free grammer for a 
> portion of c++.  so now my strategy has changed.  i am currently
> using flex++ 
> and bison++. 

Probably me, I remember mentioning this to the list before.
It sucks, no?
>  flex has made it easy to elegantly remove c comments and 
> strings broken up upon multiple lines.  and combined with bison++, i wrote a 
> little grammer to match/parse method signatures and method bodies.  weird 
> thing though...i can get bison to match and discard while loops of the form:
> while (expression) codeblock
> but for some reason it chokes on
> while (identifier) codeblock

Probably some silly ambiguity.

> 
> also, i think people want QT classes to work with code completion, and i 
> thought they would because i thought i saw somewhere in the ClassParser code 
> that QT and KDE classes were stored preparsed and loaded into the class store 
> or something.
> 
> the two current problems i'm facing now is getting bison++ to work with 2 
> lexers in the source.  it doesn't like the other flexlexer that the 
> classparser uses.  and also, my grammer has one shift/reduce conflict because 
> of the "dangling else" ambiguity.  so far that hasn't caused any problems 
> though.
> 

Use ANTLR,  which can take care of these problems much easier than
bison++ or flex++ can.



> other than that, its pretty fast.  it can scan a 3000 line source file 
> without making the cursor even flinch.
> 
> oh well, i'm still kinda feeling this out, i.e. whether or not it can be done 
> well pretty easily.  hopefully i'll have a patch soon.
> 
> my initial goals are to get it working with the following deficiencies:
> 1)  it completely relies on the classstore, if a class isn't parsed by the 
> classparser and put in the classstore, the code completion code isn't going 
> to find its methods/variables.
> 2)  code completion will only work in the scope of methods defined outside 
> the class declaration (i.e. method definitions with :: in the signature)
> 3)  it won't recognize scope inside a method, like variables declared inside 
> loops or if statements
> 
> thanks for the info and comments,
> christopher
> 
> > > > Sounds good. I'd be very interesting in seeing what you have,
> > > > especially if you are working on kdevelop1.4.
> > >
> > > so far the way it works is, it uses a QStack to push/pop curly braces to
> > > find the begining and end lines of the method definition and the method
> > > signature that the cursor is in.  then when you hit a '.' or '->' it
> > > grabs the last word you typed and method signature and looks up the class
> > > that the method belongs to, then searches the class store for the class
> > > to see if it has the "last word" was defined in it.
> > >
> > > so far, for the sake of wanting to get something working quickly, i broke
> > > modularity all over the place i think.  i made CEditWidget a friend of
> > > KWriteDoc and KWriteView and vice versa.  i made a few select class vars
> > > public, etc.  i'll change all that and make proper public interfaces once
> > > its ready for presentation.
> > >
> > > there are two things that would help me out a lot.
> > > 1)  whats a regular expression definition that would match a c++ method
> > > signature?  i.e.  match something like "QStringList*
> > > CCodeCompletion::getMethods(const QString& aClassVar) {"
> > > 2)  some algorithm to convert someone's method signature they type in a
> > > .cpp file to match the string required by
> > > CParsedContainer::getMethodByNameAndArg().  i think i'll work on this
> > > today, but once thats done, the code completion class should recognize
> > > method params as well as class vars.
> >
> > I'll pass on this - hopefully someone else can give you pointers here
> >
> > jbb
> 
> -
> to unsubscribe from this list send an email to kdevelop-request at kdevelop.org with the following body:
> unsubscribe »your-email-address«

-
to unsubscribe from this list send an email to kdevelop-request at kdevelop.org with the following body:
unsubscribe »your-email-address«



More information about the KDevelop mailing list