如何使用antlr4的visitor模型在translator中添加回注解/空白

egmofgnx  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(358)

我目前正在使用antlr4 visitor方法编写一个tsql(sybase/microsoftsql)到mysql的转换器。
我可以将注解和空格推送到不同的频道,以便以后使用这些信息。
不太清楚的是:
我该如何取回数据?
更重要的是,如何将注解和空格插入到已翻译的mysql代码中?
回复:#1,这似乎可以获得所有标记的列表,包括注解/空白:

public static List<Token> getHiddenTokensFromString(String sqlIn, int hiddenChannel) {
    CharStream charStream = CharStreams.fromString(sqlIn);
    CaseChangingCharStream upper = new CaseChangingCharStream(charStream, true);
    TSqlLexer lexer = new TSqlLexer(upper);
    CommonTokenStream commonTokenStream = new CommonTokenStream(lexer, hiddenChannel);
    commonTokenStream.fill();
    List<Token> hiddenTokens = commonTokenStream.getTokens();
    return hiddenTokens;
}

关于#2,特别具有挑战性的是,作为翻译的一部分,必须移动sql的行,删除一些行,添加一些行。
任何帮助都将不胜感激。
谢谢。

ohfgkhjo

ohfgkhjo1#

antlr4 lexer创建了许多令牌,每个令牌都有一个索引(一个运行的数字)。如果您不只是跳过一个令牌,那么一旦解析步骤完成,所有令牌都可以供以后检查,而不管它们的通道是什么(通道实际上只是令牌上的一个数字属性)。
因此,假设您有一个要翻译的令牌,获取其索引,然后向令牌流请求具有下一个较小索引或下一个较高索引的令牌。这些通常是隐藏的空白。
一旦有了空白标记,就可以使用它的start和stop索引从char流中获取原始文本。既然你知道你在翻译的过程中,当你这样做,它应该很容易知道在哪里插入原文。

相关问题