gpt4 book ai didi

antlr - 如何使用 ANTLR4 多次重写 token 流

转载 作者:行者123 更新时间:2023-12-05 07:57:56 25 4
gpt4 key购买 nike

我使用强大的 ANTLR4 库实现了简单的预处理器。该程序本身会运行多次迭代 - 在每次迭代中, future 的输出都会略有修改。

目前我使用TokenStreamRewriter及其方法 deleteinsertAfterreplacegetText

不幸的是,我无法重写之前重写的 token (得到 IllegalArgumentException)。这is not a bug但根据source code无法以任何方式实现多次替换。

我认为存在适当的解决方案,因为这似乎是一个常见问题。有人可以提示我吗?我宁愿使用一些现有的和经过测试的解决方案,也不愿重新实现重写器本身。

也许重写器不是合适的工具。

感谢帮助

最佳答案

晚上好现在是同一问题的动态代码。首先,您必须在您的监听器类中使 token 流和重写器可见这是我的 VB6Mylistener 类的构造函数代码

class VB6MYListener : public VB6ParserListener {
public: string FicName;
int numero ; // numero de la regle
wstring BaseFile;
CommonTokenStream* TOK ;
TokenStreamRewriter* Rewriter ;

// Fonctions pour la traduction avec le listener void functions
created by ANTLR4 ( contextes )

VB6MYListener( CommonTokenStream* tok , wstring baseFile, TokenStreamRewriter* rewriter , string Name)
{
TOK = tok; // Flux de tokens
BaseFile = baseFile; // Fichier entree en VB6
Rewriter = rewriter;
FicName = Name; // Nom du fichier courant pour suivi
}

在上下文中,我与听众发生了冲突。 Tokenstream 对所有函数都是 TOK 可见的 void

std::string retourchaine;
std::vector<std::string> TAB{};
for (int i = ctx->start->getTokenIndex(); i <= ctx->stop>getTokenIndex(); i++)
{
TAB.push_back(TOK->get(i)->getText()); // HERE TOK
}
for (auto element : TAB)
{
if (element == "=") { element = ":="; }
if (element != "As" && element != "Private" && element != "Public")
{
std::cout << element << std::endl;
retourchaine += element ; // retour de la chaine au contexte
}
}
retourchaine = retourchaine + " ;";

Rewriter->replace(ctx->start, ctx->stop, retourchaine );
`

关于antlr - 如何使用 ANTLR4 多次重写 token 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26073557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com