科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道教你如何利用JAVACC将HQL转换为SQL

教你如何利用JAVACC将HQL转换为SQL

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

主要是为了尝试一下JAVACC,利用编译原理的思路构造自己的语言:)   首先到https://javacc.dev.java.net/ JAVACC的老家下载JAVACC   我们今天的目标就是把from Teacher转化为select * from Teacher 首先编写.jj文件

作者:中国IT实验室 来源:中国IT实验室 2007年9月25日

关键字: 编程 java

  • 评论
  • 分享微博
  • 分享邮件

  主要是为了尝试一下JAVACC,利用编译原理的思路构造自己的语言:)
  
  首先到https://javacc.dev.java.net/ JAVACC的老家下载JAVACC
  
  我们今天的目标就是把from Teacher转化为select * from Teacher
  
  首先编写.jj文件
  
  1.定义要空开的分隔符
  java代码:
  
  
  SKIP :
  {
   " "
  | "\t"
  | "\n"
  | "\r"
  | "\f"
  }
  
  
  2.定义关键字。from 为HQL的关键字,Teacher是用户输入的类名,应当是一个任意由字母和数字组成的单词,我们可以用正则表达式:["A"-"Z","a"-"z","0"-"9"]来表示。
  
  java代码:
  
  
  TOKEN: /*RESERVED TOKENS FOR UQL */
  {
    <FROM:"from">
    | <FROM_OBJECT:(["A"-"Z","a"-"z","0"-"9"])+ > //自己替换[]
  }
  
  
  3.接下来定义一下输入的顺序与规范
  java代码:
  
  
  void expression() :
  {
  Token tTable;
  }
  {
  (
   <FROM>
   tTable = <FROM_OBJECT>
  )
  {
   sqlSB.append("SELECT *");
   sqlSB.append(" FROM ").append(tTable.image);
  }
  }
  
  
  最后就是写解析代码,以便生成java代码
  
  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“
  
  

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章