Antlr4在ParseTreeWalker中使用TokenStreamRewriter

时间:2018-08-03 17:38:23

标签: antlr4

目标:
要替换我在.g4文件中定义的规则的修改文本,该文本将在输入String
的侦听器类中输入和退出 我的代码:

def textModify(input: String) = {  
    val loadLexer = new DSLSQLLexer(new ANTLRInputStream(input))  
    val tokens = new CommonTokenStream(loadLexer)  
    val rewriter = new TokenStreamRewriter(tokens)    
    val parser = new DSLSQLParser(tokens)  
    parser.statement()  
    ParseTreeWalker.DEFAULT.walk(listener, stat)  
}

但是如何在只能获取上下文的enter函数中调用rewriter
还是可以只在textModify()中重写它?但是rewriter.replace()需要index的令牌,我在调用该令牌时不知道。

我认为显示真实情况可能会更容易:
我定义了这样的规则:

proJob
    : realJob
    ;
realJob
    : job
    ;

job
    : IDENTIFIER
    | quotedIdentifier
    ;

quotedIdentifier
    : BACKQUOTED_IDENTIFIER
    ;
IDENTIFIER
    : (LETTER | DIGIT | '_')+
    ;
BACKQUOTED_IDENTIFIER
    : '`' ( ~'`' | '``' )* '`'
    ;

我想在令牌符合规则proJob时更改令牌的文本,例如:
输入I am a teacher.将进入规则proJob函数,我想将teacher修改为teacher_blahblahblah,我该如何管理

1 个答案:

答案 0 :(得分:0)

要在侦听器方法中使用重写器,只需将其设为侦听器的实例变量即可。然后这些方法将可以访问它。