John,
I understand. So, if you have some
documentation you can share (class hierarchy diagrams etc.) I’m willing to take
a stab at it now and send you the code as an input to your work. This would
greatly help me and at least you’ll be able to see how not to do it! From my
side the performance and scalability are not the issue, but the functionality.
As an aside, how is the keyword colouring
achieved in the editor? Is this done through string matching in the renderer?
Jason
From:
cdt-core-dev-admin@xxxxxxxxxxx [mailto:cdt-core-dev-admin@xxxxxxxxxxx] On Behalf Of John Camelon
Sent: Wednesday, July 07, 2004
5:23 PM
To: cdt-core-dev@xxxxxxxxxxx
Subject: Re: [cdt-core-dev] C++
Parser
Our
AST is incomplete when it comes to statements. It is something we will
need to address in the future once we get a bit more performant and scalable.
Thanks
JohnC
cdt-core-dev-admin@xxxxxxxxxxx
wrote on 07/07/2004 05:54:31 AM:
> I want to use the parser to give me details
of where C/C++
> statements are, however I have so far failed
to penetrate the AST
> with an instance of the
ISourceElementRequestor (See code at the
> end). Here is an example of what I’d
like as information, take the
> following C code:
>
> 1: int
main(int argc, char argv[])
> 2: {
> 3:
if (argc == 0) {
> 4:
printf("You didn't pass in any arguments");
> 5:
return -1;
> 6:
}
> 7:
else {
> 8:
printf("You passed in %d args\n",argc);
> 9:
return 1;
> 10:
}
> 11:}
>
> I am
particularly interested in understanding that the ‘If’ keyword
> is on line 3, the condition statement is also
on line 3, the ‘else’
> keyword is on line 7. Then I need to
know the details of the ‘then’
> code block and the ‘else’ code block.
>
> I
traced through the parser code and it seems that it should be
> possible to get this information, but it
seems that the line number
> is not stored, or it maybe stored if a new
scope is generated for
> the ‘if’. For those not familiar with
the code this token reading
> etc. is all happening in the package
cdt.internal.core.parser. and
> cdt.internal.core.parser.ast.
>
> So
right now my ISourceElementRequestor gets the codeBody call back
> for the ‘then’ block and the ‘else’ block,
but I don’t seem to be
> able to determine the details of the
statements within the code
> bodies, nor the location of syntactic
keywords.
>
> Could
someone please shed some light on this for me? I am assuming
> that this kind of thing is already done for
the editor that
> highlights keywords in the source files, but
I am not sure.
>
> Any
insights will be very much appreciated.
>
> Jason
>
> PS:
Below is the code I’m using.
>
> class
CMySourceElementRequestor extends StructuralParseCallback
> {
>
private ParserMode mode = ParserMode.COMPLETE_PARSE;
>
>
private void addElement (IASTDeclaration
element){
>
if(inclusionLevel == 0){
>
if( currentScope instanceof ASTScope
)
>
((ASTScope)
> currentScope).addDeclaration(element);
>
else if( currentScope instanceof
> ASTLinkageSpecification )
>
> ((ASTLinkageSpecification)currentScope).addDeclaration(
element );
>
}
>
}
>
>
private void enterScope(IASTNode node){
>
if(node instanceof IASTScope){
>
if(node instanceof ASTScope){
>
((ASTScope)node).
> initDeclarations();
>
}
>
pushScope((IASTScope)node);
>
}
>
}
>
>
private void exitScope(IASTNode node){
>
if(node instanceof IASTScope){
>
popScope();
>
}
>
}
>
>
private void pushScope( IASTScope scope ){
>
scopeStack.addFirst( currentScope );
>
currentScope = scope;
>
}
>
>
private IASTScope popScope(){
>
IASTScope oldScope = currentScope;
>
currentScope = (scopeStack.size() > 0 ) ?
> (IASTScope) scopeStack.removeFirst() : null;
>
return oldScope;
>
}
>
>
public void enterFunctionBody( IASTFunction
function )
>
{
>
System.out.println("Enter function");
>
if(function.getOwnerTemplateDeclaration() == null)
>
addElement(function);
>
else if(function.
> getOwnerTemplateDeclaration() instanceof
IASTTemplateDeclaration)
>
> addElement((IASTTemplateDeclaration)function.getOwnerTemplateDeclaration());
>
}
>
>
public void exitFunctionBody( IASTFunction
function )
>
{
>
System.out.println("Exit function");
>
function.setHasFunctionBody( true );
>
}
>
>
public void enterCodeBlock( IASTCodeScope
scope )
>
{
>
System.out.println("Enter Code Block");
>
enterScope(scope);
>
}
>
>
public void exitCodeBlock( IASTCodeScope
scope )
>
{
>
System.out.println("Exit Code Block");
>
exitScope(scope);
>
}
>
>
public void enterCompilationUnit(
IASTCompilationUnit
> compilationUnit )
>
{
>
System.out.println("Enter Compilation Unit");
>
enterScope(compilationUnit);
>
}
>
>
public void exitCompilationUnit(
IASTCompilationUnit
> compilationUnit )
>
{
>
System.out.println("Exit Compilation");
>
exitScope(compilationUnit);
>
this.compUnit = compilationUnit;
>
}
>
>
/**
>
* @param finalPath
>
* @return
>
*/
>
public CodeReader createReader(String
finalPath,
> Iterator workingCopies )
>
{
>
return InternalParserUtil.createFileReader(
> finalPath );
>
}
>
/**
>
* The parser asks the client if it
wishes to time out
>
* in case it is taking more than the expected
time.
>
* @return
>
*/
>
public boolean parserTimeout()
>
{
>
return false;
>
}
> }
>
> /**
> *
@author jason
> *
> *
TODO To change the template for this generated type comment go to
> *
Window - Preferences - Java - Code Style - Code Templates
>
*/
> public
class Test {
>
>
public static void main(String[] args) {
>
IScanner myIScanner;
>
IParser myIParser;
>
CMySourceElementRequestor mySourceElementRequestor;
>
>
try
>
{
>
mySourceElementRequestor = new
> CMySourceElementRequestor();
>
myIScanner = ParserFactory.
>
createScanner("c:\\temp\\test.c",new ScannerInfo(),ParserMode.
> COMPLETE_PARSE,ParserLanguage.C,
mySourceElementRequestor, null,null);
>
myIParser = ParserFactory.
> createParser(myIScanner,
mySourceElementRequestor, ParserMode.
> COMPLETE_PARSE, ParserLanguage.C,null);
>
if (myIParser.parse() == true)
>
{
>
System.out.
> print("Parse successful");
>
}
>
else
>
{
>
System.out.
> print("Parse unsuccessful");
>
}
>
}
>
catch (IOException e)
>
{
>
return;
>
}
>
}
> }