关闭CDT中自定义关键字的语法错误标记

问题描述 投票:1回答:2

使用CDT进行开发可能会令人沮丧,因为没有人回答您的问题并且几乎没有任何文档。话虽这么说,让我用一个简单的尝试:

在我的eclipse插件中,用户想要使用类似于C ++的语言编辑文件。为了突出显示其他关键字,我创建了一个扩展GPPScannerExtensionConfiguration的类,如下所示:

public class GRASPScannerExtensionConfiguration extends GPPScannerExtensionConfiguration {

    private static GRASPScannerExtensionConfiguration instance;

    public static synchronized GRASPScannerExtensionConfiguration getInstance() {
        if (instance == null)
            instance = new GRASPScannerExtensionConfiguration(version(8, 0));
        return instance;
    }

    public GRASPScannerExtensionConfiguration(int version) {
        super(version);

        /*
         * add GRASP specific configuration
         */
        addKeyword("@func".toCharArray(), IToken.t_void);
        addKeyword("@tag".toCharArray(), IToken.t_void);
    }
}

在这个课程中,我的关键字@func@tag在C ++中突出显示为void。但是编辑器强调了这些关键字,并说“语法错误”。

我知道我可以在Window -> Preferences -> General -> Editors -> Text Editors -> Annotations中停用语法错误,但这会1.)停用所有语法错误,并且2.)要求用户手动执行此设置。

如何仅为我自己的其他关键字停用语法错误标记?

java-8 eclipse-plugin eclipse-cdt
2个回答
1
投票

如何仅为我自己的其他关键字停用语法错误标记?

简短的回答是你不能。

解析器没有办法区分“由您的附加关键字引起的语法错误”和“由其他东西引起的语法错误”,而不是以这种方式教授。在对这样的关键字进行编码之后,它也没有办法恢复解析,这样,声明的后续部分(或表达式或关键字出现的任何上下文)都被正确解析,而不是以这种方式教授。

要教解析器这些东西,你必须以新的方式修改/扩展它。我不知道当前的扩展点可以允许你这样做,所以你必须分叉提供解析器的插件,或者上游的新扩展点。


0
投票

我成功地停用了语法错误,我想简要地写下我是如何做到的:

1.)写一个扩展CPreprocessor并覆盖handleProblem的类。在我的情况下,我的关键字是“@func”,但它被标记为“@”和“func”。 '@'被放入handleProblem处理的问题列表中。

import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
...
public class GRASPPreprocessor extends CPreprocessor {
    public GRASPPreprocessor(FileContent fileContent, IScannerInfo info, ParserLanguage language, IParserLogService log,
        IScannerExtensionConfiguration configuration, IncludeFileContentProvider readerFactory) {
        super(fileContent, info, language, log, configuration, 
    }

    @Override
    public void handleProblem(int id, char[] arg, int offset, int endOffset) {
        if (new String(arg).equals("@")) {
            this.problem = new ProblemStorage(id, arg, offset, endOffset);
        } else {
            super.handleProblem(id, arg, offset, endOffset);
        }
    }
}

我创建了一个简短的Storage类来存储参数。但是只调用超类的handleProblem方法,如果“@”后面没有“func”。这是在nextToken完成的:

@Override
public IToken nextToken() throws EndOfFileException {

    IToken token = super.nextToken();
    if(problem != null && token.getType() == IToken.tIDENTIFIER) {
        if (new String(token.getCharImage()).equals("func")) {
            problem = null;
            return super.nextToken();
        } else {
            super.handleProblem(problem.id, problem.arg, problem.offset, problem.endOffset);
            return token;
        }
    }
    return token;
}

这基本上忽略了“@func”。流浪'@'仍然会被标记为问题。

2.)定义您自己的语言类,扩展GPPLanguage并覆盖createScanner

protected IScanner createScanner(FileContent content, IScannerInfo scanInfo, IncludeFileContentProvider fcp,
        IParserLogService log) {
    return new GRASPPreprocessor(content, scanInfo, getParserLanguage(), log,
            getScannerExtensionConfiguration(scanInfo), fcp);
}

3.)使用扩展点org.eclipse.cdt.core.language向plugin.xml添加扩展,并告诉插件该语言必须使用哪种内容类型:

 <extension
     point="org.eclipse.core.contenttype.contentTypes">
  <content-type
        file-extensions="grasp"
        id="de.blub.contenttype.grasp"
        name="GRASP"
        priority="high">
  </content-type>
</extension>
<extension
     point="org.eclipse.cdt.core.language">
  <language
        class="de.blub.language.GRASPLanguage"
        id="de.blub.language.grasp"
        name="Great Alternative Stupid Language">
     <contentType
           id="de.blub.contenttype.grasp">
     </contentType>
  </language>

4.)我不知道内容类型绑定有什么问题,但它不起作用。我问社区here有关它。但是,您可以通过Window-> Preferences-> General-> Content Types定义添加自己的关联。

© www.soinside.com 2019 - 2024. All rights reserved.