论坛首页 Java企业应用论坛

利用JAVACC将HQL->SQL(1)

浏览 10060 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-01-14  
主要是为了尝试一下JAVACC,利用编译原理的思路构造自己的语言:)

首先到https://javacc.dev.java.net/ JAVACC的老家下载JAVACC

我们今天的目标就是把from Teacher转化为select * from Teacher

首先编写.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“
   发表时间:2005-03-15  
头疼呀,编译原理~~~~~
0 请登录后投票
   发表时间:2005-03-15  
呵呵,自己写一个hibernate
0 请登录后投票
   发表时间:2005-03-18  
苦于没有时间,其实蛮希望这个尝试可以继续下去的,总觉得一个语言应该是用编译原理来实现,似乎更符合习惯。
0 请登录后投票
   发表时间:2005-03-22  
能反过来么 ?  SQL---&gt;HQL  
0 请登录后投票
   发表时间:2005-03-22  
lyo 写道
能反过来么 ?  SQL--->HQL  

可以做,不过不能完全,因为HQL只是SQL的一个子集,所以无法完全映射
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics