我使用强大的 ANTLR4 库实现了简单的预处理器。该程序本身会运行多次迭代 - 在每次迭代中, future 的输出都会略有修改。
目前我使用TokenStreamRewriter及其方法 delete
、insertAfter
、replace
和 getText
。
不幸的是,我无法重写之前重写的 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/