Pascal News
Pascal News
Pascal News
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
2801<br />
2802<br />
2803<br />
2804<br />
2805<br />
2806<br />
2807<br />
2808<br />
2809<br />
2810<br />
2811<br />
2812<br />
2813<br />
2814<br />
2815<br />
2816<br />
2817<br />
2818<br />
2819<br />
2820<br />
2821<br />
2822<br />
2823<br />
2824<br />
2825<br />
2826<br />
2827<br />
2828<br />
2829<br />
2830<br />
2831<br />
2832<br />
2833<br />
2834<br />
2835<br />
2836<br />
2837<br />
2838<br />
2839<br />
2840<br />
2841<br />
2842<br />
2843<br />
2844<br />
2846<br />
2848<br />
2849<br />
2851<br />
2852<br />
2853<br />
2854<br />
2855<br />
2856<br />
if aspnil then<br />
case asp'.form of<br />
scalar:<br />
if asp=realptr then genO (op emf) else<br />
if asp=longptr then genO(op::::emd) else genO(op_cmi);<br />
pointer:<br />
if (lsy=eqsy) or (lsy=nesy) then genO(op_cmp) else<br />
asperr(+0216);<br />
power:<br />
case lsy of<br />
eqsy,nesy: setop(op emu);<br />
ltsy,gtsy: asperr(+0217);<br />
lesy: l'a=b' equivalent to 'a=b+a')<br />
begin sz:=even(sizeof(asp»; gen1(op dup,2*sz);<br />
gen1(op beg,-sz); setop(op ior); -<br />
setop(op emu); lsy:=eqsy -<br />
end -<br />
end; {case)<br />
arrays:<br />
if string( asp) then<br />
begin 13: =lino; gen1(op mrk,O); exehange(ll,13);<br />
gen1(op loe,asp' .size); gensp(BCP)<br />
end -<br />
else asperr{+0218);<br />
records: asperr(+0219);<br />
files: asperr(+0220)<br />
end; {case)<br />
case lsy of<br />
ltsy: genO (op tlt);<br />
lesy: genO (op-tle);<br />
gtsy: genO(op-tgt);<br />
gesy: genO(op-tge);<br />
nesy: genO(op-tne);<br />
eqsy: genO(op::::teq)<br />
end<br />
end;<br />
asp:=boolptr; ak:=loaded<br />
end;<br />
end end;<br />
{== = = = == = = = == = = === = == = ==== = = = = = == = = = = == = = == = = == = = = = = = = = = = = = = == == = = = = )<br />
proc"liure statement(fsys :sos); forward;<br />
{this forward declaration can be avoided}<br />
procedure assigrnnent( fSys :sos; fiD :ip);<br />
var la:attr; 11,12:integer;<br />
begin<br />
11: =lino; seleetor( fsys+[becomesl, fip, [assigned l); 12: =lino;<br />
la:=a; nextif(beeomes,+0221);<br />
expression(fsys}; loadcheap; cbeckasp( la.asp,+(222);<br />
2857<br />
2858<br />
2859<br />
2860<br />
2861<br />
2862<br />
2863<br />
2864<br />
2865<br />
2866<br />
2867<br />
2869<br />
2870<br />
2871<br />
2872<br />
2873<br />
2874<br />
2875<br />
2876<br />
2877<br />
2878<br />
2879<br />
2880<br />
2881<br />
2882<br />
2883<br />
2884<br />
2885<br />
2886<br />
2887<br />
2888<br />
2889<br />
2890<br />
2891<br />
2892<br />
2893<br />
2894<br />
2895<br />
2896<br />
2897<br />
2899<br />
2900<br />
2901<br />
2902<br />
2903<br />
2905<br />
2906<br />
2907<br />
2908<br />
2909<br />
2910<br />
2911<br />
2912<br />
exehange(ll,12); a:=la;<br />
if not formof(la.asp,[arrays .. recordsJ) then store else<br />
begin loadaddr;<br />
if la.asp' .formearray then<br />
gen 1(op blm,even(sizeof(la.asp»)<br />
else -<br />
begin genl(op mrk,O); descraddr(la.asp' .arpos); gensp(ASZ);<br />
genO (op blsT<br />
end; -<br />
end;<br />
end;<br />
procedure gotostatement;<br />
{jtunps into structured statements can give strange results. }<br />
label 1;<br />
var 11p:lp; lbp:bp; diff:integer;<br />
begin<br />
if syintcst then error(+0223) else<br />
begin IIp:=searehlab(b.lehain,val);<br />
if 11pnil then<br />
if 11p' .seen then ·genl (op brb,11p' .labname)<br />
else gen 1 (op brf ,11p' .labname)<br />
else -<br />
begin lbp:=b.nextbp; diff:=l;<br />
while lbpnil do<br />
begin 11p:=searehlab( lbp' .lehain, val);<br />
if 11pnil then goto 1;<br />
lbp:=lbp' .nextbp; diff:·=diff+l;<br />
end;<br />
1: if 11p=nil then errint(+0224, val) else<br />
begin<br />
if 11p' .labdlb=O then<br />
begin dlbno:=dlbno+l; Up' .labdlb:=dlbno;<br />
gend(ps fwa,dlbno); {forward data reference}<br />
end; -<br />
gen 1 (op mrk,diffl; gend (op_lae·, 11p' .labdlb); gensp(GTO);<br />
end; -<br />
end;<br />
insym;<br />
end<br />
end;<br />
procedure compoundstatement( fsys :808; err :integer);<br />
begin<br />
repeat statement(fsys+[semieolonJ)<br />
until endofloop( fsys I [beginsy .. casesy] I semicolon ,err)<br />
end;<br />
procedure ifstatement(fsys :808);<br />
var Ib1,lb2:integer;<br />
begin with b do begin<br />
expression( fsys+[ thensy ,elsesyl);<br />
force(boolptr ,+0225); ilbno :=ilbno+l; lbl: =i1bno; gen 1(op_zeq,lbl );<br />
next1f(thensy ,+0226); statement( fsys+[elsesyl);<br />
if find3(elsesy,fsys,+0227) then<br />
begin ilbno:=ilbno+l; lb2:=ilbno; gen1(op_brf,lb2);<br />
,.<br />
-0<br />
'"<br />
'"