使用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.)要求用户手动执行此设置。
如何仅为我自己的其他关键字停用语法错误标记?
如何仅为我自己的其他关键字停用语法错误标记?
简短的回答是你不能。
解析器没有办法区分“由您的附加关键字引起的语法错误”和“由其他东西引起的语法错误”,而不是以这种方式教授。在对这样的关键字进行编码之后,它也没有办法恢复解析,这样,声明的后续部分(或表达式或关键字出现的任何上下文)都被正确解析,而不是以这种方式教授。
要教解析器这些东西,你必须以新的方式修改/扩展它。我不知道当前的扩展点可以允许你这样做,所以你必须分叉提供解析器的插件,或者上游的新扩展点。
我成功地停用了语法错误,我想简要地写下我是如何做到的:
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定义添加自己的关联。