1

我目前正在使用 ANTLR4 访问者方法编写一个 TSQL (Sybase/Microsoft SQL) 到 MySQL 的翻译器。

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

不太清楚的是:

  1. 我如何取回数据?
  2. 更重要的是,我如何将注释和空格插入到我翻译的 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 行,删除一些行并添加一些行。

任何帮助将不胜感激。

谢谢。

4

1 回答 1

2

ANTLR4 词法分析器创建许多标记,每个标记都有一个索引(一个运行编号)。如果您不只是跳过一个令牌,那么一旦完成解析步骤,所有令牌都可以供以后检查,无论它们的通道如何(通道实际上只是令牌上的一个数字属性)。

因此,假设您有一个要翻译的标记,获取它的索引,然后向标记流询问具有下一个较小索引或下一个较高索引的标记。这些通常是隐藏的空格。

获得空白标记后,使用它的开始和停止索引从 char 流中获取原始文本。而且由于您知道在翻译过程中所处的位置,因此应该很容易知道在哪里插入原始文本。

于 2020-07-20T06:44:32.130 回答