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

Java 8 关闭CDT中自定义关键字的语法错误标记,java-8,eclipse-plugin,eclipse-cdt,Java 8,Eclipse Plugin,Eclipse Cdt,使用CDT开发可能会令人沮丧,因为没有人回答您的问题,而且几乎没有任何文档。话虽如此,让我用一个简单的例子来试一下: 在Eclipse插件中,用户希望编辑与C++类似的语言文件。为了突出显示其他关键字,我创建了一个扩展GPPScannerExtensionConfiguration的类,如下所示: public class GRASPScannerExtensionConfiguration extends GPPScannerExtensionConfiguration { priv

使用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< <代码>或<代码> @标记> /Cube >在C++中突出显示,如Value>代码>。但编辑在这些关键词下面加了下划线,并说“语法错误”

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

如何仅为我自己的附加关键字停用语法错误标记

如何仅为我自己的附加关键字停用语法错误标记

简单的回答是你不能

如果没有这种方法,解析器无法区分“由附加关键字引起的语法错误”和“由其他原因引起的语法错误”。它也没有办法在遇到这样一个关键字后恢复解析,从而正确解析声明的后续部分(或表达式或关键字出现在的任何上下文中),而无需进行这样的教导


要教解析器这些东西,您必须以新的方式修改/扩展它。我不知道当前的扩展点是否允许您这样做,因此您必须使用提供解析器的插件,或者向其上游提供新的扩展点。

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

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);
        }
    }
}
我创建了一个短存储类来存储参数。但是,如果“@”后面没有“func”,则只调用超类的
handleProblem
方法。这在下一步中完成:

@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);
}
(三) 使用扩展点
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.)我不知道内容类型绑定有什么问题,但它不起作用。我向社区询问了这件事。但是,您可以通过窗口->首选项->常规->内容类型定义添加您自己的关联

扩展名ppoint
org.eclipse.cdt.corel.ErrorParser
帮助?@Sadik
IErrorParser
用于解析来自编译器输出的错误消息,以便错误消息可以显示在Problems视图中。这与CDT解析器产生的语法错误无关。扩展
GNUCPPSourceParser
GPPParserExtensionConfiguration
如何?如果能够覆盖相关方法,扩展
GNUCPPSourceParser
可能会起作用。这些新关键字在语法上出现在哪里?您尝试实现的语言扩展是否有一些文档?例如,
@func
位于函数定义之前,可以与静态或易失性组合,如
@func static void private_function(){…}
另一个是
@call
,用于调用函数(以某种方式)比如
@call(private_function())
。这些已经是最重要的。它们都以@开头。有用户手册,但仅适用于客户。没那么有趣。