函数式语言扩展与编译器实践

1、修改编译器,使其将整数列表写入文件。可以使用以下函数将F#整数列表 inss 输出到名为 fname 的文件中: let intsToFile (inss : int list) (fname : string) = let text = String.concat " " (List.map string inss) System.IO.File.WriteAllText(fname, text) 。然后修改 Machine.java 中的栈机器解释器,使其从文本文件中读取整数序列,并将其作为栈机器程序执行。文本文件的名称可以作为Java程序的命令行参数给出。可以使用 StringTokenizer 类或 StreamTokenizer 类从文本文件中读取数字。编译器(用F#编写)和解释器(用Java编写)必须就中间语言达成一致:即哪个整数代表哪条指令。

  1. 修改编译器:在F#代码里,使用 intsToFile 函数把整数列表写入文件。示例代码如下:
let intsToFile (inss : int list) (fname : string) =
    let text = String.concat " " (List.map string inss)
    System.IO.File.WriteAllText(fname, text)

在编译器代码中调用此函数,把生成的整数列表写入文件。

  1. 修改栈机器解释器:在 Machine.java 里,添加从文本文件读取整数序列的功能。可使用 StringTokenizer 类或 StreamTokenizer 类来读取文件。示例代码如下:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Machine {
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("请提供文本文件的名称作为命令行参数。");
            return;
        }
        String fileName = args[0];
        try {
            BufferedReader reader = new BufferedReader(new FileReader(fileName));
            String line = reader.readLine();
            StringTokenizer tokenizer = new StringTokenizer(line, " ");
            while (tokenizer.hasMoreTokens()) {
                String token = tokenizer.nextToken();
                int number = Integer.parseInt(token);
                // 执行栈机器程序的操作,这里可添加具体逻辑
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 确保一致性:要保证编译器(F#)和解释器(Java)在中间语言上达成一致,也就是明确哪个整数代表哪条指令。

2、编写一个Postscript程序来计算1 + 2 + … + 1000的和。必须真正进行求和,不能使用n = 1000时的封闭形式表达式n(n + 1)/2。(更具挑战性的是:仅使用for循环,不进行函数定义)。

可以使用以下 Postscript 代码来实现:

0 0 1 1000 { add } for =

代码解释:

  • 第一个 0 是累加和的初始值。
  • 第二个 0 是循环起始值。
  • 1 是步长。
  • 1000 是循环结束值。
  • { add } 是循环体,每次将当前循环索引加到累加和上。
  • 最后 = 将最终结果从栈中弹出并打印。

3、下载expr.zip并解压。使用命令提示符,通过运行fslex和fsyacc生成(1)表达式词法分析器和(2)表达式语法分析器;然后(3)将表达式抽象语法、词法分析器和语法分析器模块以及表达式解释器和编译器加载到交互式F#会话(fsi)中:fslex –unicode ExprLex.fsl fsyacc –mo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值