|
|
1.1 ! root 1: program pretty(input,output); ! 2: const SYMLENGTH = 15; ! 3: type ! 4: kinds = (ident, number, op, endfile); ! 5: symb = array[1..SYMLENGTH] of char; ! 6: scanres = record ! 7: symbol:symb; ! 8: kind:kinds; ! 9: end; ! 10: var ! 11: i,j,k:integer; ! 12: ch: char; ! 13: tabs: integer; ! 14: a: scanres; ! 15: working, space, indentflag: boolean; ! 16: procflag, inparam, caseflag: boolean; ! 17: ! 18: procedure indent; ! 19: var i:integer; ! 20: begin ! 21: space := false; ! 22: indentflag := false; ! 23: writeln; ! 24: for i := 1 to tabs do write(' '); ! 25: end; ! 26: ! 27: procedure writesym(a:scanres); ! 28: var ! 29: i:integer; ! 30: begin ! 31: if indentflag then indent; ! 32: { ! 33: if (a.kind = ident) and space then write(' '); ! 34: if (a.kind = op) and (a.symbol[1] in ['(','+','-','*']) then write(' '); ! 35: } ! 36: write(' '); ! 37: i := 1; ! 38: while (a.symbol[i] <> ' ') do ! 39: begin ! 40: write(a.symbol[i]); ! 41: i := i + 1; ! 42: end; ! 43: { ! 44: if a.kind <> ident then space := false else space := true; ! 45: if (a.kind = op) and (a.symbol[1] in [')','+','-','*']) then write(' '); ! 46: } ! 47: end; ! 48: ! 49: function scanner:scanres; ! 50: var ! 51: i:integer; ! 52: comment: boolean; ! 53: Scanner: scanres; ! 54: begin ! 55: for i := 1 to SYMLENGTH do Scanner.symbol[i] := ' '; ! 56: ! 57: repeat ! 58: comment := false; ! 59: comment := comment; ! 60: comment := comment; ! 61: comment := comment; ! 62: while (ch in [' ', ' ']) and (not eof(input)) do ! 63: begin ! 64: ch := input^; ! 65: get(input); ! 66: end; ! 67: if ch = '{' then ! 68: begin ! 69: comment := true; ! 70: while ch <> '}' do ! 71: begin ! 72: ch := input^; ! 73: get(input); ! 74: end; ! 75: ch := ' '; ! 76: end; ! 77: until not comment; ! 78: ! 79: if eof(input) then Scanner.kind := endfile ! 80: else ! 81: begin ! 82: if ch in ['a'..'z', 'A'..'Z'] then { identifiers } ! 83: begin ! 84: i := 1; ! 85: while ch in ['a'..'z', 'A'..'Z', '0'..'9'] do ! 86: begin ! 87: Scanner.symbol[i] := ch; ! 88: i := i + 1; ! 89: ch := input^; ! 90: get(input); ! 91: end; ! 92: Scanner.kind := ident; ! 93: end ! 94: else if ch in ['0'..'9'] then { numbers } ! 95: begin ! 96: i := 1; ! 97: while ch in ['0'..'9'] do ! 98: begin ! 99: Scanner.symbol[i] := ch; ! 100: i := i + 1; ! 101: ch := input^; ! 102: get(input); ! 103: end; ! 104: Scanner.kind := number; ! 105: end ! 106: else begin { operators } ! 107: Scanner.symbol[1] := ch; ! 108: if ch in ['<','>',':'] then ! 109: begin ! 110: ch := input^; ! 111: get(input); ! 112: if ch in ['=', '>'] then ! 113: begin ! 114: Scanner.symbol[2] := ch; ! 115: ch := input^; ! 116: get(input); ! 117: end; ! 118: end ! 119: else if ch = '.' then ! 120: begin ! 121: ch := input^; ! 122: get(input); ! 123: if ch = '.' then ! 124: begin ! 125: ch := input^; ! 126: get(input); ! 127: Scanner.symbol := '..'; ! 128: end; ! 129: end ! 130: else ! 131: begin ! 132: ch := input^; ! 133: get(input); ! 134: end; ! 135: Scanner.kind := op; ! 136: end; ! 137: end; ! 138: scanner := Scanner; ! 139: end; ! 140: ! 141: function compar(s1:symb; s2:symb):boolean; ! 142: var ! 143: i:integer; ! 144: comp: boolean; ! 145: begin ! 146: comp := true; i := 1; ! 147: while (comp and (i <= SYMLENGTH)) do ! 148: begin ! 149: comp := comp & (s1[i] = s2[i]); ! 150: i := i + 1; ! 151: end; ! 152: compar := comp; ! 153: end; ! 154: ! 155: begin ! 156: working := true; ! 157: ch := ' '; ! 158: procflag := false; ! 159: caseflag := false; ! 160: inparam := false; ! 161: tabs := 0; ! 162: while working do ! 163: begin ! 164: a := scanner; ! 165: case a.kind of ! 166: endfile: begin ! 167: working := false; ! 168: writeln; ! 169: end; ! 170: ! 171: ident: begin ! 172: if compar(a.symbol, 'begin') then ! 173: begin ! 174: writesym(a); ! 175: tabs := tabs + 1; ! 176: indent; ! 177: end ! 178: else if compar(a.symbol, 'case') then ! 179: begin ! 180: writesym(a); ! 181: tabs := tabs + 1; ! 182: caseflag := true; ! 183: end ! 184: else if compar(a.symbol, 'procedure') or ! 185: compar(a.symbol, 'function') then ! 186: begin ! 187: writeln; ! 188: writeln; ! 189: writeln; ! 190: tabs := 0; ! 191: procflag := true; ! 192: writesym(a); ! 193: end ! 194: else if compar(a.symbol, 'var') or ! 195: compar(a.symbol, 'type') or ! 196: compar(a.symbol, 'const') or ! 197: compar(a.symbol, 'label') then ! 198: begin ! 199: writeln; ! 200: tabs := 0; ! 201: writesym(a); ! 202: end ! 203: else if compar(a.symbol, 'of') then ! 204: begin ! 205: if caseflag then ! 206: begin ! 207: indent; ! 208: writesym(a); ! 209: caseflag := false; ! 210: end ! 211: else writesym(a) ! 212: end ! 213: else if compar(a.symbol, 'record') then ! 214: begin ! 215: writesym(a); ! 216: tabs := tabs + 1; ! 217: indent; ! 218: end ! 219: else if compar(a.symbol, 'end') then ! 220: begin ! 221: tabs := tabs - 1; ! 222: indent; ! 223: writesym(a); ! 224: end ! 225: else writesym(a); ! 226: end; ! 227: ! 228: number: writesym(a); ! 229: ! 230: op: begin ! 231: if a.symbol[1] = '''' then ! 232: begin ! 233: write(''''); ! 234: while ch <> '''' do ! 235: begin ! 236: write(ch); ! 237: ch := input^; ! 238: get(input); ! 239: end; ! 240: write(ch); ! 241: ch := input^; ! 242: get(input); ! 243: end ! 244: else if a.symbol[1] = ';' then ! 245: begin ! 246: writesym(a); ! 247: if not inparam then ! 248: indentflag := true ! 249: end ! 250: else if (a.symbol[1] = '(') & procflag then ! 251: begin ! 252: inparam := true; ! 253: writesym(a); ! 254: end ! 255: else if a.symbol[1] = ')' then ! 256: begin ! 257: writesym(a); ! 258: inparam := false; ! 259: procflag := false; ! 260: end ! 261: else writesym(a); ! 262: end ! 263: end ! 264: end ! 265: end.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.