|
主要是为了尝试一下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“
代码的详细注解明天再发出吧
[Access]sql随机抽取记录 [Access]ASP&SQL让select查询结果随机排序的实现方法 [学习帮助]已知直线Y=-x+1 交X,Y 轴于A,B [办公软件]如何在Excel表格单元格中输入比例(如4:1并让其正确… [系统软件]SQL语句性能优化--LECCO SQL Expert [常用软件]休息一下!网络资源搜罗 (1) [C语言系列]SQL Server到DB2连接服务器的实现 [C语言系列]SQL Server到SYBASE连接服务器的实现 [C语言系列]SQL Server到SQLBASE连接服务器的实现 [C语言系列]SQL Server连接VFP数据库的实现
|