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