利用JAVACC将HQL->SQL

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

首先下载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“

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航