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

时间:2019-04-16 14:52:28

标签: java-8 eclipse-plugin eclipse-cdt

使用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.)需要用户手动进行此设置。

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

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 定义添加自己的关联。