浏览 10060 次
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-01-14
首先到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“ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-03-15
头疼呀,编译原理~~~~~
|
|
返回顶楼 | |
发表时间:2005-03-15
呵呵,自己写一个hibernate
|
|
返回顶楼 | |
发表时间:2005-03-18
苦于没有时间,其实蛮希望这个尝试可以继续下去的,总觉得一个语言应该是用编译原理来实现,似乎更符合习惯。
|
|
返回顶楼 | |
发表时间:2005-03-22
能反过来么 ? SQL--->HQL
|
|
返回顶楼 | |
发表时间:2005-03-22
lyo 写道 能反过来么 ? SQL--->HQL
可以做,不过不能完全,因为HQL只是SQL的一个子集,所以无法完全映射 |
|
返回顶楼 | |