代码及结果:task1
任务二博客:编译原理 | 实验任务二:扩展Read和Write语句
1 找到PASCAL编译系统
下载安装free pascal,设置环境变量,然后用vscode编辑。
参考资料:在windows命令行下编译运行Pascal程序
2 在PASCAL系统上运行PL0编译程序,需要对PL0编译程序作一些修改、调试
1.改格式(缩进、注释)
2.符号修改
~ -> not//~这个符号打不出来,反正就是非的意思
//procedure和object在pascal中是关键字,所以分别使用proceduree和objectt替代
object -> objectt;
procedure -> proceduree;
cc—1 -> cc-1;
↑ -> ^;
≤ -> <=;
≠ -> <>;
3. 注释掉不必要的(其实是报错的)语句,如
直接注释掉(或删掉)
4.标号99原来是用于退出程序的,由于不支持跨过程的跳转,所以直接退出
//procedure gen(x : fct; y, z : integer);
if cx > cxmax then
begin
write('PROGRAM TOO LONG');
exit
//goto 99
end;
//procedure getch ;
if eof(fin) then {
如果已到文件尾}
begin
writeln('PROGRAM INCOMPLETE');
exit;
//goto 99
end;
//主程序
//99 : writeln
writeln;
5.现在暂时没有错误了
3 建立输入文件和输出文件
在输入文件中存放PL0源程序
在输出文件中存放PL0源程序被编译后产生的中间代码和运行数据
4 通过输入文件输入PL0源程序,在输出文件中产生源程序的中间代码, 然后运行该中间代码, 在输出文件中产生运行数据
1.增加变量fin和fout,以命令行形式读取和写入文件
//{全局变量定义}
//var
fin : text; {
源代码文件}
fout : text; {
输出文件}
...
begin {
主程序}
assign(fin,paramstr(1));
assign(fout,paramstr(2)); {
将命令行参数str变量赋值给文件变量}
reset(fin);
rewrite(fout); {
打开输入输出文件}
...
//99 : writeln
writeln;
close(fin);
close(fout);
2.exit时关闭文件
//getch
begin
writeln('PROGRAM INCOMPLETE');
close(fin);
close(fout);
exit;
//goto 99
end;
//gen
begin
write('PROGRAM TOO LONG');
close(fin);
close(fout);
exit
//goto 99
end;
3.将所有input改成fin,有read的地方都改成从fin文件读入,有write的地方都改成写到fout文件:
//getch
if eof(fin) then {
如果已到文件尾}
...
while not eoln(fin) do {
如果不是行末}
begin
ll := ll + 1; {
将行缓冲区的长度+1}
read(fin, ch); {
从源文件中读取一个字符到ch中}
write(fout, ch);{
输出ch到输出文件中}
line[ll] := ch {
把这个字符放到当前行末尾}
end;
writeln(fout); {
换行}
readln(fin);{
从源文件下一行开始读取}
ll := ll + 1; {
将行缓冲区的长度+1}
line[ll] := ' ' {
pro