2017-02-06 17 views
1

Eclipseから離れてCDTパーサーを使用してC++ソースを解析しようとしています。EclipseからCDTパーサを使用する(プロジェクトの作成方法)

ASTを取得するには、インデックス、IncludeFileContentProviderを作成する必要があります。 インデックスを作成するには、プロジェクトを作成する必要があります。私はこのプロジェクトがEclipseプロジェクトを意味すると思います。

しかし、私はEclipseの外でCDTパーサーを使用しています。 この場合、プロジェクトを作成する方法。

+0

Eclipseプラットフォームに基づいてスタンドアロンアプリケーションを作成する方法についてはよく分かりませんが、ワークスペースを作成してワークスペースを作成する必要がありますプロジェクト。関連API: 'ResourcesPlugin.getWorkspace()'、 'IWorkspace.newProjectDescription()'、 'IWorkspace.getRoot()'、 'IWorkspaceRoot.getProject()'、 'IProject.create()'です。 Eclipseプロジェクト( 'IProject')を作成したら、CCorePlugin.getDefault()。createCDTProject()を介してCDTプロジェクト(' ICProject')を作成するためのさらなるステップが必要です。 – HighCommander4

+0

また、 'ResourcesPlugin.getWorkspace()'が機能するためには、次のようなことが必要です。https://wiki.sei.cmu.edu/aadl/index.php/Creating_Headless_(Command_Line)_Plugins – HighCommander4

+0

(このチュートリアル簡単かもしれません:http://www.developertesting.com/archives/month200508/20050823-HeadlessHelloWorldInEclipse.html) – HighCommander4

答えて

1

以下は、CDTパーサーの例です。

import java.util.HashMap; 
import java.util.Map; 

import org.eclipse.cdt.core.dom.ast.ASTVisitor; 
import org.eclipse.cdt.core.dom.ast.IASTDeclaration; 
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; 
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; 
import org.eclipse.cdt.core.index.IIndex; 
import org.eclipse.cdt.core.model.ILanguage; 
import org.eclipse.cdt.core.parser.DefaultLogService; 
import org.eclipse.cdt.core.parser.FileContent; 
import org.eclipse.cdt.core.parser.IParserLogService; 
import org.eclipse.cdt.core.parser.IScannerInfo; 
import org.eclipse.cdt.core.parser.IncludeFileContentProvider; 
import org.eclipse.cdt.core.parser.ScannerInfo; 

public class _CDTParser { 
    public static void main(String[] args) throws Exception { 
     String sourcecode = "int a; void test() {a++;}"; 
     IASTTranslationUnit translationUnit = _CDTParser.getIASTTranslationUnit(sourcecode.toCharArray()); 

     ASTVisitor visitor = new ASTVisitor() { 
      @Override 
      public int visit(IASTDeclaration declaration) { 
       // When CDT visit a declaration 
       System.out.println("Found a declaration: " + declaration.getRawSignature()); 
       return PROCESS_CONTINUE; 
      } 
     }; 
     // Enable CDT to visit declaration 
     visitor.shouldVisitDeclarations = true; 
     // Adapt visitor with source code unit 
     translationUnit.accept(visitor); 
    } 

    public static IASTTranslationUnit getIASTTranslationUnit(char[] code) throws Exception { 
     FileContent fc = FileContent.create("", code); 
     Map<String, String> macroDefinitions = new HashMap<>(); 
     String[] includeSearchPaths = new String[0]; 
     IScannerInfo si = new ScannerInfo(macroDefinitions, includeSearchPaths); 
     IncludeFileContentProvider ifcp = IncludeFileContentProvider.getEmptyFilesProvider(); 
     IIndex idx = null; 
     int options = ILanguage.OPTION_IS_SOURCE_UNIT; 
     IParserLogService log = new DefaultLogService(); 
     return GPPLanguage.getDefault().getASTTranslationUnit(fc, si, ifcp, idx, options, log); 
    } 
} 

結果: 宣言が見つかりました。 宣言が見つかりました:void test(){a ++;}

関連する問題