首先下载JAVACC编写jj文件
定义要空开的分隔符
SKIP :
{
| \t
| \n
| \r
| \f
}
定义关键字from 为HQL的关键字Teacher是用户输入的类名应当是一个任意由字母和数字组成的单词我们可以用正则表达式:[AZaz]来表示
TOKEN: /*RESERVED TOKENS FOR UQL */
{
<FROM:from>
| <FROM_OBJECT:([AZaz])+ >
}
接下来定义一下输入的顺序与规范
void expression() :
{
Token tTable;
}
{
(
<FROM>
tTable = <FROM_OBJECT>
)
{
sqlSBappend(SELECT *);
sqlSBappend( FROM )append(tTableimage);
}
}
最后就是写解析代码以便生成java代码
PARSER_BEGIN(HQLParser)
import javalangStringBuffer;
import javaioStringReader;
import javaioReader;
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 sqlSBtoString();
}
public static void main(String args[])
{
try
{
String query = args[];
HQLParser parser = new HQLParser(query);
parserparse();
Systemoutprintln(SQL:+parsergetSQL());
}
catch(Exception e)
{
eprintStackTrace();
}
}
public void parse()
{
try
{
expression();
}
catch(Exception e)
{
eprintStackTrace();
}
}
}
PARSER_END(HQLParser)
接下来到dos下输入:
javacc debug_parser testjj
debug_parser:用来输出语法树
这时候会生成个java文件每个文件的作用以后会详细说明
这时候只需要
javac *java即可编译全部的java文件
然后执行java HQLParser from Teacher
这时候屏幕上就会显示出select * from Teacher