posts - 274,  comments - 1258,  trackbacks - 0
博主踏雪赤兔按:
  编译原理的实验要求我们用JFlex和JavaCUP来对语言进行分析处理,JavaCUP有一个User's Manual教你怎样做,上面还有一个简单的计算器作为例子,但一试之下,却发现那个例子有不少错误,结果改了我n久才完成~当然马上就决定写一篇博客告诉大家怎样做才是正确的,以免像我那样白走许多弯路。我也不知是不是我找的那份不好,如果你有更好的manual,记得告诉我。

撰写本文的目的
  给出使用JFlex、JavaCUP来为一个计算器建立分析器的示例的完整代码,使读者能充分领会JavaCUP的使用方法。虽然本文仅仅给出了计算器的代码,但只要你会写你的语言的翻译模式,则只要照抄这个模版,并改改相应动作就可以了。

引用到的资料
  • 《CUP User's Manual》,作者:Scott E. Hudson地址为李老师那里下载下来的JavaCUP-11a.rar\CUP-develop.tar.gz\develop\manual.html,有详细的英文说明和示例代码,但有很多错。本文中简称为《手册》。
  • 《使用CUP进行语法分析》,摘自Apollo的博客,貎似是转载的(竟然不注明[转]和真实出处?!,BS之~),作者待考。有详尽的解释,但缺乏示例代码。本文中简称为《语法分析》。

详细步骤
1、准备工作。
  JavaCUP和JFlex一样,压缩包里边有许多的文件夹和文件,我不知道正统的做法是否要求使用javaCUP也像Jflex一样要设置一堆path啊、classpath啊、jflex_home之类的环境变量,但如果你像我一样只打算用它几次,你只要执行下述的两个简单步骤就可以了,它并不需要你设置任何的环境变量(以下假设你的工作目录是work\):
1)   将JavaCUP压缩包里的java-cup-11a.jar解压到work\下。
2)   将JavaCUP压缩包里的CUP-develop.tar.gz\develop\src下的java_cup文件夹整个解压到work\下。
现在你可以使用JavaCUP了。

2、为这个计算器写一个词法分析器。或者用JFlex生成一个词法分析器

  两种方法都可以生成词法分析器,其中,直接写分析器的代码如下:

scanner.java

 

  以上代码来自《手册》的附录B,但有以下修改:


FeedBack:
# re: 如何使用JavaCUP by 踏雪赤兔[未登录]
2007-05-09 15:57 | ji
很好!  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-10 21:08 | 匿名
谢谢!  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-11 12:53 | 在学javaCup的人
万分感谢!我都快被cup弄晕了,还好有你写个基本过程,要不不知道什么时候才会用了,555555  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-11 19:04 | 踏雪赤兔
我就是被JavaCUP的User's Mannual弄得一头雾水才写这篇博客的~~大家一起交流哈~
  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-14 22:52 | 叉烧
超赞~~~
555555,感动死了!!!  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-15 10:58 | 小bug
认真学习了~

PS:
为什么继承Scanner是implement而不是extended的?
而且也没有一个叫做Scanner的interface呀  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-15 20:43 | 踏雪赤兔
呵呵~~再看多次javaCUP的源码吧
在src\java_cup\runtime\Scanner.java里,代码如下
package java_cup.runtime;
public interface Scanner {
    
/** Return the next token, or <code>null</code> on end-of-file. */
    
public Symbol next_token() throws java.lang.Exception;
}

//删去了源代码中的文档化注释
  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-17 13:58 | 小bug
原来Scanner是CUP自己定义的接口,不是java api里面的同名的类...tricky...  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-17 23:43 | 踏雪赤兔
哈哈~~所以我特意写了它的全名嘛~~  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-18 12:07 | 李振达
Goooooooooooooooooooooooooooooodd... thx~~  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-18 19:17 | yd
javaCUP自动生成了parser.java和sym.java两个文件在哪里啊?怎么找不到?虽然提示是这样了:
------- CUP v0.11a beta 20060608 Parser Generation Summary -------
0 errors and 0 warnings
12 terminals, 4 non-terminals, and 13 productions declared,
producing 24 unique parse states.
0 terminals declared but not used.
0 non-terminals declared but not used.
0 productions never reduced.
0 conflicts detected (0 expected).
Code written to "parser.java", and "sym.java".
---------------------------------------------------- (v0.11a beta 20060608)  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-18 19:30 | 踏雪赤兔
以上信息说明你已经成功生成了java文件了,一般就在当前文件夹下,仔细找找看~~或者搜索一下吧!  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-19 10:45 | yd
终于找到这两个java文件了,原来是在“我的文档”里。我不是很明白你说的“假设你的工作目录是work\”这“工作目录”的意思  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-23 11:00 | 小E
不懂。。。
给点建议我看c++primer这本书吧,怎么样使用它好点:)
谢拉  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-29 02:30 | ss
"parser.java", and "sym.java". 两个文件生成以后编译不了怎么办?  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-29 02:46 | 踏雪赤兔
不会吧?你参照一下我的scanner.flex和parser.cup文件吧  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-29 14:04 | 叉烧
我那个javacup能挣扎出来,80%是小鸡这个文章的功劳啊。。。
5555555555小鸡 is a good 小鸡!!!  回复  更多评论
  
# Exception in thread "main" java.lang.NoClassDefFoundError: calc
2007-05-29 18:52 | 为cup痛苦
Exception in thread "main" java.lang.NoClassDefFoundError: calc
这个问题能不能说的更详细一些呢?

我连class文件都找不到  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-05-30 21:14 | 踏雪赤兔
加Q说吧~  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-12-07 20:32 | 羽然
中大的师兄,我想问下,我对java_cup一窍不通,现在有java的非常基础的编程知识。
对于java_cup,想弱弱地问下,如果它是个编辑器,那么它的界面是什么?是命令行么?还有,如果是这样,那个那些.java , .cup , .flex文件在命令行中如何生成呢??
然后,我想问下,有没有比较初级一些的教程可以参考。  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2007-12-11 19:53 | 踏雪赤兔
javaCUP不是编辑器,它只有命令行界面。从功能来说,它更像一个编译器,而且是编译器的编译器(百度一下YACC——yet another compiler's compiler),它有一套固定的语法,通过这些语法就可以生成一个编译你自定义的语言的编译器了。

.flex文件是JFlex的源代码文件;.cup文件是javaCUP的源代码文件;.java是java的源代码文件,在这里,它同时也是JFlex和JavaCUP的输出文件。  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2008-06-03 15:11 | lst
看来是04的师兄啊,没想到一年之后,在同一个老师的带领下,我们也来重蹈你们的覆辙啦....  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2008-06-08 11:00 | 踏雪赤兔
哈哈~加油加油~  回复  更多评论
  
# re: 如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
2008-07-13 13:57 | wengjiazuan
今天天气很差,于是我开始赶编译实验。。  回复  更多评论
  
只有注册用户登录后才能发表评论。

百度空间| 见闻日记| 编程感悟
我的twitter


LOGO

自我介绍:百度厂基础平台车间的一名挨踢民工。擅长C++、算法、语言设计、分布式计算,也用过Java,Python, PHP,JS/AS等语言开发。请关注我的twitter (免翻墙版) 发QQ消息


添加到收藏夹 Locations of visitors to this page

常用链接

随笔分类(300)

随笔档案(274)

文章分类(38)

相册

收藏夹(54)

与博主互动

博客手拉手

搜索

  •  

积分与排名

  • 积分 - 398818
  • 排名 - 10

最新评论

阅读排行榜

评论排行榜