我正在開發Netbeans IDE的插件,它將提供對新的自定義語言的支持。我使用ANTLR特性爲我的自定義語言創建瞭解析器和詞法分析器。此外,我的語言包含一些非常複雜的「類似於SQL」的查詢,因此我決定爲「SQL-like」查詢編寫單獨的語法。因此,我必須爲我的「類似SQL」語言製作解析器和詞法分析器。因此,我有兩種語言,其中「類似SQL的」語言是嵌入式語言。 Netbeans提供了EmbeddingProvider類,它負責嵌入語言。
這是我EmbeddingProvider:自定義嵌入式語言netbeans
@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() {
}
}
註釋是用於確定頂級語言("text/x-lorx"
)和它的嵌入式語言( 「文本/ X-sqll」)。 方法getEmbeddings(Snapshot snapshot)
執行時,我們在編輯器中打開某個文件或只是將脫字號移動到另一個位置。
我使用Snapshot
類來獲取當前打開文件的標記序列。在這個代碼示例中,我正在迭代令牌來搜索SqllLiteral令牌(這就像[select * from ...]
)。如果我找到這個令牌,我創建新的嵌入。
public class SqllParserFactory extends ParserFactory {
@Override
public Parser createParser(Collection<Snapshot> snapshots) {
return new SqllNBParser();
}
}
整理getEmbeddings(Snapshot snapshot)
方法,經過一個嵌入式語言SqllParserFactory
創建sqll語言新的分析器,然後偏偏不信邪。我想知道如果我是正確的,並且如果有人給我一個建議如何將嵌入式語言文本拆分爲令牌,我會很高興。
有一個有趣的問題隱藏在這裏*某處*,但事實上,幾乎不可能分辨出您面臨的實際問題。我建議閱讀你的問題,然後想象別人是否可以合理地理解它。你需要向我們解釋,因爲我們不知道你在說什麼,因爲說實話,我們不知道。請記住,你有很多我們不知道的背景。儘可能保持簡單和清晰。 – RubberDuck
如果OP已經有ANTLR詞法分析器和分析器,爲什麼在將(嵌入式)語言文本分解爲令牌時存在問題?這是他的ANTLR詞法分析程序*所做的。 –