局部恢复机制,使用了特殊的error符号以控制恢复进程。当这一特殊的eror符号在文法规则中出现时,一个错误输入符号列就得到了匹配。
2.5编译器的生成和运行
首先直接手工编写一个扫描器,名为Lexer.java。然后将我们的CUP源文件保存为calc.cup。在命令行下输入:
javajava_cup.Maincalc.cup
得到两个Java源文件:parser.java和sym.java,在命令行下,用javac命令编译以上3个java文件,就得到了相应的4个字节码文件(parser.java除了产生parser.class还产生一个非公共类)。
为了运行我们的计算器程序,还需要一个包含main函数的类,为此创建一个名为Test.java的文件,其唯一的函数如下:
staticpublicvoidmain(Stringargv[]){
try{
parserP=newparser(newLexer(newFileReader(argv[0])));
Objectresult=P.parse().value;
}catch(Exceptione){
}
}
至此可以开始运行这个计算器程序了,先新建一个文本文件,输入:
5+7;
2*(4-1)+6;
保存,并将其改名为calc.txt。在命令行下,输入:
javaTestcalc.txt
得到如下输入:
5+7=12;
2*(4-1)+6=12;
3结束语
CUP是个先进的语法分析器生成工具,它是YACC在Java下的一种实现,而且CUP还提供了各个版本的Java语言的CUP源文件。利用这个工具设计人员无需进行大量的编码工作,就可以设计各种高级语言在Java下的编译器。
参考文献
1 陈火旺,刘春林,谭庆平,等.程序设计语言编译原理.北京:国防工业出版社,2000.
2 Scott E Hudson.CUP.http://www.CS.princeton.edu/~appel/modern/java/CUP.
3/3 首页 上一页 1 2 3 |