如何使用Antlr4的访问者模型在翻译器中添加回注释/空格



我目前正在使用ANTLR4访问者方法编写TSQL(Sybase/Microsoft SQL(到MySQL的转换器。

我可以将评论和空白推送到不同的频道,以便以后可以使用这些信息。

不太清楚的是:

  1. 如何取回数据
  2. 更重要的是,我如何将注释和空白区重新插入到翻译后的MySQL代码中

Re:#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的行必须四处移动,删除一些行,添加一些行。

任何帮助都将不胜感激。

谢谢。

ANTLR4 lexer创建了许多令牌,每个令牌都有一个索引(一个运行数(。如果你不只是跳过一个令牌,那么一旦解析步骤完成,所有令牌都可以供稍后检查,而不管它们的通道是什么(通道实际上只是令牌上的一个数字属性(。

因此,如果您有一个要翻译的令牌,请获取其索引,然后向令牌流询问具有下一个较小索引或下一个较高索引的令牌。这些通常是隐藏的空白区域。

一旦有了空白标记,就可以使用它的开始和停止索引从char流中获取原始文本。既然你知道自己在翻译过程中的位置,那么就很容易知道把原文插入哪里。

相关内容

  • 没有找到相关文章

最新更新