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

标签 antlr token antlr4

我使用强大的 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/

相关文章:

regex - antlr 中一些 token 名称后面的 '^' 是做什么的?

go - oauth2 无法获取 token : bad request

ios - 带有 CDN token 的 HLS - iOS

antlr4 - ANTLR 4 : How to know the existence of subpart in rule

c# - ANTLR4 - VisitChildren 返回 null,即使 child 返回某个对象

java - ANTLR 正则表达式中的范围量词语法

antlr - "Implicit token definition in parser rule"有什么值得担心的吗?

java - 从词法分析器/解析器语法生成产生式

antlr - 如何使用 ANTLRWorks 创建/指定用于测试树语法的 AST 输入?

java - HttpClient - 如何设置指纹和_csrf?