// LEX1 GET "SYNHDR" LET NEXTSYMB() BE $(1 NLPENDING := FALSE NEXT: IF PPTRACE DO WRCH(CH) SWITCHON CH INTO $( CASE '*P': CASE '*N': LINECOUNT := LINECOUNT + 1 NLPENDING := TRUE // IGNORABLE CHARACTERS CASE '*T': CASE '*S': RCH() REPEATWHILE CH='*S' GOTO NEXT CASE '0':CASE '1':CASE '2':CASE '3':CASE '4': CASE '5':CASE '6':CASE '7':CASE '8':CASE '9': SYMB := S.NUMBER READNUMBER(10) RETURN CASE 'A':CASE 'B':CASE 'C':CASE 'D':CASE 'E': CASE 'F':CASE 'G':CASE 'H':CASE 'I':CASE 'J': CASE 'K':CASE 'L':CASE 'M':CASE 'N':CASE 'O': CASE 'P':CASE 'Q':CASE 'R':CASE 'S':CASE 'T': CASE 'U':CASE 'V':CASE 'W':CASE 'X':CASE 'Y': CASE 'Z': CASE 'a':CASE 'b':CASE 'c':CASE 'd':CASE 'e':CASE 'f': CASE 'g':CASE 'h':CASE 'i':CASE 'j':CASE 'k':CASE 'l': CASE 'm':CASE 'n':CASE 'o':CASE 'p':CASE 'q':CASE 'r': CASE 's':CASE 't':CASE 'u':CASE 'v':CASE 'w':CASE 'x': CASE 'y':CASE 'z': RDTAG(CH) SYMB := LOOKUPWORD() IF SYMB=S.GET DO $( PERFORMGET(); GOTO NEXT $) RETURN CASE '$': RCH() UNLESS CH='(' LOGOR CH=')' DO CAEREPORT(91) SYMB := CH='(' -> S.LSECT, S.RSECT RDTAG('$') LOOKUPWORD() RETURN CASE '[': CASE '(': SYMB := S.LPAREN; GOTO L CASE ']': CASE ')': SYMB := S.RPAREN; GOTO L CASE '#': SYMB := S.NUMBER RCH() IF '0'<=CH<='7' DO $( READNUMBER(8); RETURN $) CH := UPPER(CH) // $$$$$ IF CH='B' DO $( RCH(); READNUMBER(2); RETURN $) IF CH='O' DO $( RCH(); READNUMBER(8); RETURN $) IF CH='X' DO $( RCH(); READNUMBER(16); RETURN $) CAEREPORT(33) CASE '?': SYMB := S.QUERY; GOTO L CASE '+': SYMB := S.PLUS; GOTO L CASE ',': SYMB := S.COMMA; GOTO L CASE ';': SYMB := S.SEMICOLON; GOTO L CASE '@': SYMB := S.LV; GOTO L CASE '&': SYMB := S.LOGAND; GOTO L CASE '=': SYMB := S.EQ; GOTO L CASE '!': SYMB := S.VECAP; GOTO L CASE '%': SYMB := S.BYTEAP; GOTO L CASE '**': SYMB := S.MULT; GOTO L CASE '/': RCH() IF CH='\' DO $( SYMB := S.LOGAND; GOTO L $) IF CH='/' GOTO COMMENT UNLESS CH='**' DO $( SYMB := S.DIV; RETURN $) RCH() UNTIL CH=ENDSTREAMCH DO TEST CH='**' THEN $( RCH() UNLESS CH='/' LOOP RCH() GOTO NEXT $) OR $( IF CH='*N' DO LINECOUNT := LINECOUNT+1 RCH() $) CAEREPORT(63) COMMENT: RCH() REPEATUNTIL CH='*N' LOGOR CH='*P' LOGOR CH=ENDSTREAMCH GOTO NEXT CASE '|': RCH() IF CH='|' GOTO COMMENT SYMB := S.LOGOR RETURN CASE '~': RCH() IF CH='=' DO $( SYMB := S.NE; GOTO L $) SYMB := S.NOT RETURN CASE '\': RCH() IF CH='/' DO $( SYMB := S.LOGOR; GOTO L $) IF CH='=' DO $( SYMB := S.NE; GOTO L $) SYMB := S.NOT RETURN CASE '<': RCH() IF CH='=' DO $( SYMB := S.LE; GOTO L $) IF CH='<' DO $( SYMB := S.LSHIFT; GOTO L $) SYMB := S.LS RETURN CASE '>': RCH() IF CH='=' DO $( SYMB := S.GE; GOTO L $) IF CH='>' DO $( SYMB := S.RSHIFT; GOTO L $) SYMB := S.GR RETURN CASE '-': RCH() IF CH='>' DO $( SYMB := S.COND; GOTO L $) SYMB := S.MINUS RETURN CASE ':': RCH() IF CH='=' DO $( SYMB := S.ASS; GOTO L $) SYMB := S.COLON RETURN CASE '*'':CASE '*"': $(1 LET QUOTE = CH CHARP := 0 $( RCH() IF CH=QUOTE LOGOR CHARP=255 DO $( UNLESS CH=QUOTE DO CAEREPORT(95) IF CHARP=1 & CH='*'' DO $( SYMB := S.NUMBER GOTO L $) CHARV!0 := CHARP WORDSIZE := PACKSTRING(CHARV, WORDV) SYMB := S.STRING GOTO L $) IF CH='*N' DO LINECOUNT := LINECOUNT + 1 IF CH='**' DO $( RCH() IF CH='*N' DO $( LINECOUNT := LINECOUNT+1 RCH() REPEATWHILE CH='*S' LOGOR CH='*T' UNLESS CH='**' DO CAEREPORT(34) LOOP $) CH := UPPER(CH) // $$$$$ IF CH='T' DO CH := '*T' IF CH='S' DO CH := '*S' IF CH='N' DO CH := '*N' IF CH='E' DO CH := #X27 // ABOVE GOES TO #X1B IN ASCII (ESC) IF CH='B' DO CH := '*B' IF CH='C' DO CH := '*C' IF CH='P' DO CH := '*P' IF CH='X' LOGOR '0'<=CH<='9' THEN $( LET K, R, N = ?, 8, 3 IF CH='X' DO $( R, N := 16, 2 RCH() $) K := VALOCTALORHEX(R) FOR I = 2 TO N DO $( RCH() K := K*R + VALOCTALORHEX(R) $) IF K>255 DO CAEREPORT(33) CH := K GOTO NOTRAN // DO NOT TRANSLATE // to get untranslated characters use // *Xnn for hex or *nnn for octal $) $) DOTRAN: CH := CHARCODE(CH) NOTRAN: DECVAL, CHARP := CH, CHARP+1 CHARV!CHARP := CH $) REPEAT $)1 DEFAULT: IF CH=ENDSTREAMCH DO CASE '.': $( IF GETP=0 DO $( SYMB := S.END RETURN $) ENDREAD() GETP := GETP - 3 SOURCESTREAM := GETV!GETP SELECTINPUT(SOURCESTREAM) LINECOUNT := GETV!(GETP+1) CH := GETV!(GETP+2) GOTO NEXT $) CH := '*S' CAEREPORT(94) RCH() GOTO NEXT L: RCH() $)1 AND READNUMBER(RADIX) BE $( LET D = VALUE(CH) DECVAL := D IF D>=RADIX DO CAEREPORT(33) $( RCH() D := VALUE(CH) IF D>=RADIX RETURN DECVAL := RADIX*DECVAL + D $) REPEAT $) AND VALOCTALORHEX(RADIX) = VALOF $( LET VALCH = VALUE(CH) IF VALCH>=RADIX THEN CAEREPORT(33) RESULTIS VALCH $) AND VALUE(CH) = '0'<=CH<='9' -> CH-'0', 'A'<=CH<='F' -> CH-'A'+10, 100 .