⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 machine_src.htm.bak

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 BAK
📖 第 1 页 / 共 2 页
字号:
{=====================================================================}

{ 判断栈顶依次存放的两个元素是否相等,将布尔型的结果置于栈顶 }
procedure <a
name="notequal">notequal</a>;
&nbsp; begin
&nbsp;&nbsp;&nbsp; s:=s-1;
&nbsp;&nbsp;&nbsp; st[s]:=ord(st[s]&lt;&gt;st[s+1]);
&nbsp;&nbsp;&nbsp; p:=p+1;
&nbsp; end;

{=======================================================================}

{ 判断栈顶依次存放的两个元素的大小,将布尔型的结果置于栈顶 }
procedure <a
name="notless">notless</a>;
&nbsp; begin
&nbsp;&nbsp;&nbsp; s:=s-1;
&nbsp;&nbsp;&nbsp; st[s]:=ord(st[s]&gt;=st[s+1]);
&nbsp;&nbsp;&nbsp; p:=p+1;
&nbsp; end;

{=====================================================================}

{ 读入一个数,置于栈顶存放的地址处 }
procedure <a
name="readx">readx</a>;
&nbsp; begin
&nbsp;&nbsp;&nbsp; read(st[st[s]]);
&nbsp;&nbsp;&nbsp; s:=s-1;
&nbsp;&nbsp;&nbsp; p:=p+1;
&nbsp; end;

{====================================================================}

{ 将栈顶元素的值输出 }
procedure <a
name="writeintx">writeintx</a>;
&nbsp; begin
&nbsp;&nbsp;&nbsp; write(st[s]:6);
&nbsp;&nbsp;&nbsp; writeln;
&nbsp;&nbsp;&nbsp; s:=s-1;
&nbsp;&nbsp;&nbsp; p:=p+1;
&nbsp; end;

{======================================================================}

{ 将栈顶元素的值以布尔型输出 }
procedure <a
name="writebooleanx">writebooleanx</a>;
&nbsp; begin
&nbsp;&nbsp;&nbsp; if st[s]=1 then write('true')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else write('false');
&nbsp;&nbsp;&nbsp; writeln;
&nbsp;&nbsp;&nbsp; s:=s-1;
&nbsp;&nbsp;&nbsp; p:=p+1;
&nbsp; end;

{====================================================================}

{ <a
target=ff2 href="machine_note.htm#proccall说明">说明</a>,<a
target=ff2 href="machine_note.htm#过程例子">示例</a> }
procedure <a
name="proccall">proccall</a>(level,displ:integer);
&nbsp; var
&nbsp;&nbsp;&nbsp; x:integer;
&nbsp; begin
&nbsp;&nbsp;&nbsp; s:=s+1;
&nbsp;&nbsp;&nbsp; x:=b;
&nbsp;&nbsp;&nbsp; while level&gt;0 do begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x:=st[x];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; level:=level-1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;
&nbsp;&nbsp;&nbsp; st[s]:=x;
&nbsp;&nbsp;&nbsp; st[s+1]:=b;
&nbsp;&nbsp;&nbsp; st[s+2]:=p+3;
&nbsp;&nbsp;&nbsp; b:=s;
&nbsp;&nbsp;&nbsp; s:=b+2;
&nbsp;&nbsp;&nbsp; p:=p+displ;
&nbsp; end;

{======================================================================}
{ 执行这条命令时,需要在栈顶预先放置一个地址和若干个数值,这条命令将这些数值赋值给这个地址开始的
  一串地址空间中。其中,length就是数值的个数。 }
{ <a
target=ff2 href="machine_note.htm#赋值与数组例子">示例</a> }
procedure <a
name="assigm">assigm</a>(length:integer);
&nbsp; var
&nbsp;&nbsp;&nbsp; x,y,i:integer;
&nbsp; begin
&nbsp;&nbsp;&nbsp; s:=s-length-1;
&nbsp;&nbsp;&nbsp; x:=st[s+1];
&nbsp;&nbsp;&nbsp; y:=s+2;
&nbsp;&nbsp;&nbsp; i:=0;
&nbsp;&nbsp;&nbsp; while i&lt;length do begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st[x+i]:=st[y+i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i:=i+1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;
&nbsp;&nbsp;&nbsp; p:=p+2;
&nbsp; end;

{======================================================================}
{ 栈顶为假,则转移;否则,继续向下执行。}
Procedure <a
name="Dox">Dox</a>(Displ:integer);
begin
&nbsp; if St[s]=ord(true) then p:=p+2 else p:=p+Displ;
&nbsp; s:=s-1;
end;

{ 无条件跳转 }
Procedure <a
name="Gotox">Gotox</a>(Displ:integer);
begin
&nbsp; p:=p+displ;
end;

{<a
target=ff2 href="machine_note.htm#procedurex说明">说明</a>,<a
target=ff2 href="machine_note.htm#过程例子">示例</a>}
procedure <a
name="Procedurex">Procedurex</a>(Varlength,TempLength,Displ,LineNo:integer);
begin
&nbsp; s:=s+VarLength;
&nbsp; if s+TempLength&gt;Max then Error(LineNo,'Stack limit') else
&nbsp;&nbsp;&nbsp; p:=p+Displ;
end;

{<a
target=ff2 href="machine_note.htm#endproc说明">说明</a>,<a
target=ff2 href="machine_note.htm#过程例子">示例</a>}
procedure <a
name="EndProc">EndProc</a>(ParamLength:integer);
begin
&nbsp; s:=b-ParamLength-1;
&nbsp; p:=St[b+2];
&nbsp; b:=St[b+1];
end;

{ <a
target=ff2 href="machine_note.htm#programx说明">说明</a> }
procedure <a
name="Programx">Programx</a>(VarLength,TempLength,Displ,Lineno:integer);
begin
&nbsp; b:=StackBottom;
&nbsp; s:=b+2+varLength;
&nbsp; if s+TempLength&gt;Max then
&nbsp;&nbsp;&nbsp; Error(LineNo,'Stack Limit')
&nbsp; else
&nbsp;&nbsp;&nbsp; p:=p+Displ;
end;

{程序结束指令}
Procedure <a
name="EndProg">EndProg</a>;
begin
&nbsp; running:=false;
end;
<!--/font--></pre>

<pre><!--font style="font-family: 宋体; font-size: -13pt" size="3"-->{ 接下来的指令都是优化指令 }
{ localvar(displ) = variable(0,displ) }
Procedure localvar(Displ:integer);
begin
&nbsp; s:=s+1;
&nbsp; St[s]:=b+Displ;
&nbsp; p:=p+2;
end;

{ localvalue(displ) = localvar(displ) value(1) }
Procedure LocalValue(Displ:integer);
begin
&nbsp; s:=s+1;
&nbsp; St[s]:=St[b+Displ];
&nbsp; p:=p+2;
end;

{ Globalvalue(displ) = variable(1,displ) }
procedure GlobalValue(Displ:integer);
begin
&nbsp; s:=s+1;
&nbsp; St[s]:=St[St[b]+Displ];
&nbsp; p:=p+2;
end;

{ Globalvar(displ) = Globalvalue(displ) value(1) }
procedure Globalvar(Displ:integer);
begin
&nbsp; s:=s+1;
&nbsp; St[s]:=St[b]+Displ;
&nbsp; p:=p+2;
end;

{&nbsp;&nbsp; SimpleValue=Value(1)&nbsp;&nbsp; }
procedure SimpleValue;
begin
&nbsp; St[s]:=St[St[s]];
&nbsp; p:=p+1;
end;

{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleAssign=Assign(1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
procedure SimpleAssign;
begin
&nbsp; St[St[s-1]]:=St[s];
&nbsp; s:=s-2;
&nbsp; p:=p+1;
end;

{&nbsp;&nbsp;&nbsp; LocalCall(Displ)=ProcCall(0,Displ)&nbsp;&nbsp; }
procedure LocalCall(displ:integer);
begin
&nbsp; St[s+1]:=b;
&nbsp; St[s+2]:=b;
&nbsp; St[s+3]:=p+2;
&nbsp; b:=s+1;
&nbsp; s:=b+2;
&nbsp; p:=p+Displ;
end;

{&nbsp;&nbsp;&nbsp; GlobalCall(Displ)=ProcCall(1,Displ)&nbsp;&nbsp; }
procedure GlobalCall(displ:integer);
begin
&nbsp; St[s+1]:=St[b];
&nbsp; St[s+2]:=b;
&nbsp; St[s+3]:=p+2;
&nbsp; b:=s+1;
&nbsp; s:=b+2;
&nbsp; p:=p+Displ;
end;

procedure runprogram;
var
&nbsp; op:integer;
begin
&nbsp; running:=true;
&nbsp; p:=min;
&nbsp; while running do
&nbsp; begin
&nbsp;&nbsp;&nbsp; op:=St[p];
&nbsp;&nbsp;&nbsp; case op of
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:add;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1:andx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2:assigm(St[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3:constant(St[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4:divide;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5:dox(St[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6:endproc(St[P+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7:endprog;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9:equal;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10:field(St[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11:greater;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12:gotox(St[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13:index(St[p+1],St[p+2],St[p+3],St[p+4]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14:less;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15:minus;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16:modulo;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17:multiply;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18:notequal;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19:notgreater;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20:notless;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21:notx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22:orx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23:proccall(St[p+1],St[p+2]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24:procedurex(St[p+1],St[p+2],St[p+3],St[p+4]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25:programx(St[p+1],St[p+2],St[p+3],St[p+4]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26:readx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27:subtract;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 28:value(St[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29:variable(St[p+1],St[p+2]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30:varparam(St[p+1],St[p+2]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31:writeintx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32:writebooleanx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33:localvar(st[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34:localvalue(st[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35:globalvar(st[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 36:globalvalue(st[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 37:simplevalue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38:simpleassign;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39:globalcall(st[p+1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40:localcall(st[p+1]);
&nbsp;&nbsp;&nbsp; end;
&nbsp; end;
end;

{ 装入程序 }
procedure loadprogram;
var
&nbsp; x:integer;
begin
&nbsp; x:=min;
&nbsp; while not eof(obj_f) do
&nbsp; begin
&nbsp;&nbsp;&nbsp; read(obj_f,St[x]);
&nbsp;&nbsp;&nbsp; x:=x+1;
&nbsp; end;
&nbsp; stackbottom:=x;
end;

begin
&nbsp; write('please enter obj_filename:');
&nbsp; readln(filename);

&nbsp; assign(obj_f,filename);
&nbsp; reset(obj_f);
&nbsp; loadprogram;
&nbsp; close(obj_f);
&nbsp; runprogram;
end.
</font></pre>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -