SyntaxMeaning..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................Notation: item | item=choose one; ?item=zero or one item; terminals: SMALL CAPS, underlined or punctuation other than bold ()?| (parens are terminals only in rules 19, 25, 51.1, 54, | only in 55). item s ...=zero or more items, separated by s; item s !..=one or more items, separated by s; with s=";", a trailing ";" is optional; s is one of: empty "," ";" IN ELSE OR.Abbreviated non-terminals: b=binding13; d=declaration11; e=expression19; n=name56; s=statement14; t=type36.4 Feb 83Comments: ·=obsolete; µ=efficiency hack; ¸=unsafe; ¹=machine dependent; n56 means n is defined in rule 56; n2=n (the subscript is only for the desugaring). CLRMSumm.pressExamplesNotes 1 module ::= DIRECTORY (nd (: TYPE (nt | ) | ) l [ (nd : ( (TYPE nt | TYPE nd) | TYPE nd), ... ] IN ?(USING [ nu, ... ] ) ), ... ; LET (nd~RESTRICT[nd, [$nu, ... ] ] ), ... ( interface | implementation )IN ( interface | implementation ) 2 interface ::= nm, !.. : ?CEDAR DEFINITIONS l [((niv | nit):MKINSTANCETYPE[nit]), ...]=>?locks ?(IMPORTS ( (niv : | ) nit ), ...) [nm: TYPE nm] IN?·(SHARES ns, ...) -- Access to PRIVATE names in ns is allowed.~ ?·access12 { ?open7 (d | b); !.. } .LET REC nm~open [ ?(lock(~locks, ) (d | b), ... ] IN nmDIRECTORY Rope: TYPE USING [ROPE, Compare], -- There should always be a USING clause CIFS: TYPE USING [OpenFile,Error,Open,read],-- unless most of the interface is usedIO: TYPE IOStream,Buffer: TYPE;-- or it is exported. 3 implementation ::= nm : ?CEDAR l [( ( niv | nit ):MKINSTANCETYPE[nit]), ...]=>?safety ( PROGRAM ?drType42 | [(ne: ne) , ... , nm: TYPE nm , CONTROL: PROGRAM] ] IN MONITOR ?drType42 ( | locks) )( | ( LET LOCK:MONITORLOCK IN LET l(~(l IN LOCK) IN | ))?(IMPORTS ( (niv : | ) nit ), ...) LET b(~NEWPROGINSTANCE[block].UNCONS IN?(EXPORTS ne, ...) [ (ne~BINDDFROM[ne, b(] ), ... , nm~b(, CONTROL~b(.nm ]?·(SHARES ns, ...)where the body of the block is desugared thus:~ ?·access12 block . [( | ( | l(~locks,)) (d | b), ... , nm: PROGRAM drType~{s;...}]4 safety ::= SAFE | UNSAFE --In 3, 41.5 locks ::= LOCKS e ?( USING nu: t)l ?( [nu : t] ) IN eBufferImpl: MONITOR [f: CIFS.OpenFile] -- Implementations can have arguments.LOCKS Buffer.GetLock[h]^ -- LOCKS only in MONITOR, to specifyUSING h: Buffer.Handle-- a non-standard lock.IMPORTS Files: CIFS, IO, Rope-- Note the absence of semicolons.EXPORTS Buffer-- EXPORTS in PROGRAM or MONITOR.~ { -- module body -- } . -- Note the final dot. 6 block ::= ?(CHECKED | UNCHECKED | TRUSTED) { ?open ?enable ?body open LET n((, ... : EXCEPTION~NEWLABEL[] , ... ?(EXITS (n, !..=>s); ...) } IN ( body enable ) BUT { (n((, ... => s ); ... } --In 3, 13, 15.-- But n(( is not visible in s. 7 open ::= OPEN ( n ~~ e | e ), !.. ;( LET n~lopen IN e.DEREF | --The IN before !.. is a separator.In 2, 5, 17. ·The ~~ may be written as :. LET BINDP[D(e.DEREF).P, OPENPROCS[D(e.DEREF).P, l IN e.DEREF] ] ) IN !.. IN 8 enable::=ENABLE(enChoice|BUT ( { enChoice } | {enChoice; ...});{ enChoice; ... } )In 5, 17. 9 enChoice ::=( e, !.. | ANY ) => s( e | ANY ), ... => { s; REJECT; EXITSIn 7, 27.1. Retry(=>GOTO Retry((14; Cont(=>GOTO Cont((14 } 10 body ::= (d | b); !.. ; s; ... | s; !..LET NEWFRAME[ REC [(d | b), ...] ].UNCONS IN { s; ...} In 5, 17. CHECKED { -- Unnamed OPEN OK for exportedOPEN Buffer, Rope; -- interface or one with a USING clause.ENABLE Buffer.Overflow=>GOTO HandleOvfl;-- A single choice needn't be in {}.stream: IO.Stream~IO.CreateFileStream["X"];-- Use a binding if a name's value is fixed.x: INT_7; -- Better to initialize declared names.{OPEN b~~GetBuffer[stream];-- A statement may be a nested block. ENABLE {-- Multiple enable choices must be in {}.Files.Error--[error, file]--=>{-- ERRORs can have parameters.stream.Put[IO.rope[error]]; ERROR Buffer.Error["Help"] };-- Choices are separated by semicolons.ANY=>{ x_12; GOTO AfterQuit } };-- ANY must be last. ENABLE ends with ;.y: INT_9; ... };-- Other bindings, decls and statements.x_stream.GetInt; ...-- Other statements in the outer block.EXITS-- Multiple EXIT choices are not in {}.AfterQuit=>{...};-- AfterQuit, HandleOvfl declared here, HandleOvfl=>{...} };-- legal only in a GOTO in the block.11 declaration ::= n, !.. : ?access12 varTC40( n: varTC ), ...In 2, 10, 43. VAR, READONLY only for interface var.12 access ::= PUBLIC | PRIVATEIn 2, 3, 11, 13, 50, 51, 53.13 binding ::= n, !.. : ?access12 t ~ (LET x( : t ~ ( -- The desugaring for n is at the end.e | e |t2 -- if t=TYPE | t2 -- Same as e except for conflicting syntax. |CODE | NEWEXCEPTIONCODE[] --tgSIGNAL or ERROR |?INLINE ?(ENTRY | INTERNAL) block6 | l [d(: t.DOMAIN] IN LET r(~NEWFRAME[t.RANGE].UNCONS IN (LET r( IN {t.DOMAIN~d(; block; RETURN} BUT {Return(((=>r(}) |¹¸ ?TRUSTED MACHINE CODE {(e, ...); ...} MACHINECODE[(BYTESTOINSTRUCTION[e, ...]), ...])) IN n, ... ~ x( -- e is evaluated only once.In 2, 10. ·The ~ may be written as =. Block or MACHINE CODE only for proc types. ·ENTRY and INTERNAL can also be before t.HistValue: TYPE[ANY];-- Interface: An exported type.Histogram: TYPE~REF HistValue;-- A type binding.baseHist: READONLY Histogram;-- An exported variable .AddHists: PROC[x, y: Histogram] -- An exported proc.RETURNS [Histogram];LabelValue: PRIVATE TYPE~RECORD[-- PRIVATE only for secret first,last:INT,s:ROPE,x:REAL,f,g:INT,r:REF ANY];-- stuff in an interface.Label: TYPE~REF LabelValue;Next: PROC[l: Label] RETURNS[Label]~-- An inline proc binding.INLINE { RETURN [NARROW[l.r]] };H: TYPE~Histogram11; Size: INT~10;-- Implementation: Binds a TYPE and INT.HistValue: PUBLIC TYPE~HV40.1;-- PUBLIC for exports.baseHist: PUBLIC H_NEW[HistValue_ALL[17]];-- An exported variable x, y: HistValue_[ 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0];-- with initialization.FatalError: ERROR[reason: ROPE]~CODE;-- Binds an error.Setup: PROC [bh: Handle3, a: INT]~ENTRY {...};-- Binds an entry proc.i,j,k: INT_0; p,q: BOOL; lb: Label; main: Handle;14 statement ::= sS{ SIMPLELOOP {sS; GOTO Cont((; EXITS Retry((=>NULL};In 6, 10, 17, 19. EXITS Cont((=>NULL } 15 sS ::=e1_e2 | e | block6 | escape | loop | NULL[e1_e2].TOVOID | e --must yield VOID-- | --all yield VOID--16 escape ::= GOTO n | GO TO n | EXORVAL[exception[code~ n((, args~NIL]] |EXIT | CONTINUE | ·LOOP | ·RETRY |GOTO ( Exit(17 | Cont(9 | Loop(17| Retry(9) |(RETURN | RESUME) ?e | { ?(r(13_e;) GOTO (Return(13 | Resume(13) } |·REJECT | ¸¹e _ STATETHISEXCEPTION[] | DUMPSTATE[e]x_AddHists[baseHist, baseHist]^;-- A statement can be an assignment,Setup[bh~main, a~3];-- or an application without results,{ENABLE FatalError=>RETURN[0]; []_f[3]; ...};-- or a block,IF i>3 THEN RETURN[25] ELSE GOTO NotPresent;-- or an IF or an escape statement,17 loop ::= (iterator | ) { ( iterator ; | done(~FALSE; Next(: PROC~{}; )(WHILE e | UNTIL e | ) { Test(~l IN (NOT e | e | FALSE);DO ?·open7 ?·enable8 ?body10 { open SIMPLELOOP { IF Test([] OR done( THEN GOTO FINISHED; { enable body EXITS Loop(=>NULL }; Next([] }?(REPEAT (n, !..=>s); ...) ENDLOOP EXITS Exit(gNULL; (n, !..gs); ...; FINISHEDgNULL}}}FOR t:INT DECREASING IN [0..5) UNTIL f[t]>3 DO -- or a loop. Try to declare t in the FOR u: INT_0; ... ; u_t+4; ...-- as shown. Avoid OPEN or ENABLE REPEAT Out=>{...}; FINISHED=>{...} ENDLOOP;-- after DO (use a block). FINISHED -- must be last.18 iterator ::= THROUGH e | FOR x(: e IN e | FOR (n : t | µn) ( n: t; | ) ( ( | DECREASING) IN e | ( Range(: TYPE~e; done(: BOOL_Range(.ISEMPTY; Next(: PROC~{ IF n ( >Range(.LAST | j), i*j, i_3, i NOT >j, p OR q, lb.r^];-- An application with sample expressions.lv19_[first~0, last~10, x~3.14, g~2, f~5];-- Short for lv_LabelValue13[...].[first~i, last~j]_lv19;-- Assignment to VAR binding -- (extractor).20 prefixOp ::= @ (8) | � (7) | (~ | NOT) (3)VARTOPOINTER | UMINUS | NOT21 infixOp ::= * | / | MOD (6) | + | � (5) | _ (0)TIMES | DIVIDE | REM | PLUS | MINUS | ASSIGN22 relOp ::= ?NOT ( ?~ (= | < | >) | # | ?NOT ( ?NOT x(.(EQUAL | LESS | GREATER)[y(] | x(~=y( | (<= | >=) | IN) x(=y( OR x( (< | >) y( | x(>=y(.FIRST AND ( x(<=y(.LAST --In 19, 30. BUT {BoundsFault=>FALSE} ) )23 builtIn ::= -- These are enumerated in Table 4�5.24 funnyAppl ::= FORK | JOIN | WAIT | NOTIFY | BROADCAST | SIGNAL | ERROR | RETURN WITH ERROR |·NEW | ·START | ·RESTART |¹¸TRANSFER WITH | ¹¸RETURN WITH25 subrange ::= (typeName37 | ) LET t(~(typeName | INT) , first(~( e1 | e1.SUCC ) IN ( [ | ( ) e1 .. e2 ( ] | ) ) t(.MKSUBRANGE[first(, (e2 | e2.PRED )] BUT --In 19, 39, 48. {BoundsFault=>t(.MKEMPTYSUBRANGE[e1]}b: BOOL_i IN [1..10]; FOR x: INT IN (0..11) DO ...;-- Subrange only in types or with IN.b_( c IN Color54(red..green] OR x IN INT[0..10) );-- The INT is redundant.ÿîŒïhÐpî–îÒïlqðÿðÿð\î°ïRrsô>tstsð"uô5sô> î$ïþ†î(¡ïRtsðEî°ï8tstsð"tststsð!tstsð#tsusususî°ïrsrtsïdqïsts ïdqïsts ïdqïstsïdqïsts ïdqïstsïdqïsîO­î°ïársðAï'qïásð!ï¾qïásð.îJøî5ïïhÐpîJ½îGïgÙqô#tô>sustsïg¶vïgÙstsustsïg¶vïgÙststststîBswstïg¶vïgÙststustïg¶vïgÙstsustïg¶vïgÙtstsustïg¶vïgÙtstsxuô5sô>î¨ïf¿ð!tusïfœvïf¿ststststsîBxstïfœvïf¿sxstïfœvïf¿stïfœvïf¿stststsî¨ïe¥ts tstîBxstststst stîGïd®qô#tô>sïd‹vuïd®ststusu sîBwstïd‹vïd®ststïd‹vïd®tsx stïd‹vïd®ststsî¨ïc”tstuststsïcqvïc”ststsïcqvïc”ststsî‡ tïcqvïc”sustïcqvïc”sxô5î¨ïbztstusô>ïbWvïbzstsîB us tïbWvïbzs î¨ïa`tsïa¦qïa`stsïa¦qïa`ststststsîBxô5sô>tïa=vïa`ststsyststststststsvô5xsô>tïa=vî-ÁïgÙuô5î.qïfâsô>uô5sô>us îCusî.qïeëususîCð)î.qïdôus î.qïcýuô5îCsô>îGï_ÿqô#t ô>sï_Üvï_ÿstusuô5îBwsô>tststï_Üvï_ÿststï_Üvï_ÿstsx stï_Üvï_ÿststsî¨ï^åtstsustsï_+qï^åstîBstï^Âvï^åstï^Âvï^åtststï^Âvï^åsustï^Âvï^åsususxî¨ï]Ëuô5sô>tsï^qï]ËstststîBtststsxsusu xô5sô>xsysî%uï]“þUî%Êï]Ëwsxsusî*ï]“þUî*rï]Ëxststî¨ï\Ôuststsï\±vï\Ôststsï\±vï\ÔststsîBxsysxstî Vï\œþ:î"�ï\Ôsxsxî¨ï[ºtusï[—vï[ºstîBstï[—vï[ºsxstï[—vï[ºsystststï[—vï[ºsysusystï[—vï[ºsî¨ïZ tstusïZ}vïZ stîBsð.î¨ïY†tsïYÌqïY†sîBtstststsystststststïYcvïY†suststsî¨ïXltsîGïWuqô#tô>sustsusvô5îGïV~qô#tô>sustsusïV[vïV~stîBwststïV[vïV~ststsxstî-Áï_ÿs usîCð&î.qï_usîCuô5sô>us î/!ï^usîCî.qï]usîCð"î.qï\#usîCusususî-Áï[,îCîGïU–þSÉîGïT�qô#tsô>tsî¨ïS™tustsustsutsî¨ïR¢tststsîBtîBïRjþõî7ïR¢sxstystsxsxstî¨ïQ«uststststsîBxsîÐïQsþUî%ïQ«tîcïQsþíîPïQ«stîŽïQsþ¦î4ïQ«sîrïQsþUîÇïQ«xstyststststsî¨ïP×vô5 îBïP‘yïP×vîGïO™qô#tô>uststststsîBtsxstswïOvvïO™sxuô5tsxsô>tsvô5xvî¨ïNð)îBxsô>xsxsysîïNGþUî\ïNtsxsîÑïNGþUî&ïNxsuô5îBïMˆsô>uô5sô>xsytsxtsxswsxstsxstsxuô5tuxîGïL‘qô#tutstîBxsô>tstî|ïLYþÔîPïL‘stsî¨ïKš tstsîBtîûïKbþÔîÏïKšststî¨ïJÆvô5îGïIÏqô#tô>ststsustsîBtststsustststsusuî¨ïHØvô5îBusysusyïIqïHØsô>ysuô5syïIqïHØsô>îGïGáqô#tô>ststststststvô5sô>tîBxsxsxststststsxsxststsî¨ïG vô5î-ÁïT�usô>îC usî.qïS™usîCusî.qïR¢usus îCð$î.qïQ«ð+îCð,î.qïP´usîCð'î/!ïO½usîCð%î/!ïNÆusîCð)î/ÒïMÏîCusî0‚ïLØî0‚ïKáusîCð'î/ÒïJêus usîCusus î/!ïIóustsîCð(î.qïHütîCsð'î.qïHuîCs us rsî/!ïG tsîCrsr sî/!ïF tsîCus îGïERþSÉîGïDLqô#tv sô>tststsïD’qïDLsïD’qîBïDLtststststî¨ïCxvô5 uvuvîGïB�qô#tô>sustsuî¨ïA­vô5îGï@¶qô#tvtô>ststsï@üqï@¶stîBxsyststsvô5ð$î¨ï?¿sô>tîBststî¨ï>Èsï>¥qï>Èsvô5usô>tsîBtî¾ï>�þUîï>¥qï>Èsvô5ð)sô>tî¨ï=®uô5tsô>îBxsvyuvô5uvtî¨ï<”usô>tustsutuô5zôGsï<Úqï<”sô>tîBswsystsxsxsxsysxstsxsxsîBï;�uô5xusîTï;eþUî©ï;�xsô>ysxsxsystsusîBï:¦xuô5sysysî�ï:nþUîòï:¦ô>tî¨ï9¯stusuô5sô>tststsîBx stxststststsî¨ï8¸tîBtsxststsysvô5î¨ï7äð&î¨ï6íu sô>vô5î¨ï5ösuvuvî-ÁïDLs ô>ususîC îIPî-ÁïCU usus îCîIPî-ÁïB^ us îCîIPî-ÁïAg usîCîIPî.qï@pus î-Áï?y uô5susîCô>îIPusî-Áï>‚ ususususuô5sîCô>îIPsî-Áï=‹usus î-Áï<”us usîCîIPî.qï;�usususî-Áï:<us ï:‚qï:îIPî-Áï4rususîGï3­þSÉîGï2§qô#tvtô>sîBx stsuô5sysô>uô5sô>ysusî¨ï1°vô5îBsô>usysusîGï0¹qô#tô>sï0–qï0¹sï0–qï0¹ststsï0ÿqï0¹stststsuîBstï0–qï0¹stï0–qï0¹sxststsvô5xvsô>tsvô5usîGï/Ÿqô#tô>sustsuô5sô>tsîBxstysustî¨ï.¨ustsustsustsustîBuô5tsô>yï.îqï.¨stsyï.îqï.¨stsyï.îqï.¨tsyï.îqï.¨tstî¨ï-±ustsutststsîBtsyï-÷qï-±ststsustsyï-÷qï-±stsyï-÷qï-±tstî¨ï,ºsustsuîBx stsxstsî-Áï2§îCð$î-Áï1°îCð%î-Áï0¹us ustsîC î-Áï/Âususususus îCusîGï+|qô#tô>stststsîBtstî�ï+Dþîªï+|stsysusysustî¨ï*…ustsuststsîByswsxstuststststsutsî¨ï)Žustsï)Ôqï)Žstsï)Ôqï)Žstsï)Ôqï)ŽsîBtî1ï)Vþõî&ï)Žsx sîBï(— usysusysusususîBï' tstsusysusysî¨ï&©tuststststsuîBsusyuststytstsuyusî-Áï+|ususu susususîC usuô5rsô>usî.qï*…usts tîCsususî-Áï)Žuô5sô>ustsu stsusîC ususîCï(—îGï%kqô#tô>sustsîBusîBï%3þˆîÊï%kystsustîÿï%3þôîóï%kstî¨ï$tuô5sô>tststsîBtststststî¨ï#}stststsu tsustsîBtsysustsysusysxsîBï"†ysusuô5tsô>tsysysustsysysustsîBï!�usysusuô5tststusô>tsutsîBï ˜tsystustsutstsî¨ï¡ð"ï~qï¡sï~qï¡tîBsysususysuststï~qï¡ststï~qï¡stsî¨ïªvô5uvðQî-Áï%kusô>ususîC rsî-Áï$tusuô5sô>usus îCð%î-Áï#}ususususîCrsîGïåþSÉîGïßqô#tvtô>stsï%qïßstsî ¬ï§þUî ïßî uï§þUî Êïßts ï%qïßstsî¨ïètstsï.qïètsuô5{usô>tsî¨ïñ tsïÎqïñs ïÎqô#ïñsô>tsîBtstîoï¹þ¦îïñststïÎqïñstîCï¹þ"îeïñstïÎqïñstsî¨ï×ï´qï×suô5{usô>ï´qô#ï×sô>tîBsîBïŸþUî—ï×wsysysï´qï×sysysï´qï×sxstîcïŸþîwï×sîµïŸþUî ï×ï´qï×sï´qï×stî¨ï½sïšqï½suô5{usô>ïšqô#ï½sô>tsïšqï½suô5{usô>ïšqô#ï½sô>tsîBustïšqï½sustïšqï½susustsuô5tïšqï½sô>ususuô5tïšqï½sô>tî¨ï£suô5{usô>tsustsustîBtsuô5x sô>tsxstsuô5x sô>tî¨ï¬s ï‰qï¬stsï‰qï¬ststsïòqï¬stsîBtï‰qï¬stststï‰qï¬stststsî¨ï’ tsts ïØqï’stsïØqï’ststîBtststst stststî¨ï›s ïáqï›stsîBð=tî¨ï¤stsïêqï¤stsïêqï¤stsïêqï¤sts ïêqï¤sts ïêqï¤sî¨ïÐv ô5{vðQî¨ïÙðFuvuv sïqïÙvïqô#ïÙvî-Áïßsô> ï%qïßsð!îCð"î.qïè usîCî-ÁïñususususîCð$î-Áïúus us îCð$î-Áïus ïIqïsîCî-Áï ususus îCð*î-Áïï[qïsð&îC rsr ï[qïstsî-ÁïïdqïsîCusî-Áï'îCîGï›qô#tô>su{ustsu{ustststsutsu{uîBx stsxstsxîGï¤qô#tô>ststsusu{uststsu{ustsu{uîBxstsxstsxstsxstsxstsxîGï­qô#tô>stuststststststststsîBtuststusystxstsxstsxtsystsyusystsî¨ï ¶uô5ð"tsô>tststsutsîBysysusystststsystsysysususî%Jï ~þUî%Ÿï ¶ysysusî¨ï ¿vô5îBsô>ð*xsusî+ï ‡þUî+dï ¿tîGï Èqô#tô>sð&îGï Ñqô#tô>sustsustsustsustsustsustsustsuô5 sô>tî¨ï Úsustsustsustsuô5sô>tsuô5îGïœqô#tô>stsïâqïœststsuô5îBxsô>yststsutsyststïyqïœuô5tutïyqïœsusô>tuô5xuî¨ï‚sô>tstsî ïJþUî `ï‚tsï_qï‚sï_qï‚ststsîoïJþUîÄï‚tîBsysx systï_qï‚ststï_qï‚sustsxsî¨ïhvô5 îBsô>ysxstïEqïhsî-Áïœusus ususususîCð"usî-Áï¥usïëqï¥s ususus îCus ,<TVk(’SyntaxMeaning..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................Notation: item | item=choose one; ?item=zero or one item; terminals: SMALL CAPS, underlined or punctuation other than bold ()?| (parens are terminals only in rules 19, 25, 51.1, 54, | only in 55). item s ...=zero or more items, separated by s; item s !..=one or more items, separated by s; with s=";", a trailing ";" is optional; s is one of: empty "," ";" IN ELSE OR.Abbreviated non-terminals: b=binding13; d=declaration11; e=expression19; n=name56; s=statement14; t=type36.4 Feb 83Comments: ·=obsolete; µ=efficiency hack; ¸=unsafe; ¹=machine dependent; n56 means n is defined in rule 56; n2=n (the subscript is only for the desugaring). CLRMSumm.pressExamplesNotes26 application ::= e [?argBinding ?applEn]LET m(~e, a(~[argBinding] IN ( (m(. APPLY Za( ) ?applEn )27 argBinding ::= (n ~ (e | | µTRASH )), !.. |(n ~ (e | OMITTED | TRASH) ), !.. | (e | | µTRASH ), ...(e | OMITTED | TRASH ), ...In 19, 26. ·TRASH may be written as NULL, ~ as :.27.1applEn ::= ! enChoice9; ...-- In 19, 26.BUT { enChoice; ... }fh_Files.Open[name~lb.s, mode~Files.read-- Keywords are best for multiple args.! AccessDenied=>{...}; FatalError=>{...}];-- Semicolons separate choices.(GetProcs[j].ReadProc)[k];-- The proc can be computed.file.Read[buffer~b, count~k];-- WFile.Read[file, b, k] (object notation).f[i~3, j~ , k~TRASH]; f[i~3, k~TRASH];-- j and k may be trash (see defaultTC55).f[3, , TRASH];-- Likewise, if i, j, and k are in that order.28 if ::= IF e1 THEN e2 (ELSE e3 | )IF e1 THEN e2 ELSE (e3 | NULL)29 select ::= SELECT e FROM LET selector(~e IN choice; ... endChoice choice ELSE ... endChoice The ";" is "," in an expression; also in 32 and 34.-- ELSE is a separator for repetitions of the choice.30 choice ::= ( ( | relOp22 ) e1 ), !..=>e2IF ( (selector( (= | relOp ) e1) OR ... ) THEN e231 endChoice ::= ENDCASE ( | => e3)ELSE (NULL | e3)In 29, 32, 34.i_(IF j<3 THEN 6 ELSE 8);-- An IF with results must have an ELSE.IF k NOT IN Range THEN RETURN[7];SELECT f[j] FROM-- SELECT expressions are also possible.<7=>{...};-- Wt:INT~fŸ[j]; IF t<7 THEN {...} ELSE ... IN [7..8]=>{...};-- 7, 8=> or =7, =8=>{...} is the same. NOT <=8=>{...};-- ENDCASE=>{...} is the same here.ENDCASE=>ERROR;-- Redundant: choices are exhaustive.32 safeSelect ::= WITH e SELECT FROMLET v(~e IN safeChoice; ... endChoice31 safeChoice ELSE ... endChoice33 safeChoice ::= n : t => e2IF ISTYPENOTNIL[v(, t] THEN LET n : t_NARROW[v(, t] IN e234 ·withSelect ::= WITH (n1 ~~ e1 | · e1 )OPEN v(~~e1 IN LET n(~($n1 | NIL), type(~v(,SELECT ( | ¸e11) FROM selector(~(e1.TAG | e11) IN withChoice ELSE ... endChoice withChoice; ... endChoice31-- e11 must be defaulted except for a COMPUTED variant.·The ~~ may be written as :.35 ·withChoice ::= n2 => e2 |IF selector(=n2 THEN OPEN n2, n2, !.. => e2 (BINDP[n(, LOOPHOLE[v(,type([n2]] ] | BINDP[n(, v(] ) IN e2WITH r SELECT FROM-- Assume r: REF ANY in this example.rInt: REF INT=>RETURN[Gcd[rInt^, 17]];-- rInt is declared in this choice only.rReal: REF REAL=>RETURN[Floor[Sin[rReal^]]];ENDCASE=>RETURN[IF r=NIL THEN 0 ELSE 1]-- Only the REF ANY r is known here.nr: REF Node52~...; WITH dn~~nr SELECT FROM-- See rule 52 for the variant record Node.binary=>{nr_dn.b};-- dn is a Node.binary in this choice only.unary=>{nr_dn.a};-- dn is a Node.unary in this choice only.ENDCASE=>{nr_NIL};-- dn is just a Node here.36 type ::= typeName | builtInType | typeCons37 typeName ::= n1 | typeName . n2 | ·typeName [e] | ·n2 typeName typeName.SPECIALIZE[e] | typeName . n2 In 19, 25, 36, 40.1, 49.--n2 names a variant.P: PROC[ b: Buffer1.Handle, -- A type from an interface. i: INT_TEXT[20].SIZE ];-- A bound sequence; only in SIZE, NEW.38 builtInType ::= INT | REAL | TYPE | ATOM | MONITORLOCK | CONDITION | µ ?¸UNCOUNTED ZONE | ·¸MDSZone | ·LONG CARDINAL | ·¸ ?LONG UNSPECIFIED -- See Table 4�2. TYPE only as t in a b or an interface's d. INTEGER, CARDINAL, NAT, TEXT, STRING, BOOL, CHAR are predefined.39 typeCons ::= subrange25 | paintedTC40.1 | transferTC41 | arrayTC44 | seqTC45 | ¸descriptorTC45.1 | refTC46 | listTC47 | ¸pointerTC48 | ·¸relativeTC49 | recordTC50 | unionTC52 | enumTC54 | defaultTC55TypeIndex: TYPE~[0..256);-- A subrange type.BinaryNode: TYPE~Node52.binary;-- A bound variant type.40 varTC ::= ( | READONLY | VAR ) t | ANY( VAR | READONLY | VAR ) t | ANYIn 11, 45�48. ANY only in refTC. VAR only in interface decl.40.1paintedTC ::= typeName PAINTED tREPLACEPAINT[in: t, from: typeName]typeName must be an opaque type, t recordTC or enumTC.HV: TYPE~Interface.HistValue PAINTED -- See 13 for use.RECORD[...]41 transferTC ::=?safety4 xfer ?drTypeMKXFERTYPE[drType, flavor~xfer]41.1xfer ::= PROCEDURE | PROC | PORT |PROCESS | SIGNAL | ERROR | PROGRAM42 drType ::= ?fields1 RETURNS fields2 | fields1 domain~fields1, range~fields2No domain for PROCESS. In 3, 41.43 fields ::= [d11, ... ] | [t, ... ] | ANYANY only in drType. In 42, 50, 52.Enumerate: PROC[l: RL, p: PROC[x: REF ANY] RETURNS [stop: BOOL]] RETURNS [stopped: BOOL];p2:PROCESS RETURNS[i:INT]_FORK stream.Get;failed: ERROR [reason: ROPE]~CODE;44 arrayTC ::= ?µPACKED ARRAY ?t1 OF t2MKARRAY[domain~t1, range~t2]45 seqTC ::=?µPACKED SEQUENCE tag53 OF tMKSEQUENCE[domain~tag, range~t]Legal only as last type in a recordTC or unionTC.45.1¸descriptorTC ::= ?LONG DESCRIPTOR FOR varTC40MKARRAYDESCR[arrayType~varTC]varTC must be an array type.Vec: TYPE=ARRAY [0..maxVecLen) OF REF TEXT;Chars: TYPE~RECORD [text: PACKED SEQUENCE-- A record with just a sequence in it. len: [0..LAST[INTEGER]] OF CHAR]; ch: Chars;-- ch.text[i] or ch[i] refers to an element.v: Vec~ALL[NIL];dV: DESCRIPTOR FOR ARRAY OF REF TEXT~DESCRIPTOR[v];46 refTC ::= REF ( varTC40 | )MKREF[target~( varTC | ANY )]47 listTC ::= LIST OF varTC40MKLIST[range~varTC]ROText: TYPE~REF READONLY TEXT;-- NARROW[rl.first, ROText]^ is aRL: TYPE~LIST OF REF READONLY ANY; rl:RL;-- READONLY TEXT (or error).48 ¸pointerTC::=?LONG ?ORDERED ?·BASE MKPOINTER[target~varTC] | POINTER ?·subrange25 ?(TO varTC40) |·POINTER TO FRAME [ n ]MKINSTANCETYPE[n]Subrange only in a relativeTC; no typeName37 on it.49 ·¸relativeTC ::= typeName37 RELATIVE tMKRELATIVE[range~t, baseType~typeName]t must be a pointer or descriptor type, typeName a base pointer type.UnsafeHandle: TYPE~LONG POINTER TO Vec44;50 recordTC ::=?access12 (?MONITORED RECORD fields43 |MKRECORD[ fields] |¹ MACHINE DEPENDENT RECORD (mdFields | ·fields43) )MKMDRECORD[mdFields | fields] 51 ¹mdFields ::= [( (n pos), ... : --In 50, 52. MKMDFIELDS[LIST[ ( LIST[ ([$n, pos] ), ... ] , t ), ... ] ] ?·access12 t), ...] 51.1¹pos ::= ( e1 ?(: e2 .. e3) ) -- In 51, 53.MKPOSITION[firstWord~e1, firstBit~e2, lastBit~e3]Cell: TYPE~RECORD[next: REF Cell, val: ATOM];Status: TYPE~MACHINE DEPENDENT RECORD [-- Don't omit the field positions.channel (0: 8..10): [0..nChannels),-- nChannels < 8.device (0: 0..3): DeviceNumber,-- DeviceNumber held in < 4 bits.stopCode (0: 11..15): Color, fill (0: 4..7): BOOL,-- No gaps allowed, but any ordering OK.command (1: 0..31): ChannelCommand ];-- Bit numbers >16 OK; fields can cross-- word boundaries only if word-aligned.52 unionTC ::= SELECT tag FROM MKUNION[selector~tag, variants~LIST[ (n, ...=>(fields43 | mdFields51 | ·NULL) ), ... ( [ labels~LIST[ $n, ...], value~fields ] ), ...] ]?, ENDCASE Legal only as last type in a recordTC or unionTC.53 tag ::= (n (¹pos51.1 | ) : ?·access12 | [ ( [ $n, (pos | NIL) ] | $COMPUTED( | $OVERLAID( ) , µ¸COMPUTED | µ¸OVERLAID ) (t | *) ( t | TYPEFROMLABELS ) ]In 44, 52. * only in unionTC52.Node: TYPE~MACHINE DEPENDENT RECORD [-- rands is a union or variant part.type (0: 0..15): TypeIndex, rator (1: 0..13): Op54,-- This is the common part.rands (1: 14..79): SELECT n (1: 14..15): * FROM-- Both union and tag have pos.nonary=>[],-- Type of n is {nonary, unary, binary}.unary=>[a (1: 16..47): REF Node],-- Can use same name in several variants.binary=>[a (1:16..47), b(1:48..79): REF Node] -- At least one variant must fill 1: 14..79.ENDCASE ];54 enumTC ::= { n, ... } |MKENUMERATION[ LIST[$n, ...] ] |MACHINE DEPENDENT {( (n | ) (e) | n), !.. }MKMDENUMERATION[LIST[( [($n | NIL), e] | [$n, �1] ), ... ]]Op: TYPE~{plus, minus, times, divide };Color: TYPE~MACHINE DEPENDENT {-- A Color value takes 4 bits; greenW1.red(0), green, blue(4), (15)}; c: Color;55 defaultTC ::=CHANGEDEFAULT[type~t, (t _ |proc~NIL, trashOK~FALSE] |t _ e |proc~INLINE l IN e, trashOK~FALSE] |µt _ e | TRASH |proc~INLINE l IN e, trashOK~TRUE] |µt _ TRASHproc~t.Trash, trashOK~TRUE] )defaultTC legal only as the type in a decl in a body9 or fieldŸ43 (n: t _ e), in a TYPE binding13, or in NEW. Note the terminal |.·TRASH may be written as NULL.-- Except as noted, a constructor or application must mention each name and give it a value. Q: TYPE~RECORD[-- Otherwise there's a compile-time error.i: INT,-- Q[], Q[i~ ] trash i (not in argBinding27).j: INT_,-- No defaulting or trash for j.k: INT_3,-- Q[], Q[k~ ] leave k=3.l: INT_3 | TRASH,-- As k, but Q[l~TRASH] trashes l.m: INT_TRASH ];-- Q[], Q[m~ ] trash m.56 name ::= letter (letter | digit)...-- But not one of the reserved words in Table 3�1.57 literal ::= num ?( ( D|d | B|b ) ?num ) |-- INT literal, decimal if radix omitted or D, octal if B. |digit (digit |A|B|C|D|E|F) ... ( H|h ) ?num |-- INT literal in hex; must start with digit. |?num . num ?exponent | -- REAL as a scaled decimal fraction; note no trailing dot. |num exponent |-- With an exponent, the decimal point may be omitted. |' extendedChar | · digit !.. C |-- CHAR literal; the C form specifies the code in octal. |" extendedChar ... " ?·L |[ ('extendedChar), ...] -- Rope.ROPE, TEXT, or STRING. |$ n-- ATOM literal.58 exponent ::= (E|e) ?(+ | �) num-- Optionally signed decimal exponent.59 num ::= digit !..60 extendedChar ::= space | \ extension | anyCharNot'"Or\ 61 extension ::= digit1 digit2 digit3 |-- The character with code digit1 digit2 digit3 B. | (n|N | r|R) | (t|T) | (b|B) | -- CR, '\015 | TAB, '\011 | BACKSPACE, '\010 | (f|F) | (l|L) | ' | " | \-- FORMFEED, '\014 | LINEFEED, '\012 | ' | " | \m, x1, x59y, longNameWithSeveralWords: INT;n: INT~1+12D+2B3+2000B-- = 1+12+1024+1024 +1H+0FFH;-- +1+255r1: REAL~0.1+.1+1.0E�1-- = 0.1+0.1+0.1 +1E�1;-- +0.1a1: ARRAY [0..3] OF CHAR~['x, '\N, '\', '\141];r2: ROPE~"Hello.\N...\NGoodbye\F";a2: ATOM~$NameInAnAtomLiteral;îŒïhÐpî–îÒïlqðÿðÿð\î°ïRrsô>õtstsð"uô5sô> î$ïþ†î(¡ïRtsðEî°ï8tstsð"tststsð!tstsð#tsusususî°ïrsrtsïdqïsts ïdqïsts ïdqïstsïdqïsts ïdqïstsïdqïsîO­î°ïársðAï'qïásð!ï¾qïásð.îJøî5ïïhÐpîJ½îGïgÙqô#t ô>sts tsîBxsystsyst îcïg¡þƒîæïgÙsxsî {ïg¡þUî ÐïgÙî!ïg¡þUî!cïgÙysuô5xsô>ysysî'.ïg¡þUî'ƒïgÙtî(-ïg¡þÛî+ïgÙsî+Fïg¡þUîGïfâqô#t ô>ststststsustststîBtststsxstsutuô5tsô>tstî¨ïeëstststsuststîBtstsxstsuô5tsô>tî¨ïevô5 uvuvîGïd qtô>s ïdfqïd stvô5 îBxsô>tîèïcèþÔî¼ïd stsî-ÁïgÙð(îCð'î.qïfâtsîCî-ÁïeëîCî-ÁïdôîCyrsrsrsrsrsî-Áïcý us usîCrsrsïdCqïcýsî-ÁïcusîCrsrsrsîGïbAþSÉîGïa;qô#tô>susïaqïa;susïaqïa;stusïaqïa;ststîBustïaqïa;sustïaqïa;sustïaqïa;stsutîGï`!qô#tô>sususîBxsystsxî¨ï_*s ts îBtî¶ï^òþ§î]ï_*suststîéï^òþOî 8ï_*sî¨ï^Vvô5ð1îBuvð.îGï]_qô#tô>stststsï]¥qï]_stsï]tststststï]suststsï\"qï\EtîBustuststï\"qï\Etî¨ï[Nvô5 î-Áïa;susô>ususîCususî-Áï`Dusuô5sô>ususî-Áï_MusuîCsusî.qï^V îCyrsusrsrsusrsustsustsî.qï]_usîCtsî.qï\hus îCustsî.qï[qususîCð%îGïZqô#t ô>susuô5îBxsô>ystsxî¨ïYsts ïY_qîBïYst îxïXáþ}îõïYsuststî�ïXáþOîGïX"qô#t ô>s ïWÿqîBïX"usx systsuô5sô>xststsusystsustïWÿqîGïWô#st ô>sustsïVåqïWsïVåqïWstsïVåqïWstîBxsystïVåqïWsxuô5xsô>yststïVåqïWstsutsysyuî¨ïUîststsïUËqïUîtsusîBuô5systïUËqïUîsxsô>tstïUËqïUîtsxst î`ïU¶þœî#üïUîsuststî'ˆïU¶þOî¨ïTÔsts ïUqîBïTÔvô5ïT±qïTÔvuvî¨ïSÝîGïRæqô#st ô>sïRÃqïRæsïRÃqïRæstîBusystïRÃqïRæuô5sô>xuô5î¨ïQÌsïQ©qïQÌsô>ïQ©qïQÌstsïQ©qïQÌsîBuô5txsysô>usysystïQ©qïQÌstuô5xsysô>ysuô5tsô>xstïQ©qî-ÁïZusuô5îCsô>rsuô5sô>î.qïYuô5sus ô>îCrsð!î.qïX"uô5susî.qïW+usususô>usususîC uô5sô>rsî-ÁïUÊusïVqïUÊsusuô5îCsô>ð$rî.qïTÓsîCrsrsrsî.qïSÜîCrsrsrsî.qïRåususîCrs rsîGïPäþSÉîGïOÞqô#tvsô>ts ts tsîGïNçqô#tô>sïNÄqô#ïNçtsô> ïNÄqïNçstsîBî¨ïMÍ tsïMªqïMÍs îBtsx ststststïMªqïMÍsî¨ïLÖvô5îBïL³qïLÖvî-ÁïOÞusô> ïP$qïOÞsîCî.qïNçusususîCususîGïK¼qô#t ô>sustsustsustsustsu stsustsî¨ïJÅtu ô5sô>ts tsusuststuô5 sô>vô5î¨ïIñuvð'uvuvuvuvuvîGïH³qô#tô>sïHùqïH³sts ïHùqïH³sts ïHùqïH³stsïHùqïH³stsïHùqïH³sts ïHùqïH³stsî¨ïG¼ïHqïG¼stsïHqïG¼sts ïHqïG¼sts ïHqïG¼stsïHqïG¼stsïHqïG¼stsïHqïG¼sts ïHqî-ÁïH³s us îCî-ÁïG¼ usïHqïG¼sîCîGïFÅqô#tô>ststsustsuststsuîBtsustsustsustststsuî¨ïEñvô5 uvuvîGïDúqtô>s usîBx ststsî¨ïD&vô5ð.î-ÁïDúsô>usuô5îCsô>î.qïDusîGïBÅqstsïC qïBÅstsîBx stî%ïB�þæî ïBÅstsîGïAÎqtustsustsustî¨ï@×ustuô5sô>tsustsuîGï?àqô#tô>stsï?½qï?àsusï?½qï?àstsï?½qï?àsîBtï?½qï?àstï?½qî¨ï>évô5 uv îGï=òqô#tô>sï>8qï=òststststsuî¨ï=vô5î-ÁïBÅs ô>usî/!ïAÎî/!ï@×usuô5sô>ususî.qï?àus usî-Áï>éusususus î-Áï=òus ususîGï;àqô#tô>stsusustsï;½qï;àsusï;½qîBï;àxstï;½qï;àstï;½qï;àsîGï:Æqô#tô>sususï; qï:ÆsusîBx stststsî¨ï9òvô5ð,îGï8ûqst ô>sî¨ï8tusu ô5sô>ï8JqîBï8x s tsî¨ï70vô5î-Áï;àsô>usususuô5sî-Áï:éô>ususuô5îCsô>ð%î.qï9ò ususuô5sô> îCrsrsrsrsrsî-Áï8ûususî-Áï8u ô5sî.qï7 u sîGï5Ïqô#tô>sustsï6qï5ÏststîBxstststsustsîGï4Øqô#tô>suô5sï5qîBï4Øxstsî-Áï5Ïô>usuô5îCsô>usrsruô5rsô>î-Áï4Øusuô5sô>uô5 sô>îCuô5sô>ts îGï3šqô#st uô5tusô>tsusîBxststî¨ï2£suô5tsï2éqï2£utusô>ï2éqï2£tstî¨ï1¬suô5sô>îBx stsî¨ï0Øvô5ð"ï1qï0ØvîGï/áqô#st ô>sï0'qï/ásusîBx sts tsî¨ï/ vô5ðDî-Áï3šs ô>usuô5 sï3àqï3šsîGï-Ïqô#tô>sï.qï-Ïstî¨ï,Øtususï-qï,ØstîBxststî¨ï+ásuô5 sô>uî¨ï*êstststsï+0qï*êtstîBx ststststîGï)óqô#stô>ststststsvô5sô>îBx sustsuststststststststsî¨ï(ütsï)Bqï(üststsvô5îGï(qstô>sî+ï'ÍþUî€ï(ï'âqï(stsï'âqï(sï'âqï(tsî ï'ÍþUî aï(vô5îBx s tï'âqï(sô> tï'âqï(s tï'âqï(sî-Áï-Ïususus usî-Áï,Øusuô5sô>îCð"î.qï+áð#îCrsysî.qï*êîCr sysî.qï)óð-usîCð(î.qï(üð%îCysîCï(ð*îGï&¤qô#tô>sususîBxs ts usî¨ï%­tststsï%óqï%­stsï%óqï%­stsutuô5tsô>tsîBts ustststsuô5tsô>tsî¨ï$¶tsutî¨ï#¿svô5ð,îGï"Èqô#tô>ststsï#qï"Èstststsï#qï"ÈstsîBtstststsutstsxystsxystsî¨ï!ÑustsuststststîBstststsx stsî¨ï ývô5uvï!Cqï ývî-Áï&¤sô>usuô5sô>îCrsî.qï%­ð0ï%óqï%­sîCî.qï$¶usuîCsî/!ï#¿ îC rsrsrsrsî/!ï"ÈusîCð)î/!ï!Ñuô5s ô>usîCð,î/!ï ÚusîGïœqô#tsô>tststîBx sustststî¨ï¥usuststststsîùïmþUîNï¥îÂïmþUîï¥tststsîBxsuststststsutstststststsî-Áïœusî-Áï¥usuô5 sô>îCrsrysî.qï®ð(îGï·qô#tô>îBx ststî¨ïÀstî‡sus ustî¨ïÉstî‡suô5wsô>xsts ustî¨ïÒsî–ïšþºîPïÒustî‡suô5wsô>xsts ustî¨ïÛsuî‡stsustî¨ïvô5ð+ïMqïv ïMqïvuvïMqïvuvuî¨ï3vuvuvî-Áï·sô>ð[î-ÁïÀuô5susîCô>ð(î.qïÉusîCrsrsrs rsïqïÉsî.qïÒusîCrsî.qïÛusîCrsrsrs rsî.qïäususîCrsrsrsus rsî.qïíususîCrsrsrs rsîGï(þSÉîGï"qô#tvtô>stststîBsð2îGï+qô#tô>stsî mïóþÉî 6ï+tsî tïóþ‹î ÿï+tsî ¹ïóþ¢î [ï+tsî ™ïóþ‹î $ï+tstststîBsusð5tî¨ï4ststsîtïüþ¹î-ï4tsîkïüþ¢î ï4tsîKïüþ²îýï4tsî ;ïüþÉî ï4tsî Bïüþ¢î äï4tsî "ïüþ¢î Äï4tststsî äïüþÊî®ï4tsîìïüþ‹îwï4tststîBsusð(tî¨ï=s tstsîBusð5tî¨ïFs tîBsð7tî¨ïOststsî �ïþ²î AïOtîBsusð2tî¨ïXststsî ï þ¢î ­ïXtîBststsrsususustî¨ïasîBusîGï jqô#tô>stsî!ï 2þ¢îÃï jtsîï 2þtîuï jtstststsîBð&îGï sqô#tô>stîGï |qô#t ô>sts tsîGï …qô#tô>sï bqï …sï bqï …sï bqï …stîBstï bqï …stï bqï …stï bqï …stî¨ï kstsîRï 3þ‹îÝï ktsîï 3þËîæï ktsî  ï 3þ]î ýï ktsî ;ï 3þ¹î ôï ktststsî Zï 3þNî ¨ï ktsî æï 3þ¢î ˆï ktststsîîï 3þ‹îyï ktsî·ï 3þ¢îYï ktstsîBustuô5sô>tsustsî¨ï tsîRïÒþUî§ï tsîåïÒþ¢î‡ï tststsî íïÒþEî 2ï tsî pïÒþ¢î ï tstststsîBust|ôXusô>tststsî-Áï"ð'usî-Áï+usîCî.qï4îC î-Áï=us îCî.qïFîCî-ÁïOusuô5sô>î-ÁïXus ts î-Áïausÿ+:TVk(C TimesRoman  TimesRoman TimesRoman TimesRoman TimesRoman TimesRoman TimesRomanHippo Helvetica Math  TimesRoman  TimesRoman  TimesRoman (n(&½Nÿÿj/QO“0Þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ CLRMSumm.bxLampsonFebruary 16, 1983 10:34 AM