龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

利用JAVACC将HQL->SQL

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
首先下载JavaCC,编写.jj文件 1.定义要空开的分隔符 SKIP : { " " "" "" "" "f" } 2.定义要害字。from 为HQL的要害字,Teacher是用户输入的类名,应当是一个任意由字母和数字组成的单词,我们可以

  首先下载JavaCC,编写.jj文件
  
  1.定义要空开的分隔符
  
  SKIP :
  {
   " "
   " "
   " "
   " "
   "f"
  }
  
  2.定义要害字。from 为HQL的要害字,Teacher是用户输入的类名,应当是一个任意由字母和数字组成的单词,我们可以用正则表达式:["A"-"Z","a"-"z","0"-"9"]来表示。
  
  TOKEN: /*RESERVED TOKENS FOR UQL */
  {
  <FROM:"from">
    <FROM_OBJECT:(["A"-"Z","a"-"z","0"-"9"])+ >
  }
  3.接下来定义一下输入的顺序与规范
  
  void eXPression() :
  {
   Token tTable;
  }
  {
   (
   <FROM>
   tTable = <FROM_OBJECT>
   )
   {
   sqlSB.append("SELECT *");
   sqlSB.append(" FROM ").append(tTable.image);
   }
  }
  最后就是写解析代码,以便生成java代码
  
  PARSER_BEGIN(HQLParser)
  
  import java.lang.StringBuffer;
  import java.io.StringReader;
  import java.io.Reader;
  
  public class HQLParser {
  
  private static StringBuffer sqlSB;
  
  /** 
   A String based constrUCtor for ease of use.
   **/
  public HQLParser(String s)
  {
  this((Reader)(new StringReader(s)));
   sqlSB = new StringBuffer();
  }
  
  public String getSQL()
  {
  return sqlSB.toString();
  }
   
  public static void main(String args[])
  {
  try
  {
   String query = args[0];
   HQLParser parser = new HQLParser(query);
    parser.parse();
   System.out.println("SQL:"+parser.getSQL());
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  }
  
  public void parse()
  {
   try
   {
   expression();
   }
   catch(Exception e)
  {
  e.printStackTrace();
  }
  }
  }
  PARSER_END(HQLParser)
  
  接下来到dos下输入:
  
  javacc -debug_parser test.jj
  
  -debug_parser:用来输出语法树
  
  这时候会生成7个java文件,每个文件的作用以后会具体说明
  
  这时候只需要
  
  javac *.java即可编译全部的java文件
  
  然后执行java HQLParser “from Teacher“
  
  这时候屏幕上就会显示出“select * from Teacher“
  
精彩图集

赞助商链接