Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将包含两个单词的关键字添加到CDT_Java_Eclipse_Eclipse Cdt - Fatal编程技术网

Java 将包含两个单词的关键字添加到CDT

Java 将包含两个单词的关键字添加到CDT,java,eclipse,eclipse-cdt,Java,Eclipse,Eclipse Cdt,要拥有自定义关键字,请执行以下操作: 在plugin.xml中定义一种语言,并扩展GPPLanguage类 扩展CLanguageKeywords并覆盖getKeywords以返回super.getKeywords和自定义关键字: public class MyLanguageKeywords extends CLanguageKeywords { public MyLanguageKeywords(ParserLanguage language, IScannerExtensionC

要拥有自定义关键字,请执行以下操作:

  • 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的实例


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

我可以想到两个选项:

  • 修改CDT的lexer以支持包含空格的关键字。我认为这不是使用公共API可以做到的,您必须修改核心CDT类,如
    org.eclipse.CDT.internal.core.parser.scanner.Lexer
    。(或者,您可以考虑向上添加补丁以向Listor添加这样的支持)

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

  • 用户体验的不同之处在于,每次击键后都会立即应用词汇突出显示,而在键入停止后的短暂延迟后应用语义突出显示(因为计算成本更高)。如果比较C++中的<>代码>覆盖> < />代码>和>代码>最终< /代码>关键字,与其他关键字相比:“代码> >覆盖> <代码>和<代码>最终< /代码>,使用语义突出显示,因为它们是上下文敏感的关键字。


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

    如果类没有声明为final,我可以从Lexer继承并重写一个方法来获得所需的行为。我认为CDT代码有太多这样的限制。分叉CDT在我的公司是不受欢迎的,所以我将尝试第二种方法。@Sadik一个补丁,从一个类中删除一个
    final
    ,它阻碍了一个插件,将被考虑。>>它们需要被解析为IASTName@Sadik如何自定义解析器?我的源解析器类继承自GnucpsSourceParser,并在我的语言类的createParser()方法中实例化。我的语言类继承自GPPLanguage。