【问题标题】:Using CDT parser out of Eclipse(How to make project?)在 Eclipse 中使用 CDT 解析器(如何制作项目?)
【发布时间】:2017-06-23 07:50:00
【问题描述】:

我正在尝试使用 CDT 解析器来解析 C++ 源代码,而不是 eclipse。

要获得 AST,我必须创建、索引、IncludeFileContentProvider。 要制作索引,我需要制作项目。我认为这个项目意味着eclipse项目。

但我在 Eclipse 之外使用 CDT 解析器。 在这种情况下如何制作项目。

【问题讨论】:

  • 我对编写基于 Eclipse 平台的独立应用程序了解不多,但您可能需要创建一个工作区,并使用该工作区创建一个项目。一些相关的 API:ResourcesPlugin.getWorkspace()IWorkspace.newProjectDescription()IWorkspace.getRoot()IWorkspaceRoot.getProject()IProject.create()。有了 Eclipse 项目 (IProject) 后,还需要通过 CCorePlugin.getDefault().createCDTProject() 创建 CDT 项目 (ICProject)。
  • 此外,要使ResourcesPlugin.getWorkspace() 工作,您可能需要执行以下操作:wiki.sei.cmu.edu/aadl/index.php/…
  • (本教程可能比较简单:developertesting.com/archives/month200508/…

标签: parsing eclipse-cdt indexer


【解决方案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++;}

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多