利用JAVACC将HQL->SQL(1) -[转载]
2004-09-19 15:03
411 查看
主要是为了尝试一下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“
首先到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“
相关文章推荐
- 利用JAVACC将HQL->SQL(1)
- 利用JAVACC将HQL->SQL(1)
- 【转载】利用"SQL"语句自动生成序号的两种方式。
- <转载>PL/SQL Developer如何连接64位的Oracle图解
- SQL取系统的当前日期 <转载>
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- JAVA 装饰设计模式<转载>
- 利用addChildViewController管理子视图控制器<2>
- matlab中 ndims(a)、size(a)、length(a)的区别<转载>
- 按位与&和短路与&&区别<转载>
- <转载> JavaSript模块规范 - AMD规范与CMD规范介绍
- <转载>java.sql.date与java.util.date区别是什么?
- 利用<div>层 和<img>标签,实现一个图片两个动画效果
- SQL 基础-->SELECT 查询
- Hql的select 语句返回Ilist<object[]>类型,如何转换为映射类型
- 使用Map把sql返回的list<Object>转成需要的实体对象
- 从P1到P7——我在淘宝这7年<转载>
- <转载学习>子类对父类构造方法调用小结
- Asp.net三层结构入门示例源码>>SQLserver/SQLHelper.cs
- [转载]c/c++中结构体引用中箭头->与点.的区别