服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

利用javacc将hql->sql


  首先下载javacc,编写.jj文件
  
  1.定义要空开的分隔符
  
  skip :
  {
   " "
  | "/t"
  | "/n"
  | "/r"
  | "/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“

扫描关注微信公众号