btype we just created into array table entry ; lhld cnstptr m$de ; store range ptr into array inx h shld cnstptr lhld indxtyp xchg call chk$typ ; check type of index jz inco4 ; call perror db 21 ; ; index processed. see whats coming up next ; inco4: lxi h,ncnsts inr m lda token cpi 73 ; comma? jnz inco6 ; no, end processing ; call insymbol ; skip comma for next index lda ncnsts cpi 5 ; have we processed 5 indeces yet? jz inco5 lhld indxptr inx h inx h shld indxptr mov a,m inx h ora m jnz inco2 ; inco5: call perror db 23 mvi a,0ffh sta iieflg jmp inco1 ; ; comma was not next token, better be right paren ; inco6: lhld indxptr inx h inx h mov a,m inx h ora m jz inco7 call perror db 20 ; inco7: lda token cpi 70 ; right parenthesis? jz inco8 call perror db 8 ; inco8: lhld chost call gen$ary$vec ; grant him an array vector call insymbol ; return token after ")" lhld chost xchg ret ; ******************************************************************* * discrete_range ::= discrete_subtype_indication | range * ******************************************************************* ; ; discrete_range processes the above syntax and returns with two numbers ; on the run-time stack corresponding to the type_mark or range given. ; discrete$range: lxi h,-1 shld first ; set first and last to unknown shld last lxi h,0 shld exptype ; reset expression type lda token cpi 93 ; identifier? jnz raynge ; no, must be range ; call lookup ; try to find it jc raynge ; he deserves what he gets out of this ; ; we have found the first identifier, check what it is ; bump class mov a,m ; get class cpi type ; type? (indicating type_mark) jnz raynge ; no, must be range ; ; process type_mark [range_constraint] ; bump -class push h ; save pointer to type_mark shld exptype ; save as expression type just in case call insymbol pop h ; recover pointer to