【问题标题】:Add keywords that consist of two words to CDT将包含两个单词的关键字添加到 CDT
【发布时间】:2019-11-18 21:40:38
【问题描述】:

要为我设置自定义关键字,请执行以下操作:

  • plugin.xml 中定义一种语言并扩展GPPLanguage 类。
  • 扩展 CLanguageKeywords 并覆盖 getKeywords 以返回 super.getKeywords 和自定义关键字:

    public class MyLanguageKeywords extends CLanguageKeywords {
        public MyLanguageKeywords(ParserLanguage language, IScannerExtensionConfiguration config) {
            super(language, config);
        }
    
        @Override
        public String[] getKeywords() {
        String[] cppKeywords = super.getKeywords();
            String[] myKeywords = new String[] {
                "input",
                "output",
                "input port",
                "output port",
            };
            return (String[]) ArrayUtils.addAll(cppKeywords, myKeywords);
        }
    }
    
  • 实现 getAdapter() 以返回 MyLanguageKeywords 的实例

这适用于“输入”和“输出”,但不适用于“输入端口”或“输出端口”。如何在“输入端口”或“输出端口”组合中突出显示“端口”的关键字?

【问题讨论】:

    标签: java eclipse eclipse-cdt


    【解决方案1】:

    我能想到两个选择:

    1. 修改 CDT 的词法分析器以支持包含空格的关键字。我不认为这是你可以使用公共 API 做的事情,你必须修改核心 CDT 类,如org.eclipse.cdt.internal.core.parser.scanner.Lexer。 (或者,您可以考虑将补丁添加到词法分析器的上游。)

    2. 使用 语义突出显示 突出显示包含空格的关键字。有一个 org.eclipse.cdt.ui.semanticHighlighting 扩展点允许插件提供自定义语义突出显示。

    用户体验的不同之处在于,在每次击键后立即应用词汇突出显示,而在键入停止后短暂延迟后应用语义突出显示(因为计算成本更高)。如果您比较 overridefinal 关键字当前在 C++ 中的突出显示方式,与其他关键字相比,您可以看到这种效果:overridefinal 使用语义突出显示,因为它们是上下文相关的关键字。

    我还应该提到,第二种方法是否有效,取决于您的新关键字如何适应语法。需要将它们解析为 IASTName 以便对其应用语义突出显示。

    【讨论】:

    • 我可以从 Lexer 继承并重写一个方法来获得所需的行为,如果该类未声明为 final。我认为CDT代码有太多这样的限制。我的公司不希望分叉 CDT,所以我将尝试第二种方法。
    • @Sadik 将考虑从一个妨碍插件的类中删除 final 的补丁。
    • >>它们需要被解析为 IASTName
    • @Sadik 你是如何自定义解析器的?
    • 我的源解析器类继承自 GNUCPPSourceParser,并在我的语言类的 createParser() 方法中实例化。我的语言类继承自 GPLanguage。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多