主要是为了尝试一下javacc,利用编译原理的思路构造自己的语言:)
首先到https://javacc.dev.java.net/ javacc的老家下载javacc
我们今天的目标就是把from teacher转化为select * from teacher
首先编写.jj文件
1.定义要空开的分隔符
java代码:
skip :
{
" "
| "/t"
| "/n"
| "/r"
| "/f"
}
2.定义关键字。from 为hql的关键字,teacher是用户输入的类名,应当是一个任意由字母和数字组成的单词,我们可以用正则表达式:["a"-"z","a"-"z","0"-"9"]来表示。
java代码:
token: /*reserved tokens for uql */
{
<from:"from">
| <from_object:(["a"-"z","a"-"z","0"-"9"])+ > //自己替换[]
}
3.接下来定义一下输入的顺序与规范
java代码:
void expression() :
{
token ttable;
}
{
(
<from>
ttable = <from_object>
)
{
sqlsb.append("select *");
sqlsb.append(" from ").append(ttable.image);
}
}
最后就是写解析代码,以便生成java代码
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“
闽公网安备 35060202000074号