| 
         
     
     | 
     | 
    
  
    | 
    利用JAVACC将HQL->SQL(1)   -[转载] | 
   
  
     | 
   
  
     | 
   
  
    | 
     作者:未知  来源:月光软件站  加入时间:2005-2-28 月光软件站  | 
   
  
    主要是为了尝试一下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?*/ { ???? ???|? }
  ?
  3.接下来定义一下输入的顺序与规范
  void?expression()?: { ?Token?tTable; } { ?( ?? ??tTable?=? ?) ?{ ??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“
  
 
  | 
   
  
     | 
   
  
     相关文章:相关软件:  | 
   
   
      |