利用JAVACC将HQL->SQL(1) -[转载]

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

{

????

???|?

}

?

3.接下来定义一下输入的顺序与规范

void?expression()?:

{

?Token?tTable;

}

{

?(

??

??tTable?=?

?)

?{

??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- 王朝網路 版權所有 導航