クエリを SQL に変換する単純なパーサーを作成しています。パーサーを完成させ、AST を取得しましたが、ANTLR 4 を使用してこれらの文法を SQL に変換する必要があります。ANTLR 4 でクエリ"SELECT" as "SELECT", "FROM" to "FROM"
などを印刷または変換する方法を知っている人はいますか?
私は決定的なANTLR 4リファレンスブックに従っています。その中で、2 つの Java ファイルを作成する必要があります。
最初のJavaファイルでは、これらの手順に従うことを考えましたが、代わりに
public void enterInit(ArrayInitParser.InitContext ctx)
{
System.out.print('"');
}
私はに変更しました
public void enterSelect(ArrayInitParser.SelectContext ctx)
{
System.out.print('SELECT');
}
ShortToUnicodeString.java
public class ShortToUnicodeString extends ArrayInitBaseListener
{
/** Translate { to " */
@Override
public void enterInit(ArrayInitParser.InitContext ctx)
{
System.out.print('"');
}
/** Translate } to " */
@Override
public void exitInit(ArrayInitParser.InitContext ctx)
{
System.out.print('"');
}
/** Translate integers to 4-digit hexadecimal strings prefixed with \\u */
@Override
public void enterValue(ArrayInitParser.ValueContext ctx)
{
// Assumes no nested array initializers
int value = Integer.valueOf(ctx.INT().getText());
System.out.printf("\\u%04x", value);
}
}
2 番目の Java ファイルでは、次の手順に従いました。
Translate.java
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
public class Translate
{
public static void main(String[] args) throws Exception
{
// create a CharStream that reads from standard input
ANTLRInputStream input = new ANTLRInputStream(System.in);
// create a lexer that feeds off of input CharStream
ArrayInitLexer lexer = new ArrayInitLexer(input);
// create a buffer of tokens pulled from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// create a parser that feeds off the tokens buffer
ArrayInitParser parser = new ArrayInitParser(tokens);
ParseTree tree = parser.init(); // begin parsing at init rule
// Create a generic parse tree walker that can trigger callbacks
ParseTreeWalker walker = new ParseTreeWalker();
// Walk the tree created during the parse, trigger callbacks
walker.walk(new ShortToUnicodeString(), tree);
System.out.println(); // print a \n after translation
}
}
STRINGTEMPLATE で試してみました
antlr 4 で StringTemplate を試しました。クエリを翻訳することはできますselect, from, where
が、クエリを翻訳するand
とできませんでした。私のコードは次のようになります:
import org.stringtemplate.v4.*;
public class ToSql extends BaseListener
{
/** Translate select to select */
@Override
public void enterSelect( Parser.SelectContext ctx)
{
ST select = new ST("select");
System.out.print(select.render()+"\t");
}
/** Translate from to from */
@Override
public void enterFrom( Parser.FromContext ctx)
{
ST from = new ST("from");
System.out.print(from.render()+"\t");
}
/** Translate where to where */
@Override
public void enterWhere( Parser.WhereContext ctx)
{
ST where = new ST("where");
System.out.print(where.render()+"\t");
}
/** Translate boolOp to AND|OR|XOR */
@Override
public void enterBoolOp( Parser.BoolOpContext ctx)
{
ST boolOp = new ST("<and>");
if (boolOp == and)
{
boolOp.add("and", "AND");
System.out.print(boolOp.render()+"\t");
}
}
}
私の文法の一部:
boolOp : OR|XOR|AND;
ありがとうございました。