浏览 6644 次
|
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2005-01-14
主要是为了尝试一下JAVACC,利用编译原理的思路构造自己的语言:)
首先到https://javacc.dev.java.net/ JAVACC的老家下载JAVACC 我们今天的目标就是把from Teacher转化为select * from Teacher 首先编写.jj文件 1.定义要空开的分隔符 [code:1] SKIP : { " " | "\t" | "\n" | "\r" | "\f" } [/code:1] 2.定义关键字。from 为HQL的关键字,Teacher是用户输入的类名,应当是一个任意由字母和数字组成的单词,我们可以用正则表达式:["A"-"Z","a"-"z","0"-"9"]来表示。 [code:1] TOKEN: /*RESERVED TOKENS FOR UQL */ { <FROM:"from"> | <FROM_OBJECT:(["A"-"Z","a"-"z","0"-"9"])+ > } [/code:1] 3.接下来定义一下输入的顺序与规范 [code:1] void expression() : { Token tTable; } { ( <FROM> tTable = <FROM_OBJECT> ) { sqlSB.append("SELECT *"); sqlSB.append(" FROM ").append(tTable.image); } } [/code:1] 最后就是写解析代码,以便生成java代码 [code:1] 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) [/code:1] 接下来到dos下输入: 引用 javacc -debug_parser test.jj -debug_parser:用来输出语法树 这时候会生成7个java文件,每个文件的作用以后会详细说明 这时候只需要 javac *.java即可编译全部的java文件 然后执行java HQLParser “from Teacher“ 这时候屏幕上就会显示出“select * from Teacher“ 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-15
头疼呀,编译原理~~~~~
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-15
呵呵,自己写一个hibernate
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-18
苦于没有时间,其实蛮希望这个尝试可以继续下去的,总觉得一个语言应该是用编译原理来实现,似乎更符合习惯。
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-22
能反过来么 ? SQL--->HQL
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-22
lyo 写道 能反过来么 ? SQL--->HQL :idea:
可以做,不过不能完全,因为HQL只是SQL的一个子集,所以无法完全映射 |
|
| 返回顶楼 | |










