Использование парсера CDT вне Eclipse (как сделать проект?)

Я пытаюсь разобрать исходный код C++ с помощью синтаксического анализатора CDT, кроме eclipse.

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

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


person Ui-Gyun Jeong    schedule 06.02.2017    source источник
comment
Я мало что знаю о написании автономных приложений на основе платформы Eclipse, но вам, вероятно, потребуется создать рабочее пространство и использовать его для создания проекта. Некоторые соответствующие API: ResourcesPlugin.getWorkspace(), IWorkspace.newProjectDescription(), IWorkspace.getRoot(), IWorkspaceRoot.getProject(), IProject.create(). Если у вас есть проект Eclipse (IProject), необходимо сделать следующий шаг, чтобы создать проект CDT (ICProject) через CCorePlugin.getDefault().createCDTProject().   -  person HighCommander4    schedule 07.02.2017
comment
Более того, для работы ResourcesPlugin.getWorkspace() вам может понадобиться сделать что-то вроде этого: wiki.sei.cmu.edu/aadl/index.php/   -  person HighCommander4    schedule 07.02.2017
comment
(Это руководство может быть проще: developertesting.com/archives/month200508/)   -  person HighCommander4    schedule 07.02.2017


Ответы (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 a; Найдена декларация: void test() {a++;}

person ducanhnguyen    schedule 14.07.2017