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

主要是为了尝试一下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“
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值