Eclipse plugin 禁用语法错误“;符号<;id>;“无法解决”;对于Eclipse插件中使用CDT的一些符号 在我的Eclipse插件中,我想支持我的工具语言,它扩展了C++的一些关键字和概念。我的语言类、编辑器类和源解析类都继承了C++的CDT类。我可以解析关键字并将它们的节点添加到AST。但我的一些关键字/命令编辑器将始终标记为“符号无法解析”

Eclipse plugin 禁用语法错误“;符号<;id>;“无法解决”;对于Eclipse插件中使用CDT的一些符号 在我的Eclipse插件中,我想支持我的工具语言,它扩展了C++的一些关键字和概念。我的语言类、编辑器类和源解析类都继承了C++的CDT类。我可以解析关键字并将它们的节点添加到AST。但我的一些关键字/命令编辑器将始终标记为“符号无法解析”,eclipse-plugin,eclipse-cdt,Eclipse Plugin,Eclipse Cdt,例如: 有一个命令“@result”,它将上一次计算的结果作为枚举值返回,枚举值在工具核心的某个头文件中定义 typedef enum { OK = 0; WARNING = 1; ERROR = 2; } errCode_t; 因此命令@result返回0、1或2。但在编辑器中,该命令被标记为“@result”符号,无法解析。不,我想告诉索引器不要试图解析这个令牌 在预处理器类中,我可以将令牌类型从IToken.tIDENTIFIER更改为50000。我试图通过这种方

例如: 有一个命令“@result”,它将上一次计算的结果作为枚举值返回,枚举值在工具核心的某个头文件中定义

typedef enum {
    OK = 0;
    WARNING = 1;
    ERROR = 2;
} errCode_t;
因此命令
@result
返回0、1或2。但在编辑器中,该命令被标记为“@result”符号,无法解析。不,我想告诉索引器不要试图解析这个令牌

在预处理器类中,我可以将令牌类型从
IToken.tIDENTIFIER
更改为50000。我试图通过这种方式实现的是

if (token.getType() == 50000) {
    // don't try to resolve symbol
    return null;
} else {
    return super.resolveSymbol();
}

有办法吗?我想我的第一个问题是,我不明白谁或什么应该对语法错误标记负责(可能是索引器?)

格式
符号的错误。。。无法解决的
是由CDT的代码分析组件生成的,特别是
ProblemBindingChecker
,它遍历AST并报告任何
IASTName
的错误,该错误通过
IASTName.resolveBinding()
)解析为
ProblemBinding


只有
IASTName
节点解析为绑定,因此,如果您的
@result
标记出现此错误,则表明解析器正在为其构建
IASTName
节点。如果您更改了令牌类型,我不确定这是如何发生的,我想这取决于您在扩展解析器中如何处理新的令牌类型。

关于更改令牌类型的说明有点误导。当令牌是IToken.tIDENTIFIER时,问题就出现了。谢谢。你的回答帮助我解决了这个问题。我已经(a)编写了一个子类NodeFactory,它创建(b)一个子类NameNode,该子类(c)重写resolveBinding()以检查“name”是否为“@result”,如果是,则返回null,否则super会这样做。