Parsing 自定义嵌入式语言netbeans

Parsing 自定义嵌入式语言netbeans,parsing,netbeans,antlr,netbeans-8,netbeans-plugins,Parsing,Netbeans,Antlr,Netbeans 8,Netbeans Plugins,我正在为Netbeans IDE开发插件,它将为新的自定义语言提供支持。我已经使用ANTLR特性为我的自定义语言创建了解析器和词法分析器。此外,我的语言包含一些非常复杂的“类SQL”查询,因此我决定为“类SQL”查询编写单独的语法。因此,我不得不为我的“类似SQL”语言制作解析器和词法分析器。因此,我有两种语言,“类似SQL”的语言是一种嵌入式语言。 Netbeans提供了负责嵌入语言的类这是我的EmbeddingProvider: @EmbeddingProvider.Registration

我正在为Netbeans IDE开发插件,它将为新的自定义语言提供支持。我已经使用ANTLR特性为我的自定义语言创建了解析器和词法分析器。此外,我的语言包含一些非常复杂的“类SQL”查询,因此我决定为“类SQL”查询编写单独的语法。因此,我不得不为我的“类似SQL”语言制作解析器和词法分析器。因此,我有两种语言,“类似SQL”的语言是一种嵌入式语言。 Netbeans提供了负责嵌入语言的类
这是我的EmbeddingProvider:

@EmbeddingProvider.Registration(mimeType = "text/x-lorx", targetMimeType = "text/x-sqll")
public class LorxEmbeddingProvider extends EmbeddingProvider {

    @Override
    public List<Embedding> getEmbeddings(Snapshot snapshot) {
        TokenHierarchy th = snapshot.getTokenHierarchy();
        TokenSequence<LorxTokenId> ts = th.tokenSequence(LorxTokenId.getLanguage());
        List<Embedding> embeddings = new ArrayList<>();

        while(ts.moveNext()) {
            Token currToken = ts.token();
            if(currToken.id().ordinal() == LorxTokenType.SqllLiteral.id) {
                embeddings.add(snapshot.create(currToken.text(), "text/x-sqll"));
            }
        }
        return embeddings;
    }

    @Override
    public int getPriority() {
        return 140;
    }

    @Override
    public void cancel() {

    }

}

在完成
getEmbeddings(Snapshot Snapshot)
method之后,嵌入式语言的
SqllParserFactory
为sqll语言创建新的解析器,然后什么也不发生。我想知道我是否走上了正确的道路,如果有人告诉我如何将嵌入式语言文本拆分为标记,我也会很高兴。

您可以尝试使用LanguageProvider,而不是使用EmbeddingProvider

@ServiceProvider(service = LanguageProvider.class)
public class MyEmbeddingLanguageProvider extends LanguageProvider {

    @Override
    public LanguageEmbedding<?> findLanguageEmbedding(Token<?> token, 
            LanguagePath languagePath, InputAttributes inputAttributes) {

        Language embeddedLanguage = MimeLookup.getLookup("text/sqll").lookup(Language.class);

        if (embeddedLanguage != null && languagePath.mimePath().equals("text/x-lorx")) {
            if (token.id().ordinal() == LorxTokenType.SqllLiteral.id) {
                return LanguageEmbedding.create(embeddedLanguage, 0, 0, true);
            }
        }
        return null;
    }

    @Override
    public Language<?> findLanguage(String mimeType) {
        return null;
    }
}
@ServiceProvider(service=LanguageProvider.class)
公共类MyEmbeddingLanguageProvider扩展了LanguageProvider{
@凌驾
公共语言嵌入findLanguageEmbedding(令牌,
语言路径语言路径,输入属性(输入属性){
Language embeddedLanguage=MimeLookup.getLookup(“text/sqll”).lookup(Language.class);
if(embeddedLanguage!=null&&languagePath.mimePath().equals(“text/x-lorx”)){
if(token.id().ordinal()==LorxTokenType.SqllLiteral.id){
返回LanguageEmbedding.create(embeddedLanguage,0,0,true);
}
}
返回null;
}
@凌驾
公共语言findLanguage(字符串mimeType){
返回null;
}
}

它应该适用于两种语言的标记化(这可以产生漂亮的语法着色)。不幸的是,对嵌入式语言的解析可能不起作用。

这个问题已经通过类
语言层次结构中的重写方法解决了。我以前试图重写此方法,但使用错误。问题在于将错误的参数传递给方法
LanguageEmbedding.create(SqllTokenId.getLanguage(),0,0)。我没有传递零,而是传递了令牌的长度,因此它跳过了令牌,因为第二个参数是startSkipLength,第三个参数是endSkipLength。下面的代码是正确的。LorxTokenType.SqllLiteral
是我的“类似sql”查询的标记。它现在被解析为一种嵌入式语言,并由另一个lexer和解析器(在我的例子中是由Sqll lexer和解析器)处理

@覆盖
受保护的语言嵌入(令牌令牌、语言路径语言路径、InputAttribute InputAttribute){
if(token.id().ordinal()==LorxTokenType.SqllLiteral.id){
返回LanguageEmbedding.create(SqllTokenId.getLanguage(),0,0);
}
返回null;
}

这里的某个地方隐藏着一个有趣的问题,但事实上,几乎不可能说出您面临的实际问题是什么。我建议你仔细阅读你的问题,然后想象一下其他人是否能合理地理解它。你需要像我们不知道你在说什么一样向我们解释,因为老实说,我们不知道。请记住,你有很多我们没有的背景。如果OP已经有了ANTLR词法分析器和解析器,为什么在将(嵌入的)语言文本拆分成标记时会出现问题?这就是他的ANTLR lexer所做的。非常感谢你的回答。我已经找到了解决问题的办法。这是解决嵌入式语言的又一种方法。
@ServiceProvider(service = LanguageProvider.class)
public class MyEmbeddingLanguageProvider extends LanguageProvider {

    @Override
    public LanguageEmbedding<?> findLanguageEmbedding(Token<?> token, 
            LanguagePath languagePath, InputAttributes inputAttributes) {

        Language embeddedLanguage = MimeLookup.getLookup("text/sqll").lookup(Language.class);

        if (embeddedLanguage != null && languagePath.mimePath().equals("text/x-lorx")) {
            if (token.id().ordinal() == LorxTokenType.SqllLiteral.id) {
                return LanguageEmbedding.create(embeddedLanguage, 0, 0, true);
            }
        }
        return null;
    }

    @Override
    public Language<?> findLanguage(String mimeType) {
        return null;
    }
}
@Override
    protected LanguageEmbedding<?> embedding(Token<LorxTokenId> token, LanguagePath languagePath, InputAttributes inputAttributes) {
        if(token.id().ordinal() == LorxTokenType.SqllLiteral.id) {
           return LanguageEmbedding.create(SqllTokenId.getLanguage(), 0, 0);
        }
        return null;
    }