到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comwww.javaresearch.org无关,不对该信息负责.通过http://www.javaresearch.org/article//showarticle.jsp?column=108&thread=17221访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
利用JAVACC将HQL->SQL(1)
作者:changzheng 来源:www.javaresearch.org  发布时间:2006-03-05 03:10:34.187


主要是为了尝试一下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“



 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读