主要是为了尝试一下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“ 
代码的详细注解明天再发出吧 
   
 
  |