Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
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;
>                         }
>             }
> }

Back to the top