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编写)必须就中间语言达成一致:即哪个整数代表哪条指令。
- 修改编译器:在F#代码里,使用
intsToFile函数把整数列表写入文件。示例代码如下:
let intsToFile (inss : int list) (fname : string) =
let text = String.concat " " (List.map string inss)
System.IO.File.WriteAllText(fname, text)
在编译器代码中调用此函数,把生成的整数列表写入文件。
- 修改栈机器解释器:在
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();
}
}
}
- 确保一致性:要保证编译器(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 }是循环体,每次将当前循环索引加到累加和上。 - 最后
=将最终结果从栈中弹出并打印。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



