您的位置:首页 > 编程语言 > Java开发

利用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“

代码的详细注解明天再发出吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: