从JavaCC入手

这个学期上数据库课,最后的project就是自己写一个数据库。

整个PROJECT分为3各阶段

这次是第一个阶段,实现SQL parser

要求是1.Parses SQL statements such as CREATE TABLE, DROP TABLE, DECS, SHOWTABLES, INSERT, UPDATA, DELETE, SELECT

2.Parses SQL statements in multiple lines, assuming that every query ends with a semi-colon';', not the line feed '/n or carriage return '/r'

3. Use standard input/output

 

开发的环境有两种选择 一种是C/C++ API:lex&yacc

另一种是JAVA API:javaCC

 

很久没有用java了,决定用java,先下载了javaCC,安装,查资料,进行学习

javaCC的官方地址是http://javacc.dev.java.net 其实下载下来就能用了,把系统PATH设置一下会方便点

 

JAVACC简单的说就是语法分析器

 

Javacc 的原理

 

    Javacc 可以同时完成对text的词法分析和语法分析的工作,使用起来相当方便。同样,它和lex和yacc一样,先输入一个按照它规定的格式的文件,然后javacc根据你输入的文件来生成相应的词法分析于语法分析程序。同时,新版本的Javacc除了常规的词法分析和语法分析以外,还提供JJTree等工具来帮助我们建立语法树。总之,Javacc在很多地方做得都比lex和yacc要人性化,这个在后面的输入文件格式中也能体现出来。

 

    Javacc 的输入文件

    Javacc 的输入文件格式做得比较简单。每个非终结符产生式对应一个Class中的函数,函数中可以嵌入相应的识别出该终结符文法时候的处理代码(也叫动作)。这个与YACC中是一致的。

看教程上的例子,学着写了一个,还真好使了,就是一个十进制的加法表达式,比如

1+1

呵呵,我知道等于2,可这个小程序不是算结果的,是检验表达式合法不,基本就这样了,得先写个什么.jj文件规范JavaCC的解析器和词法分析器,将会作为JavaCC处理文件的输入.就叫"Adder.jj"吧,跟教程上一样.

PARSER_BEGIN(Adder)
 public class Adder{
  public static void main(String[] args) throws ParseException,TokenMgrError{
   Adder adder = new Adder(System.in);
   adder.start();
  }
 }
PARSER_END(Adder)

SKIP:{" "|"/t"|"/n"|"/r"|"/r/n"}

TOKEN:{
 <PLUS:"+">
 |<NUMBER:(["0"-"9"])+>
}

void start():
{}
{
 <NUMBER>(<PLUS><NUMBER>)*<EOF>
}

1.PARSER_BEGIN(Adder)与PARSER_END(Adder)之间的代码是Java语法,这里生成Adder.java的主程序入口,基本就是这种格式,其中要抛出两个异常:
    1.1 ParseException : 解析错误,解析器负责检查,Exception的子类.比如输入"1++1",这种就是解析错误,因为它里面的分割符都是我们在TOKEN:中定义的,没有其它字符.
    1.2 TokenMgrError : 分割符错误,词法分析器负责检查,Error的子类.比如输入"1-1"就是这种错误,因为TOKEN:中没有定义"-".
这两个类都会自动生成,现在刚研究还不知道为啥一个来之Exception,一个来自Error,以后会明白的.
2.new Adder(System.in),这个构造子这还不是很明白,不知道为啥默认成这型的,就知道是自动产生的,以后再说.
3.start() 方法是解析的主体,是下面需要实现的.

4.SKIP:{" "|"/n"|"/r"|"/r/n"}  这个定义的是忽略的字符,它们虽然构成分割符但不被送给解析器,就是你在输入的时候有这些字符不会发生错误,但它们不会被解析出来.这里定义了5个,基本上就是空格,跳格,回车换行什么的,以为各个操作系统间的回车换行什么的据说不一样,我也不知道都咋回事,都写上吧.各个元素之间用"|"分开,格式就是这样了.
5.TOKEN:{
 <PLUS:"+">
 |<NUMBER:(["0"-"9"])+>
}

这个是说分割符了,就是把一个句子里的什么字符取出来,也就是你这句子里只能有这些规定好的字符,别的不行,这里就是"+"号和0-9十个数字. 两着用"|"分开.
每个分割符是这样规定的,用<>括上,代号和符号用":"隔开,就是用前面的代号代替后面在句子中会出现的元素或元素的集合.这些代号在下面会用到.其中数字用了正则式,就是1个或1个以上的由0-9之间的数字组成的串.

4和5两个部分如果用不到可以没有.

6.void start():
{}
{
 <NUMBER>(<PLUS><NUMBER>)*<EOF>

}

这个就是传说中的解析器了,说是符合什么BNF产生式,基本就这形状了,以后漫漫弄明白吧.里面看起来还像是正则式,就是用符号替换了,是以数字开头,中间跟0个或0个以上的由+和数字组成的序列,这个顺序不能变,最后是结束符,自带定义的.

程序基本上就这么回事了,因为简单,也形式上也没什么.

然后编译吧,设好环境变量什么的,在控制台切换到在Adder.jj所在文件夹:
javacc Adder.jj

成功就会出现提示:

Java Compiler Compiler Version 4.0beta1 (Parser Generator)
(type "javacc" with no arguments for help)
Reading from file Adder.jj . . .
File "TokenMgrError.java" does not exist.  Will create one.
File "ParseException.java" does not exist.  Will create one.
File "Token.java" does not exist.  Will create one.
File "SimpleCharStream.java" does not exist.  Will create one.
Parser generated successfully.

一共生成了7个.java文件,干嘛的都下回再说吧.
编译了这些文件:

javac *.java

运行 Adder :

java Adder

这时候控制台等待输入,可以试试拉:

1+1

没提示就是合法,ctrl + c 结束输入

从网上找了几篇网友的学习笔记,对JAVACC进行一下初步的学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值