コメント内の文字列を復元

タダね、これだと、実は余りうまくない。
SQL内の空白は、最悪消えても良いのだけど、
コメント内の空白文字は、消えてしまっては困るのです。
何故なら、IFコメントとかのexpression部分は外部の式言語にそのまま食わせるから。

空白のスキップとクォート出来る様にしてみた。 - 設計と実装の狭間で。

への処方箋。
ANTLRのCommonTree+CommonTokenを使っていると、ツリーに対してそのテキスト内での位置とかを後から参照できます。空白を消さないようにする、というよりは、位置を覚えておいてパース後に対象のバッファから該当位置を範囲指定で引きずり出してくるほうが楽かと。

手前味噌で申し訳ないですが、Irenkaのクエリ言語でCommonTreeからそのパース前のテキスト上の位置を引っ張ってくる例です。

/**
 * 指定のノードに対し、指定のツリーを関連付ける。
 * @param <T> ノードの型
 * @param node ノード
 * @param tree 関連付けるツリー
 * @return ノード
 */
protected <T extends AbstractAstQueryNode> T bless(T node, CommonTree tree) {
    if (tokenStream == null) {
        return node;
    }
    else if (tree.getTokenStartIndex() < 0 || tree.getTokenStopIndex() < 0) {
        return node;
    }
    else {
        CommonToken start = (CommonToken) tokenStream.get(tree.getTokenStartIndex());
        CommonToken stop = (CommonToken) tokenStream.get(tree.getTokenStopIndex());
        IrenkaQueryPosition pStart = positionStart(start);
        IrenkaQueryPosition pStop = positionStop(stop);
        node.setLocation(pStart, pStop);
        return node;
    }
}

private IrenkaQueryPosition positionStart(CommonToken token) {
    return new IrenkaQueryPosition(
        token.getLine(),
        token.getCharPositionInLine(),
        token.getStartIndex());
}

private IrenkaQueryPosition positionStop(CommonToken stop) {
    return new IrenkaQueryPosition(
        stop.getLine(),
        stop.getCharPositionInLine() + stop.getText().length(),
        stop.getStopIndex());
}