2017-02-06 4 views
1

Я пытаюсь проанализировать источник C++ с помощью парсера CDT, кроме eclipse.Использование анализатора CDT из Eclipse (как сделать проект?)

Чтобы получить AST, я должен сделать, проиндексировать, IncludeFileContentProvider. Чтобы сделать индекс, мне нужно сделать проект. Я думаю, что этот проект означает проект eclipse.

Но я использую парсер CDT за пределами затмения. В этом случае, как сделать проект.

+0

Я мало знаю о написании автономных приложений на основе платформы Eclipse, но вам, вероятно, потребуется создать рабочее пространство и использовать рабочее пространство для создания проект. Некоторые соответствующие API: 'ResourcesPlugin.getWorkspace()', 'IWorkspace.newProjectDescription()', 'IWorkspace.getRoot()', 'IWorkspaceRoot.getProject()', 'IProject.create()'. Когда вы создаете проект Eclipse ('IProject'), для создания проекта CDT (' ICProject') требуется следующий шаг: 'CCorePlugin.getDefault(). CreateCDTProject()'. – 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); 
    } 
} 

Результаты: Найдено заявление: Int А; Нашел объявление: void test() {a ++;}