首先下载JavaCC,编写.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“
|