利用JAVACC将HQL->SQL(1)

原创 2004年09月13日 19:15:00

主要是为了尝试一下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“

代码的详细注解明天再发出吧

 

基于javacc与基于java SQL解析器实现的一点心得

背景 由于项目中mysql的日志格式只能选用MIXED格式(binlog存在一定的局限性,请参考),因此需要解析SQL语句。 在查找的SQL语句处理器中,都有一定的局限性,而所选中,其中一个基于j...
  • haier_jiang
  • haier_jiang
  • 2013年03月16日 17:36
  • 4833

JavaCC两种使用方式

JavaCC(Java Compiler Compiler)的两种使用方法
  • u013089991
  • u013089991
  • 2017年02月12日 17:54
  • 789

JAVCC语法文件 官方文档翻译

JAVCC语法文件 官方文档翻译
  • crownchen
  • crownchen
  • 2014年11月03日 20:43
  • 2835

JavaCC使用小结

原文地址:http://blog.csdn.net/bhq2010/article/details/8763920 JavaCC是一个很不错的词法、语法解析器的生成器,只需要编写规则就可以生成...
  • tanga842428
  • tanga842428
  • 2016年09月20日 09:28
  • 808

JavaCC 的安装

1.在JavaCC首页http://javacc.java.net/上下载最新版的JavaCC。配置环境变量,在dos命令行里就可以使用了2.这里我们使用第二种,安装eclipse插件的方法 Jav...
  • pngfiwang
  • pngfiwang
  • 2015年10月16日 18:53
  • 3134

Javacc词法分析初练

考虑到在CSDN,没有搜索到很多关于javacc的东西,绝对干货。 javacc概述 javacc概述   JavaCC 是一个词法分析生成器和语法分析生成器。 词法分析和语法分析是处理输入...
  • qq_29232943
  • qq_29232943
  • 2017年03月19日 16:50
  • 605

JavaCC使用小结

项目中用的JavaCC做查询编译,在这里小结一下,作为备忘。 JavaCC是一个很不错的词法、语法解析器的生成器,只需要编写规则就可以生成Java语言的词法、语法解析器(新版本的JavaCC还支持C...
  • bhq2010
  • bhq2010
  • 2013年04月06日 15:03
  • 17391

使用JavaCC做语法分析

实用javacc   前言 本系列的文章的宗旨是让大家能够写出自己的编译器,解释器或者脚本引擎,所以每到理论介绍到一个程度后,我都会来讨论实践问题.理论方面,编译原理的教材已经是够多了,而实践...
  • adermxl
  • adermxl
  • 2014年07月24日 00:18
  • 1142

javacc安装教程

1.在JavaCC首页http://javacc.java.net/上下载最新版的JavaCC。配置环境变量,在dos命令行里就可以使用了 2.这里我们使用第二种,安装eclipse插件的方法 ...
  • qq_29232943
  • qq_29232943
  • 2017年03月16日 20:21
  • 536

JavaCC -- Linux安装与使用

简介 安装 使用 简介JavaCC官网地址https://javacc.java.net/。 JavaCC是一个词法分析器、语法分析器的生成工具,从功能上类似于语法分析器YACC和词法分析器Lex。J...
  • zhufenglonglove
  • zhufenglonglove
  • 2016年05月18日 15:33
  • 1164
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用JAVACC将HQL->SQL(1)
举报原因:
原因补充:

(最多只允许输入30个字)