📄 machine_src.htm.bak
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>3</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<style>
.unnamed1 { font-family: "宋体"; font-size: 9pt; text-decoration: none; color: #666666}
body { font-family: "宋体", "仿宋_GB2312", "楷体_GB2312"; font-size: 9pt}
tr { font-family: "宋体", "仿宋_GB2312", "楷体_GB2312"; font-size: 9pt}
body {
background-color:#FFFFFF;
SCROLLBAR-FACE-COLOR: #f0f0f0;
SCROLLBAR-HIGHLIGHT-COLOR: #ffffff;
SCROLLBAR-SHADOW-COLOR: #339966;
SCROLLBAR-3DLIGHT-COLOR: #339966;
SCROLLBAR-ARROW-COLOR: #000000;
SCROLLBAR-TRACK-COLOR: #f0f0f0;
SCROLLBAR-DARKSHADOW-COLOR: #ffffff
}
-->
</style>
</head>
<body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" bgcolor="#FFFFFF" text="#669933" link="#CC3300" bgproperties="fixed" background="bj.gif">
<h3>3.Pascal计算机的解释程序</h3>
<p>program interpret<br>
const<br>
min=0;<br>
max=8191;<br>
type<br>
store=array [min..max] of integer;<br>
var<br>
st:store;<br>
filename:string[80];<br>
obj_f:file of integer;<br>
p,b,s:integer;<br>
stackbottom:integer;<br>
running:boolean;<br>
<br>
{=========================================================================}<br>
{ 显示错误信息 } <br>
procedure error(lineno:integer; text:string);<br>
begin<br>
write('line: ');<br>
write(lineno:1,' ');<br>
write('s=',s:5,' ');<br>
write(text);<br>
writeln;<br>
running:=false;<br>
end;<br>
<br>
{========================================================================}<br>
{ <a target=ff2 href="machine_note.htm#variable说明">说明</a>,<a
target=ff2 href="machine_note.htm#赋值与数组例子">示例</a> }<br>
procedure <a name="variable">variable</a>(level,displ:integer);
<br>
var<br>
x:integer;<br>
begin<br>
s:=s+1;<br>
x:=b;<br>
while level>0 do begin<br>
x:=st[x];<br>
level:=level-1;<br>
end;<br>
st[s]:=x+displ;<br>
p:=p+3;<br>
end;<br>
<br>
{=========================================================================}<br>
{ <a target=ff2 href="machine_note.htm#varparam说明">说明</a> } <br>
procedure <a name="varparam">varparam</a>(level,displ:integer);<br>
var<br>
x:integer;<br>
begin<br>
s:=s+1;<br>
x:=b;<br>
while level>0 do begin<br>
x:=st[x];<br>
level:=level-1;<br>
end;<br>
st[s]:=st[x+displ];<br>
p:=p+3;<br>
end;<br>
<br>
{========================================================================}<br>
{ <a target=ff2 href="machine_note.htm#index说明">说明</a>,<a
target=ff2 href="machine_note.htm#赋值与数组例子">示例</a> }<br>
procedure <a name="index">index</a>(lower,upper,length,lineno:integer);<br>
var<br>
i:integer;<br>
begin<br>
i:=st[s];<br>
s:=s-1;<br>
if (i<lower) or (i>upper) then error(lineno,'Range error')<br>
else st[s]:=st[s]+(i-lower)*length;<br>
p:=p+5;<br>
end;<br>
<br>
{=========================================================================}<br>
{ displ为域名相对于记录首址的偏移;
执行这条命令时栈顶存需预先存放记录的首址 } <br>
procedure <a name="field">field</a>(displ:integer);<br>
begin<br>
st[s]:=st[s]+displ;<br>
p:=p+2;<br>
end;<br>
<br>
{=========================================================================}</p>
<p style="font-family: 宋体; font-size: -13pt">{ Factor="constant"|Variable
Access"Value"|Expression|Factor"Not" }<br>
<br>
{将常数值value置于栈顶}<br>
{ <a target=ff2 href="machine_note.htm#赋值与数组例子">示例</a> } <br>
procedure <a name="constant">constant</a>(value:integer);<br>
begin<br>
s:=s+1;<br>
st[s]:=value;<br>
p:=p+2;<br>
end;<br>
<br>
{=========================================================================}<br>
<br>
{ 执行这一操作时,栈顶存放着一个地址; <br>
这个操作将从这个地址开始的length个连续的地址转变为相应的值
} <br>
{ <a target=ff2 href="machine_note.htm#赋值与数组例子">示例</a> } <br>
procedure <a name="value">value</a>(length:integer);<br>
var<br>
x,i:integer;<br>
begin<br>
x:=st[s];
{ 取得起始地址 }<br>
i:=0;<br>
while i<length do begin
|<br>
st[s+i]:=st[x+i]; | { 将length连续的地址变为相应的值
}<br>
i:=i+1;
|<br>
end;
|<br>
s:=s+length-1;
{ 移动栈顶指针 }<br>
p:=p+2; <br>
end;<br>
<br>
{==========================================================================}<br>
{ 将栈顶值取反 }<br>
procedure <a name="notx">notx</a>;<br>
begin<br>
if st[s]=ord(true) then st[s]:=ord(false)<br>
else st[s]:=ord(true);<br>
p:=p+1;<br>
end;<br>
<br>
{=========================================================================}</p>
<pre><font style="font-family: 宋体; font-size: -20pt" face="宋体" size="3">{ Term = Factor{Factor Multiplying Operator } ;
Multiplying Operator = "Multiply"|"Divide"|"Modulo"|"And" }</font></pre>
<pre><font style="font-family: 宋体; font-size: -13pt">
</font><!--font
style="font-family: 宋体; font-size: -13pt" size="3"-->{ 将栈顶依次存放的两个值之积置于栈顶 }
{ <a
target=ff2 href="machine_note.htm#表达式例子">示例</a> }
procedure <a
name="multiply">multiply</a>;
begin
s:=s-1;
st[s]:=st[s]*st[s+1];
p:=p+1;
end;
{=========================================================================}
{ 将栈顶依次存放的两个值之商置于栈顶 }
procedure <a
name="divide">divide</a>;
begin
s:=s-1;
st[s]:=st[s] div st[s+1];
p:=p+1;
end;
{=========================================================================}
{ 将栈顶依次存放的两个值取模的结果置于栈顶 }
procedure <a
name="modulo">modulo</a>;
begin
s:=s-1;
st[s]:=st[s] mod st[s+1];
p:=p+1;
end;
{=======================================================================}
{ 将栈顶依次存放的两个值相与的结果置于栈顶 }
procedure <a
name="andx">andx</a>;
begin
s:=s-1;
if st[s]=ord(true) then st[s]:=st[s+1];
p:=p+1;
end;
{=======================================================================}
{ 将栈顶存放的值的负值置于栈顶 }
procedure <a
name="minus">minus</a>;
begin
st[s]:=-st[s];
p:=p+1;
end;
{======================================================================}
{ 将栈顶依次存放的两个值相加的结果置于栈顶 }
{ <a
target=ff2 href="machine_note.htm#表达式例子">示例</a> }
procedure <a
name="add">add</a>;
begin
s:=s-1;
st[s]:=st[s]+st[s+1];
p:=p+1;
end;
{=======================================================================}
{ 将栈顶依次存放的两个值相减的结果置于栈顶 }
procedure <a
name="subtract">subtract</a>;
begin
s:=s-1;
st[s]:=st[s]-st[s+1];
p:=p+1;
end;
{=======================================================================}
{ 将栈顶依次存放的两个值相或的结果置于栈顶 }
procedure <a
name="orx">orx</a>;
begin
s:=s-1;
if st[s]=ord(false) then st[s]:=st[s+1];
p:=p+1;
end;
{=======================================================================}
{ 判断栈顶依次存放的两个元素的大小,将布尔型的结果置于栈顶 }
procedure <a
name="less">less</a>;
begin
s:=s-1;
st[s]:=ord(st[s]<st[s+1]);
p:=p+1;
end;
{======================================================================}
{ 判断栈顶依次存放的两个元素是否相等,将布尔型的结果置于栈顶 }
procedure <a
name="equal">equal</a>;
begin
s:=s-1;
st[s]:=ord(st[s]=st[s+1]);
p:=p+1;
end;
{====================================================================}
{ 判断栈顶依次存放的两个元素的大小,将布尔型的结果置于栈顶 }
procedure <a
name="greater">greater</a>;
begin
s:=s-1;
st[s]:=ord(st[s]>st[s+1]);
p:=p+1;
end;
{=====================================================================}
{ 判断栈顶依次存放的两个元素的大小,将布尔型的结果置于栈顶 }
procedure <a
name="notgreater">notgreater</a>;
begin
s:=s-1;
st[s]:=ord(st[s]<=st[s+1]);
p:=p+1;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -