IMPLEMENTATION MODULE M2S; (* Scanner generated by Coco/R - using the FileIO library supplied with this project. *) IMPORT FileIO, Storage; FROM Storage IMPORT ALLOCATE; (* gm2 needs this for NEW substitution *) CONST noSYMB = 82; (*error token code*) (* not only for errors but also for not finished states of scanner analysis *) eof = CHR(26) (* MS-DOS Keyboard eof char *); EOF = CHR(0); EOL = CHR(13); CR = CHR(13); LF = CHR(10); Long0 = 0; Long1 = 1; BlkSize = 16384; TYPE BufBlock = ARRAY [0 .. BlkSize-1] OF CHAR; Buffer = ARRAY [0 .. 31] OF POINTER TO BufBlock; StartTable = ARRAY [0 .. 255] OF INTEGER; GetCH = PROCEDURE (INT32): CHAR; VAR lastCh, ch: CHAR; (*current input character*) curLine: INTEGER; (*current input line (may be higher than line)*) lineStart: INT32; (*start position of current line*) apx: INT32; (*length of appendix (CONTEXT phrase)*) oldEols: INTEGER; (*number of EOLs in a comment*) bp, bp0: INT32; (*current position in buf (bp0: position of current token)*) inputLen: INT32; (*source file size*) buf: Buffer; (*source buffer for low-level access*) start: StartTable; (*start state for every character*) CurrentCh: GetCH; (* ---- TopSpeed conditional compilation ---- *) condStk: ARRAY [0 .. 31] OF BOOLEAN; nCond: CARDINAL; defs: ARRAY [0 .. 31] OF ARRAY [0 .. 31] OF CHAR; nDefs: CARDINAL; defsInit: BOOLEAN; PROCEDURE Err (nr, line, col: INTEGER; pos: INT32); BEGIN INC(errors) END Err; PROCEDURE NextCh; (* Return global variable ch *) BEGIN lastCh := ch; INC(bp); ch := CurrentCh(bp); IF (ch = EOL) OR (ch = LF) AND (lastCh # EOL) THEN INC(curLine); lineStart := bp END END NextCh; PROCEDURE Comment (): BOOLEAN; VAR level, startLine: INTEGER; oldLineStart: INT32; BEGIN level := 1; startLine := curLine; oldLineStart := lineStart; IF (ch = "/") THEN NextCh; IF (ch = "/") THEN NextCh; LOOP IF (ch = CHR(10)) THEN DEC(level); oldEols := curLine - startLine; NextCh; IF level = 0 THEN RETURN TRUE END; ELSIF ch = EOF THEN RETURN FALSE ELSE NextCh END; END; (* LOOP *) ELSE IF (ch = CR) OR (ch = LF) THEN DEC(curLine); lineStart := oldLineStart END; DEC(bp); ch := lastCh; END; END; IF (ch = "(") THEN NextCh; IF (ch = "*") THEN NextCh; LOOP IF (ch = "*") THEN NextCh; IF (ch = ")") THEN DEC(level); NextCh; IF level = 0 THEN RETURN TRUE END END; ELSIF (ch = "(") THEN NextCh; IF (ch = "*") THEN INC(level); NextCh END; ELSIF ch = EOF THEN RETURN FALSE ELSE NextCh END; END; (* LOOP *) ELSE IF (ch = CR) OR (ch = LF) THEN DEC(curLine); lineStart := oldLineStart END; DEC(bp); ch := lastCh; END; END; RETURN FALSE; END Comment; (* ---- TopSpeed conditional compilation: (*%T cond*) / (*%F cond*) / (*%E*) ---- Blank the inactive regions of the source buffer (CR/LF kept, so line numbers survive) before scanning. Conditions are evaluated against a small define set (see InitDefs); an unknown symbol is 'undefined'. *) PROCEDURE CopyStr (s: ARRAY OF CHAR; VAR t: ARRAY OF CHAR); VAR i: CARDINAL; BEGIN i := 0; WHILE (i <= HIGH(t)) AND (i <= HIGH(s)) AND (s[i] # CHR(0)) DO t[i] := s[i]; INC(i) END; IF i <= HIGH(t) THEN t[i] := CHR(0) END END CopyStr; PROCEDURE Same (a, b: ARRAY OF CHAR): BOOLEAN; VAR i: CARDINAL; BEGIN i := 0; WHILE (a[i] # CHR(0)) AND (b[i] # CHR(0)) AND (a[i] = b[i]) DO INC(i) END; RETURN a[i] = b[i] END Same; PROCEDURE AddDef (s: ARRAY OF CHAR); BEGIN IF nDefs <= HIGH(defs) THEN CopyStr(s, defs[nDefs]); INC(nDefs) END END AddDef; PROCEDURE InitDefs; (* Define set used to select conditional branches. Tuned for the TS-V3 corpus: the "_fdata"/"_mthread" variants are the plain, parseable ones; "_OS2"/"_fcall"/... are left undefined so the non-OS2 branches are taken. *) BEGIN nDefs := 0; (* DEFINES:BEGIN *) AddDef("_fdata"); AddDef("_mthread"); AddDef("_fptr"); AddDef("_fcall"); (* DEFINES:END *) END InitDefs; PROCEDURE IsDefined (id: ARRAY OF CHAR): BOOLEAN; VAR k: CARDINAL; BEGIN k := 0; WHILE k < nDefs DO IF Same(id, defs[k]) THEN RETURN TRUE END; INC(k) END; RETURN FALSE END IsDefined; PROCEDURE CondIdent (c: CHAR): BOOLEAN; BEGIN RETURN ((c >= "A") AND (c <= "Z")) OR ((c >= "a") AND (c <= "z")) OR ((c >= "0") AND (c <= "9")) OR (c = "_") END CondIdent; PROCEDURE CondBlank (p: INT32); VAR c: CHAR; BEGIN IF (p < 0) OR (p >= inputLen) THEN RETURN END; c := buf[ORD(p DIV BlkSize)]^[ORD(p MOD BlkSize)]; IF (c # CR) AND (c # LF) THEN buf[ORD(p DIV BlkSize)]^[ORD(p MOD BlkSize)] := " " END END CondBlank; PROCEDURE CondFilter; VAR p, q, j, b: INT32; c, letter: CHAR; id: ARRAY [0 .. 31] OF CHAR; k: CARDINAL; parentOk, cond, active: BOOLEAN; BEGIN IF NOT defsInit THEN InitDefs; defsInit := TRUE END; nCond := 0; p := 0; WHILE p < inputLen DO c := buf[ORD(p DIV BlkSize)]^[ORD(p MOD BlkSize)]; IF (c = "(") AND (p + 3 < inputLen) AND (buf[ORD((p+1) DIV BlkSize)]^[ORD((p+1) MOD BlkSize)] = "*") AND (buf[ORD((p+2) DIV BlkSize)]^[ORD((p+2) MOD BlkSize)] = "%") THEN letter := buf[ORD((p+3) DIV BlkSize)]^[ORD((p+3) MOD BlkSize)]; q := p + 4; WHILE (q + 1 < inputLen) AND NOT ((buf[ORD(q DIV BlkSize)]^[ORD(q MOD BlkSize)] = "*") AND (buf[ORD((q+1) DIV BlkSize)]^[ORD((q+1) MOD BlkSize)] = ")")) DO INC(q) END; IF letter = "E" THEN IF nCond > 0 THEN DEC(nCond) END ELSE j := p + 4; k := 0; WHILE (j < q) AND (k <= HIGH(id)) DO c := buf[ORD(j DIV BlkSize)]^[ORD(j MOD BlkSize)]; IF CondIdent(c) THEN id[k] := c; INC(k) ELSIF k > 0 THEN j := q (* end of the name *) END; INC(j) END; id[k] := CHR(0); cond := IsDefined(id); IF letter = "F" THEN cond := NOT cond END; parentOk := (nCond = 0) OR condStk[nCond - 1]; IF NOT parentOk THEN cond := FALSE END; IF nCond <= HIGH(condStk) THEN condStk[nCond] := cond; INC(nCond) END END; b := p; WHILE b <= q + 1 DO CondBlank(b); INC(b) END; p := q + 2 ELSE active := (nCond = 0) OR condStk[nCond - 1]; IF active THEN INC(p) ELSE CondBlank(p); INC(p) END END END END CondFilter; PROCEDURE Get (VAR sym: CARDINAL); VAR state: CARDINAL; PROCEDURE Equal (s: ARRAY OF CHAR): BOOLEAN; VAR i: CARDINAL; q: INT32; BEGIN IF nextLen # LENGTH(s) THEN RETURN FALSE END; i := 1; q := bp0; INC(q); WHILE i < nextLen DO IF CurrentCh(q) # s[i] THEN RETURN FALSE END; INC(i); INC(q) END; RETURN TRUE END Equal; PROCEDURE CheckLiteral; BEGIN CASE CurrentCh(bp0) OF "A": IF Equal("AND") THEN sym := 74; ELSIF Equal("ARRAY") THEN sym := 28; END | "B": IF Equal("BEGIN") THEN sym := 11; ELSIF Equal("BY") THEN sym := 56; END | "C": IF Equal("CASE") THEN sym := 31; ELSIF Equal("CLASS") THEN sym := 39; ELSIF Equal("CONST") THEN sym := 41; END | "D": IF Equal("DEFINITION") THEN sym := 6; ELSIF Equal("DIV") THEN sym := 72; ELSIF Equal("DO") THEN sym := 51; END | "E": IF Equal("ELSE") THEN sym := 34; ELSIF Equal("ELSIF") THEN sym := 49; ELSIF Equal("END") THEN sym := 9; ELSIF Equal("EXIT") THEN sym := 45; ELSIF Equal("EXPORT") THEN sym := 17; END | "F": IF Equal("FOR") THEN sym := 55; ELSIF Equal("FORWARD") THEN sym := 40; ELSIF Equal("FROM") THEN sym := 19; END | "G": IF Equal("GOTO") THEN sym := 44; END | "I": IF Equal("IF") THEN sym := 47; ELSIF Equal("IMPLEMENTATION") THEN sym := 10; ELSIF Equal("IMPORT") THEN sym := 20; ELSIF Equal("IN") THEN sym := 43; ELSIF Equal("INLINE") THEN sym := 12; ELSIF Equal("IS") THEN sym := 60; END | "L": IF Equal("LABEL") THEN sym := 13; ELSIF Equal("LOOP") THEN sym := 54; END | "M": IF Equal("MOD") THEN sym := 73; ELSIF Equal("MODULE") THEN sym := 7; END | "N": IF Equal("NOT") THEN sym := 80; END | "O": IF Equal("OF") THEN sym := 29; ELSIF Equal("OR") THEN sym := 69; END | "P": IF Equal("POINTER") THEN sym := 24; ELSIF Equal("PROCEDURE") THEN sym := 37; END | "Q": IF Equal("QUALIFIED") THEN sym := 18; END | "R": IF Equal("RECORD") THEN sym := 30; ELSIF Equal("REPEAT") THEN sym := 52; ELSIF Equal("RETURN") THEN sym := 57; END | "S": IF Equal("SET") THEN sym := 35; END | "T": IF Equal("THEN") THEN sym := 48; ELSIF Equal("TO") THEN sym := 36; ELSIF Equal("TYPE") THEN sym := 21; END | "U": IF Equal("UNTIL") THEN sym := 53; END | "V": IF Equal("VAR") THEN sym := 38; ELSIF Equal("VIRTUAL") THEN sym := 23; END | "W": IF Equal("WHILE") THEN sym := 50; ELSIF Equal("WITH") THEN sym := 58; END ELSE END END CheckLiteral; BEGIN (*Get*) WHILE (ch = ' ') OR ((ch >= CHR(9)) & (ch <= CHR(13))) DO NextCh END; IF ((ch = "/") OR (ch = "(")) & Comment() THEN Get(sym); RETURN END; pos := nextPos; nextPos := bp; col := nextCol; nextCol := VAL(INTEGER, bp - lineStart); line := nextLine; nextLine := curLine; len := nextLen; nextLen := 0; apx := 0; state := start[ORD(ch)]; bp0 := bp; LOOP NextCh; INC(nextLen); CASE state OF 1: IF ((ch >= "0") & (ch <= "9") OR (ch >= "@") & (ch <= "Z") OR (ch = "_") OR (ch >= "a") & (ch <= "z")) THEN ELSE sym := 1; CheckLiteral; RETURN END; | 2: IF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "F") OR (ch >= "a") & (ch <= "f")) THEN state := 3; ELSE sym := noSYMB; RETURN END; | 3: IF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "F") OR (ch >= "a") & (ch <= "f")) THEN ELSE sym := 2; RETURN END; | 4: IF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "F") OR (ch >= "a") & (ch <= "f")) THEN state := 5; ELSE sym := noSYMB; RETURN END; | 5: IF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "F") OR (ch >= "a") & (ch <= "f")) THEN ELSE sym := 2; RETURN END; | 6: bp := bp - apx - Long1; DEC(nextLen, ORDL(apx)); NextCh; sym := 2; RETURN | 7: sym := 2; RETURN | 8: IF ((ch >= "0") & (ch <= "9")) THEN ELSIF ((ch = "E") OR (ch = "e")) THEN state := 9; ELSE sym := 3; RETURN END; | 9: IF ((ch >= "0") & (ch <= "9")) THEN state := 11; ELSIF ((ch = "+") OR (ch = "-")) THEN state := 10; ELSE sym := noSYMB; RETURN END; | 10: IF ((ch >= "0") & (ch <= "9")) THEN state := 11; ELSE sym := noSYMB; RETURN END; | 11: IF ((ch >= "0") & (ch <= "9")) THEN ELSE sym := 3; RETURN END; | 12: IF ((ch <= CHR(12)) OR (ch >= CHR(14)) & (ch <= "&") OR (ch >= "(")) THEN ELSIF (ch = "'") THEN state := 14; ELSE sym := noSYMB; RETURN END; | 13: IF ((ch <= CHR(12)) OR (ch >= CHR(14)) & (ch <= "!") OR (ch >= "#")) THEN ELSIF (ch = '"') THEN state := 14; ELSE sym := noSYMB; RETURN END; | 14: sym := 4; RETURN | 15: IF ((ch >= "0") & (ch <= "9")) THEN ELSIF (ch = "c") THEN state := 17; ELSIF ((ch = "A") OR (ch >= "D") & (ch <= "F") OR (ch = "a") OR (ch >= "d") & (ch <= "f")) THEN state := 18; ELSIF (ch = ".") THEN state := 19; INC(apx) ELSIF (ch = "B") THEN state := 20; ELSIF (ch = "b") THEN state := 21; ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN state := 22; ELSE sym := 2; RETURN END; | 16: IF ((ch >= "0") & (ch <= "9")) THEN state := 15; ELSIF (ch = "c") THEN state := 17; ELSIF ((ch = "A") OR (ch >= "D") & (ch <= "F") OR (ch = "a") OR (ch >= "d") & (ch <= "f")) THEN state := 18; ELSIF (ch = ".") THEN state := 19; INC(apx) ELSIF (ch = "B") THEN state := 20; ELSIF (ch = "b") THEN state := 21; ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN state := 22; ELSIF (ch = "x") THEN state := 2; ELSIF (ch = "X") THEN state := 4; ELSE sym := 2; RETURN END; | 17: IF (ch = "c") THEN ELSIF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "B") OR (ch >= "D") & (ch <= "F") OR (ch >= "a") & (ch <= "b") OR (ch >= "d") & (ch <= "f")) THEN state := 18; ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN state := 22; ELSE sym := 2; RETURN END; | 18: IF (ch = "c") THEN state := 17; ELSIF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "B") OR (ch >= "D") & (ch <= "F") OR (ch >= "a") & (ch <= "b") OR (ch >= "d") & (ch <= "f")) THEN ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN state := 22; ELSE sym := noSYMB; RETURN END; | 19: IF ((ch >= "0") & (ch <= "9")) THEN state := 8; apx := Long0 ELSIF (ch = ".") THEN state := 6; INC(apx) ELSIF ((ch = "E") OR (ch = "e")) THEN state := 9; apx := Long0 ELSE sym := 3; RETURN END; | 20: IF (ch = "c") THEN state := 17; ELSIF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "B") OR (ch >= "D") & (ch <= "F") OR (ch >= "a") & (ch <= "b") OR (ch >= "d") & (ch <= "f")) THEN state := 18; ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN state := 22; ELSE sym := 2; RETURN END; | 21: IF (ch = "c") THEN state := 17; ELSIF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "B") OR (ch >= "D") & (ch <= "F") OR (ch >= "a") & (ch <= "b") OR (ch >= "d") & (ch <= "f")) THEN state := 18; ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN state := 22; ELSE sym := 2; RETURN END; | 22: IF (ch = "c") THEN state := 17; ELSIF ((ch >= "0") & (ch <= "9") OR (ch >= "A") & (ch <= "B") OR (ch >= "D") & (ch <= "F") OR (ch >= "a") & (ch <= "b") OR (ch >= "d") & (ch <= "f")) THEN state := 18; ELSIF ((ch = "H") OR (ch = "h")) THEN state := 7; ELSIF (ch = "C") THEN ELSE sym := 2; RETURN END; | 23: IF (ch = ".") THEN state := 29; ELSE sym := 5; RETURN END; | 24: sym := 8; RETURN | 25: sym := 14; RETURN | 26: sym := 15; RETURN | 27: sym := 16; RETURN | 28: sym := 22; RETURN | 29: sym := 25; RETURN | 30: sym := 26; RETURN | 31: sym := 27; RETURN | 32: IF (ch = ":") THEN state := 34; ELSIF (ch = "=") THEN state := 36; ELSE sym := 32; RETURN END; | 33: sym := 33; RETURN | 34: IF (ch = "=") THEN state := 35; ELSE sym := noSYMB; RETURN END; | 35: sym := 42; RETURN | 36: sym := 46; RETURN | 37: sym := 59; RETURN | 38: sym := 61; RETURN | 39: IF (ch = ">") THEN state := 40; ELSIF (ch = "=") THEN state := 41; ELSIF (ch = "<") THEN state := 49; ELSE sym := 63; RETURN END; | 40: sym := 62; RETURN | 41: sym := 64; RETURN | 42: IF (ch = "=") THEN state := 43; ELSIF (ch = ">") THEN state := 50; ELSE sym := 65; RETURN END; | 43: sym := 66; RETURN | 44: sym := 67; RETURN | 45: sym := 68; RETURN | 46: sym := 70; RETURN | 47: sym := 71; RETURN | 48: sym := 75; RETURN | 49: sym := 76; RETURN | 50: sym := 77; RETURN | 51: sym := 78; RETURN | 52: sym := 79; RETURN | 53: sym := 81; RETURN | 54: sym := 0; ch := 0C; DEC(bp); RETURN ELSE sym := noSYMB; RETURN (*NextCh already done*) END END END Get; PROCEDURE GetString (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR); VAR i: CARDINAL; p: INT32; BEGIN IF len > HIGH(s) THEN len := HIGH(s) END; p := pos; i := 0; WHILE i < len DO s[i] := CharAt(p); INC(i); INC(p) END; s[len] := CHR(0); END GetString; PROCEDURE GetName (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR); VAR i: CARDINAL; p: INT32; BEGIN IF len > HIGH(s) THEN len := HIGH(s) END; p := pos; i := 0; WHILE i < len DO s[i] := CurrentCh(p); INC(i); INC(p) END; s[len] := CHR(0); END GetName; PROCEDURE CharAt (pos: INT32): CHAR; VAR ch: CHAR; BEGIN IF pos >= inputLen THEN RETURN EOF END; ch := buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)]; IF ch # eof THEN RETURN ch ELSE RETURN EOF END END CharAt; PROCEDURE CapChAt (pos: INT32): CHAR; VAR ch: CHAR; BEGIN IF pos >= inputLen THEN RETURN EOF END; ch := CAP(buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)]); IF ch # eof THEN RETURN ch ELSE RETURN EOF END END CapChAt; PROCEDURE Reset; VAR i, read: CARDINAL; BEGIN (*assert: src has been opened*) i := 0; inputLen := 0; REPEAT NEW(buf[i]); (* typed alloc: sets the block descriptor's count *) read := BlkSize; FileIO.ReadBytes(src, buf[i]^, read); INC(i); INC(inputLen, VAL(INT32, read)) UNTIL read # BlkSize; buf[i-1]^[read] := EOF; CondFilter; curLine := 1; lineStart := -2; bp := -1; oldEols := 0; apx := 0; errors := 0; NextCh; END Reset; BEGIN CurrentCh := CharAt; start[ 0] := 54; start[ 1] := 55; start[ 2] := 55; start[ 3] := 55; start[ 4] := 55; start[ 5] := 55; start[ 6] := 55; start[ 7] := 55; start[ 8] := 55; start[ 9] := 55; start[ 10] := 55; start[ 11] := 55; start[ 12] := 55; start[ 13] := 55; start[ 14] := 55; start[ 15] := 55; start[ 16] := 55; start[ 17] := 55; start[ 18] := 55; start[ 19] := 55; start[ 20] := 55; start[ 21] := 55; start[ 22] := 55; start[ 23] := 55; start[ 24] := 55; start[ 25] := 55; start[ 26] := 55; start[ 27] := 55; start[ 28] := 55; start[ 29] := 55; start[ 30] := 55; start[ 31] := 55; start[ 32] := 55; start[ 33] := 55; start[ 34] := 13; start[ 35] := 38; start[ 36] := 55; start[ 37] := 55; start[ 38] := 48; start[ 39] := 12; start[ 40] := 30; start[ 41] := 31; start[ 42] := 46; start[ 43] := 44; start[ 44] := 25; start[ 45] := 45; start[ 46] := 23; start[ 47] := 47; start[ 48] := 16; start[ 49] := 15; start[ 50] := 15; start[ 51] := 15; start[ 52] := 15; start[ 53] := 15; start[ 54] := 15; start[ 55] := 15; start[ 56] := 15; start[ 57] := 15; start[ 58] := 32; start[ 59] := 24; start[ 60] := 39; start[ 61] := 28; start[ 62] := 42; start[ 63] := 55; start[ 64] := 55; start[ 65] := 1; start[ 66] := 1; start[ 67] := 1; start[ 68] := 1; start[ 69] := 1; start[ 70] := 1; start[ 71] := 1; start[ 72] := 1; start[ 73] := 1; start[ 74] := 1; start[ 75] := 1; start[ 76] := 1; start[ 77] := 1; start[ 78] := 1; start[ 79] := 1; start[ 80] := 1; start[ 81] := 1; start[ 82] := 1; start[ 83] := 1; start[ 84] := 1; start[ 85] := 1; start[ 86] := 1; start[ 87] := 1; start[ 88] := 1; start[ 89] := 1; start[ 90] := 1; start[ 91] := 26; start[ 92] := 55; start[ 93] := 27; start[ 94] := 37; start[ 95] := 1; start[ 96] := 55; start[ 97] := 1; start[ 98] := 1; start[ 99] := 1; start[100] := 1; start[101] := 1; start[102] := 1; start[103] := 1; start[104] := 1; start[105] := 1; start[106] := 1; start[107] := 1; start[108] := 1; start[109] := 1; start[110] := 1; start[111] := 1; start[112] := 1; start[113] := 1; start[114] := 1; start[115] := 1; start[116] := 1; start[117] := 1; start[118] := 1; start[119] := 1; start[120] := 1; start[121] := 1; start[122] := 1; start[123] := 51; start[124] := 33; start[125] := 52; start[126] := 53; start[127] := 55; start[128] := 55; start[129] := 55; start[130] := 55; start[131] := 55; start[132] := 55; start[133] := 55; start[134] := 55; start[135] := 55; start[136] := 55; start[137] := 55; start[138] := 55; start[139] := 55; start[140] := 55; start[141] := 55; start[142] := 55; start[143] := 55; start[144] := 55; start[145] := 55; start[146] := 55; start[147] := 55; start[148] := 55; start[149] := 55; start[150] := 55; start[151] := 55; start[152] := 55; start[153] := 55; start[154] := 55; start[155] := 55; start[156] := 55; start[157] := 55; start[158] := 55; start[159] := 55; start[160] := 55; start[161] := 55; start[162] := 55; start[163] := 55; start[164] := 55; start[165] := 55; start[166] := 55; start[167] := 55; start[168] := 55; start[169] := 55; start[170] := 55; start[171] := 55; start[172] := 55; start[173] := 55; start[174] := 55; start[175] := 55; start[176] := 55; start[177] := 55; start[178] := 55; start[179] := 55; start[180] := 55; start[181] := 55; start[182] := 55; start[183] := 55; start[184] := 55; start[185] := 55; start[186] := 55; start[187] := 55; start[188] := 55; start[189] := 55; start[190] := 55; start[191] := 55; start[192] := 55; start[193] := 55; start[194] := 55; start[195] := 55; start[196] := 55; start[197] := 55; start[198] := 55; start[199] := 55; start[200] := 55; start[201] := 55; start[202] := 55; start[203] := 55; start[204] := 55; start[205] := 55; start[206] := 55; start[207] := 55; start[208] := 55; start[209] := 55; start[210] := 55; start[211] := 55; start[212] := 55; start[213] := 55; start[214] := 55; start[215] := 55; start[216] := 55; start[217] := 55; start[218] := 55; start[219] := 55; start[220] := 55; start[221] := 55; start[222] := 55; start[223] := 55; start[224] := 55; start[225] := 55; start[226] := 55; start[227] := 55; start[228] := 55; start[229] := 55; start[230] := 55; start[231] := 55; start[232] := 55; start[233] := 55; start[234] := 55; start[235] := 55; start[236] := 55; start[237] := 55; start[238] := 55; start[239] := 55; start[240] := 55; start[241] := 55; start[242] := 55; start[243] := 55; start[244] := 55; start[245] := 55; start[246] := 55; start[247] := 55; start[248] := 55; start[249] := 55; start[250] := 55; start[251] := 55; start[252] := 55; start[253] := 55; start[254] := 55; start[255] := 55; Error := Err; lastCh := EOF; END M2S.