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.
561<br />
562<br />
563<br />
564<br />
565<br />
566<br />
567<br />
568<br />
569<br />
570<br />
571<br />
572<br />
573<br />
574<br />
575<br />
577<br />
578<br />
579<br />
580<br />
581<br />
582<br />
584<br />
585<br />
586<br />
587<br />
588<br />
589<br />
590<br />
592<br />
593<br />
594<br />
595<br />
596<br />
597<br />
598<br />
599<br />
600<br />
601<br />
602<br />
603<br />
604<br />
605<br />
606<br />
607<br />
608<br />
609<br />
610<br />
611<br />
613<br />
614<br />
615<br />
616<br />
if lip=nil then top' .fname:=fip else<br />
begin<br />
repeat lip 1: =lip;<br />
if lip' .name>nam then<br />
begin lip:=l1p' .llink; lleft :=true end<br />
else<br />
begin if lip' .name=nam then again:=true; {name conflict)<br />
lip :=lip' .rlink; lleft: =false;<br />
end;<br />
until l1p=nil;<br />
if Heft then lip1' .llink:=fip else lip1' .rlink:=fip<br />
end:;<br />
fip' .1link:=nll; fip' .rlink:=n11;<br />
if again tben err id (+02, nam) ;<br />
end;<br />
procedure initpos( var ~ p:posi tion);<br />
begin p.lv:=level; p.ad:=O;<br />
lifdef SEGMENTS<br />
p.sg:=O<br />
lendif<br />
end;<br />
procedure inita(fsp:sp; fad:integer);<br />
begin wi tb a do begin<br />
asp:=fsp; packbit:=false; ak:=fixed; pos.ad:=fad; pos.lv:=level;<br />
IUdef SEGMENTS<br />
pos.sg:=O;<br />
'endif<br />
end_ end;<br />
function newip(kl:idclass; n:alpba; idt:sp; nxt:ip):ip;<br />
var p:ip; f:iflagset;<br />
begin f:=[l;<br />
case kl of<br />
types,carrbnd~ {similar structure)<br />
new(p,types);<br />
konst:<br />
beginnew(p,konst);~ p' .value:=O end;<br />
vars:<br />
begin new(p,vars); r :=[used ,assigned]; initpos(p ..... vpos) end;<br />
field:<br />
begin new(p,field); p' .foffset:=O end;<br />
proc,func: {same structurel<br />
begin new(p,proc ,actual); p' .pfkind: =actual;<br />
initpos( p' .pfpos); p' .pfno: =0; p' .parhead: =n11; p' .headlc: =0<br />
end<br />
end;<br />
p' .name:=n; p' .klass:=kl; p' .idtype:=idt; p' .next;=nxt;<br />
p' .1link:=n11; p' .rlink:=nll; p' .iflag:=f; newip:=p<br />
end;<br />
function newsp(sf:structform; sz:integer):sp;<br />
var p:sp; sflag:sflagset;<br />
begin sflag:=[l;<br />
case_sf of<br />
617<br />
618<br />
619<br />
620<br />
621<br />
622<br />
623<br />
624<br />
625<br />
626<br />
627<br />
628<br />
.629<br />
630<br />
631<br />
632<br />
633<br />
634<br />
635<br />
636<br />
637<br />
639<br />
640<br />
641<br />
642<br />
643<br />
644<br />
645<br />
646<br />
647<br />
648<br />
649<br />
650<br />
651<br />
652<br />
653<br />
654<br />
655<br />
656<br />
657<br />
658<br />
659<br />
660<br />
661<br />
662<br />
663<br />
664<br />
665<br />
666<br />
667<br />
668<br />
669<br />
670<br />
671<br />
672<br />
scalar:<br />
begin new(p,scalar); p .... scalno:=O; p'" .fcanst:=nil end;<br />
subrange:<br />
new( p,subrange);<br />
pointer:<br />
begin new(p,pointer); p·.eltype:=n11 end;<br />
power:<br />
new( P ,power) ;<br />
files:<br />
begin new(p,files); sflag:=[withfilel end;<br />
arrays,earray: {same structurel<br />
new(p,arrays);<br />
records:<br />
new(p,records) ;<br />
variant:<br />
new(p,variant):<br />
tag:<br />
new(p,tag);<br />
~d; ...<br />
P .form:=sf; p .size:=sz; p'" .sflag:=sflag; newsp:=p;<br />
end;<br />
procedure init 1;<br />
var c :char;<br />
begin<br />
!initialize the first name space)<br />
new(top,blck); top·.occur:=blck; top·.nl1nk:=n11; top·.fname:=nll;<br />
level :=0;<br />
{reserved words}<br />
rw[ Ol:='if '; rw[ 1]: =' do 1 ; rw[ 2l:='of ';<br />
rw[ 3l:='to '; rw[ 4 J: =' in I; rw[ 5l:='or ';<br />
rw[ 6]:='end '; rw[ 7l: = ' for ' • rw[ 8l:='nil<br />
,.<br />
rw[ 9]: ='var '; rw[10):='div I; rw[ 11]: = 'mod<br />
,.<br />
rw[12]:='set '; rw[13l: ='and '; rw[ 14l: = 'not<br />
,.<br />
rw[15l:='then ,. rw[ 16l: ='else '; rw[17l:='with ';<br />
rw[ 1 B]: =' case I; rw[19l:='type ,. rw[20]: =' goto t;<br />
rw[21]:='file I; rw[22l:='begin '; rw[23l:='until ';<br />
rw[2ijl:='while ,. rw[25]:='array ,. rw[26]:='const I.<br />
rw[27l:='label '; rw[28J:='r€>peat I; rw[29l: = 'record ,.<br />
rw[30l:='downto '; rw[""; _::='packed , rw[32l:='program '~;<br />
rw(33]: ='function'; r'."i. ]:::' procedur ';<br />
{corresponding symbols)<br />
rsy[ Ol:=ifsy; rsy[ 1]:=dosy; rsy[ 2l: =oj"sy;<br />
rsy[ 3l:=tosy; rsy[ ijl:=insy; rsy[ 5l:=orsy;<br />
rsy[ 6l:=endsy; rsy[ 7l:=forsy; rsy[ 8l: =nilcst;<br />
rsy[ 9l:=varsy; rsy[10l:=divsy; rsy[11l: =modsy;<br />
rsy[12l: =setsy; rsy[13l: =andsy; rsy[14l:=notsy;<br />
rsy[ 15l: =thensy; rsy[ 16l: =elsesy; rsy[17l: =withsy;<br />
rsy[ 18l: =casesy; rsy[ 19l: =typesy; rsy[20l: =gotosy;<br />
rsy[21l: =filesy; rsy[22l: =beginsy; rsy[23l: =untilsy;<br />
rsy[2ij l: =whilesy; rsy[25l: =arraysy; rsy[26l: =cOnstsy;<br />
rsy[271: =labelsy; rsy[28l: =repeatsy; rsy[29l: =recordsy;<br />
rsy[30l: =downtosy; rsy[31l: =packedsy'; r sy[ 32l: =progsy;<br />
rsy[33l: =funcsy; rsy[34l: =procsy;<br />
!indices into rw to find reserved words fast)<br />
frw[Ol:= 0; frw[1l:= 0; frw[2l:= 6; frw[3l:=15; frw[4l:=22;<br />
....<br />
CD<br />
00<br />
....<br />
,.<br />
-0<br />
'"<br />
'"