使用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.)需要用户手动进行此设置。
如何仅对自己的其他关键字停用语法错误标记?
答案 0 :(得分:1)
如何仅对自己的其他关键字停用语法错误标记?
最简单的答案是你不能。
解析器无法区分“由您的附加关键字引起的语法错误”和“由其他原因引起的语法错误”,而没有被教导。遇到这样的关键字后,它也没有办法恢复分析,这样一来,就可以正确地解析声明的后续部分(或表达式或关键字所出现的任何上下文),而又不会被教导这种方式。>
要教解析器这些事情,您必须以新的方式修改/扩展它。我不知道允许您执行此操作的当前扩展点,因此您必须派生提供解析器的插件,或上游的新扩展点。
答案 1 :(得分:0)
我成功停用了语法错误,我想简单记下我的操作方式:
1。)编写一个扩展scrollImg.maximumZoomScale = 10.0
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView?
{
return viewImgBig
}
并覆盖CPreprocessor
的类。在我的情况下,我的关键字是“ @func”,但标记为“ @”和“ func”。 “ @”被放入问题列表,该问题列表由handleProblem
处理。
handleProblem
我创建了一个简短的Storage类来存储参数。但是,如果“ @”后没有“ func”,则仅调用超类的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);
}
}
}
方法。这是在handleProblem
中完成的:
nextToken
这基本上忽略了“ @func”。流浪者“ @”仍会被标记为问题。
2。)定义您自己的语言类,扩展GPPLanguage并覆盖@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;
}
:
createScanner
3。)
将扩展名为protected IScanner createScanner(FileContent content, IScannerInfo scanInfo, IncludeFileContentProvider fcp,
IParserLogService log) {
return new GRASPPreprocessor(content, scanInfo, getParserLanguage(), log,
getScannerExtensionConfiguration(scanInfo), fcp);
}
的扩展名添加到plugin.xml中,并告诉插件该语言必须使用哪种内容类型:
org.eclipse.cdt.core.language
4。)我不知道内容类型绑定有什么问题,但是它不起作用。我询问了社区here。但是,您可以通过 Window-> Preferences-> General-> Content Types 定义添加自己的关联。