Eclipse CDT扩展为构建另一种语言

时间:2015-10-29 20:34:37

标签: java eclipse eclipse-cdt

我想扩展gnu c的CDT语言插件,以此为基础创建某种新语言。

新语言应该在编辑器中具有不同的视觉外观。如果前面有一个特殊的预处理器指令(比如注释),我想用灰色为方法体着色。

有人知道在哪里扩展GCC语言进行这样的修改吗?

EDIT1:

作为示例,我希望 specialFunction 的方法体的颜色为灰色,作为示例注释的原因 - >的 #annotation

#annotation
int specialFunction(){
    return 1;
}

EDIT2:

到目前为止,我所尝试的是建立一种“扩展语言”。计划是突出显示预处理器位置并保存位置,以便下面的方法可以着色。我设法让预处理器关键字着色,但不是如何处理方法体颜色。

public class OwnKeyWords extends GCCLanguage implements ICLanguageKeywords

@Override
public String[] getPreprocessorKeywords() {
    //System.out.println("Called keywords" + timesPre++);
    return new String[]{
            "hide",
            "show"
    };
}

要着色的示例:

#hide
int specialFunction(){
    return 1;
}

在上面的示例中,“hide”将突出显示。

EDIT3:

我尝试实现ISemanticHighlighter并尝试了几种方法来突出显示我的代码:

CVariable
CFunction
ObjectStyleMacro
...

但不适用于使用预处理程序指令或其他任何内容突出显示方法体的情况。

ISemanticHighlighter中的注释:

 * NOTE: Implementors are not allowed to keep a reference on the token or on any object retrieved from the
 * token.

不是我想要实现的目标,因为我希望继续引用突出显示的对象以供以后操作。

也许org.eclipse.cdt.ui.text.folding.DefaultCFoldingStructureProvider也是一个选项,我无法为仪器着色,我可以隐藏它。

2 个答案:

答案 0 :(得分:2)

这听起来不像是语言高亮的新语言。

CDT有一个很棒的扩展点叫org.eclipse.cdt.ui.semanticHighlighting,允许您定义自定义语义突出显示规则。

以下是plugin.xml条目的示例:

   <extension
         point="org.eclipse.cdt.ui.semanticHighlighting">
      <semanticHighlighting
            class="com.example.SemanticHighlighter"
            defaultBold="true"
            defaultEnabled="true"
            defaultTextColor="35,0,35"
            displayName="Example Semantic Highlighter"
            id="com.example.SemanticHighlighter"
            preferenceKey="com.example.SemanticHighlighter.pref"
            priority="5">
      </semanticHighlighting>
   </extension>

然后在com.example.SemanticHighlighter中实施org.eclipse.cdt.ui.text.ISemanticHighlighter界面。只有一种方法consumes采用ISemanticToken。分析令牌以查看它是否与您的荧光笔相关并返回true以突出显示它。

以下是该方法的一个简单实现:

@Override
public boolean consumes(ISemanticToken token) {
    IBinding binding = token.getBinding();
    if (binding instanceof IFunction) {
        IASTNode node = token.getNode();
        if (binding != null && node instanceof IASTName && ((IASTName) node).isReference()) {
            String n = binding.getName();
            if ("MySpecialFunction".equals(n)) {
                return true;
            }
        }
    }
    return false;
}

实施后,用户可以通过首选项页面C/C++修改颜色和适用性 - Editor - Syntax Coloring

highlighting preference page

答案 1 :(得分:1)

您应该可以使用ISemanticHighlighter进行所需的突出显示。

对于使用特定注释着色函数体的示例,它可以像这样工作:

class MyHighlighter implements ISemanticHighlighter {
    @Override
    public boolean consumes(ISemanticToken token) {
        IASTNode node = token.getNode();

        // Walk up the AST to determine if 'node' is inside a function body.
        // If it's not, return false.

        // Navigate the AST some more to examine what comes before the
        // function's declaration. If it's the annotation in question,
        // return true. Otherwise, return false.
    }
}

我遗漏了如何导航AST的细节,但CDT有一个相当丰富的AST API,所以它绝对可行。如果你有这些问题,请随时提出具体问题。