利用JAVACC将HQL->SQL(1)
2004-09-13 19:15
525 查看
主要是为了尝试一下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“
代码的详细注解明天再发出吧
首先到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“
代码的详细注解明天再发出吧
相关文章推荐
- 利用JAVACC将HQL->SQL(1) -[转载]
- 利用JAVACC将HQL-&gt;SQL(1)
- 利用IList<T>同时循环访问列表和数组
- 存储过程中使用游标(在存储过程中遍历表)<sql>
- [每天一点点]->[SQL语句] limit使用详解
- PL/SQL--&gt;INSTEAD&nbsp;OF&nbsp;触发器
- 关于pl/sql 操作符=&amp;gt;
- Android利用资源名称获取其ID(二)--->反射
- SQL基础--> 数据处理(DML、RETURNING、MERGE INTO)
- 每天学习一点.net(5) 利用匿名方法Lambda表达式(=>)实现委托
- 利用Jsoup解析html,如何得到<img>标签的位置
- 关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)
- 拦截电话---> 关于利用反射 调用系统 hiden的 方法
- SQL >>将一列中多个不同的值放入一行的一个单元格
- Struts2标签库(3):利用<s:property.../>标签访问Struts2的命名对象
- 利用ibatis管理hql/sql
- SQL 标量函数----->日期函数 day() 、month()、year()、DATEADD()、ATEDIFF()、DATENAME()、DATEPART() GETDATE()
- .NET调用osql.exe执行sql脚本创建表和存储过程<转> 代码
- Android中级教程之(四)----->页面的转换,利用setContentView方法
- 为代码减负之<三>视图(SQL)