给出使用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
// Simple Example Scanner Class
// scanner.java
import java_cup.runtime.*;
import java.io.*;
//import sym;
public class scanner implements java_cup.runtime.Scanner {
/**//* single lookahead character */
protected static int next_char;
// since cup v11 we use SymbolFactories rather than Symbols
private SymbolFactory sf = new DefaultSymbolFactory();
private static FileReader fileReader;
public scanner(FileReader fr){
this.fileReader=fr;
}
/**//* advance input by one character */
protected static void advance()
throws java.io.IOException
{ next_char = fileReader.read(); }
/**//* initialize the scanner */
public static void init()
throws java.io.IOException
{ advance(); }
/**//* recognize and return the next complete token */
public Symbol ne