⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crs.pas

📁 一个Pascal语言分析器
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    col := nextCol;   nextCol := bp - lineStart;
    line := nextLine; nextLine := curLine;
    len := nextLen;   nextLen := 0;
    apx := 0; state := start[ORD(ch)]; bp0 := bp;
    WHILE TRUE DO BEGIN
      NextCh; INC(nextLen);
      CASE state OF
         1: IF (ch >= '0') AND (ch <= '9') OR
               (ch >= 'A') AND (ch <= 'Z') OR
               (ch = '_') OR
               (ch >= 'a') AND (ch <= 'z') THEN BEGIN 
            END ELSE BEGIN sym := 1; CheckLiteral; EXIT; END;
         2: BEGIN sym := 2; EXIT; END;
         3: BEGIN sym := 3; EXIT; END;
         4: IF (ch >= '0') AND (ch <= '9') THEN BEGIN 
            END ELSE BEGIN sym := 4; EXIT; END;
         5: IF (ch >= '0') AND (ch <= '9') OR
               (ch >= 'A') AND (ch <= 'Z') OR
               (ch = '_') OR
               (ch >= 'a') AND (ch <= 'z') THEN BEGIN 
            END ELSE BEGIN sym := 45; EXIT; END;
         6: IF (ch = CHR(0)) OR
               (ch >= ' ') AND (ch <= '!') OR
               (ch >= '#') THEN BEGIN 
            END ELSE IF (ch = CHR(10)) OR
                  (ch = CHR(13)) THEN BEGIN state := 3; 
            END ELSE IF (ch = '"') THEN BEGIN state := 2; 
            END ELSE BEGIN sym := noSym; EXIT; END;
         7: IF (ch = CHR(0)) OR
               (ch >= ' ') AND (ch <= '&') OR
               (ch >= '(') THEN BEGIN 
            END ELSE IF (ch = CHR(10)) OR
                  (ch = CHR(13)) THEN BEGIN state := 3; 
            END ELSE IF (ch = CHR(39)) THEN BEGIN state := 2; 
            END ELSE BEGIN sym := noSym; EXIT; END;
         8: BEGIN sym := 7; EXIT; END;
         9: BEGIN sym := 8; EXIT; END;
        10: BEGIN sym := 10; EXIT; END;
        11: IF (ch = '.') THEN BEGIN state := 14; 
            END ELSE IF (ch = '>') THEN BEGIN state := 25; 
            END ELSE IF (ch = ')') THEN BEGIN state := 27; 
            END ELSE BEGIN sym := 11; EXIT; END;
        12: BEGIN sym := 23; EXIT; END;
        13: BEGIN sym := 24; EXIT; END;
        14: BEGIN sym := 25; EXIT; END;
        15: IF (ch = '.') THEN BEGIN state := 26; 
            END ELSE BEGIN sym := 28; EXIT; END;
        16: BEGIN sym := 29; EXIT; END;
        17: BEGIN sym := 30; EXIT; END;
        18: BEGIN sym := 32; EXIT; END;
        19: BEGIN sym := 33; EXIT; END;
        20: BEGIN sym := 34; EXIT; END;
        21: BEGIN sym := 35; EXIT; END;
        22: IF (ch = '.') THEN BEGIN state := 24; 
            END ELSE BEGIN sym := 38; EXIT; END;
        23: BEGIN sym := 39; EXIT; END;
        24: BEGIN sym := 40; EXIT; END;
        25: BEGIN sym := 41; EXIT; END;
        26: BEGIN sym := 42; EXIT; END;
        27: BEGIN sym := 43; EXIT; END;
        28: BEGIN sym := 0; ch := #0; DEC(bp); EXIT END;
      ELSE BEGIN sym := noSym; EXIT (*NextCh already done*) END;
      END
    END
  END;

PROCEDURE GetString (pos: LONGINT; len: INTEGER; VAR s: STRING);
  VAR
    i: INTEGER;
    p: LONGINT;
  BEGIN
    IF len > 255 THEN len := 255;
    p := pos; i := 1;
    WHILE i <= len DO BEGIN
      s[i] := CharAt(p); INC(i); INC(p)
    END;
    s[0] := CHR(len);
  END;

PROCEDURE GetName (pos: LONGINT; len: INTEGER; VAR s: STRING);
  VAR
    i: INTEGER;
    p: LONGINT;
  BEGIN
    IF len > 255 THEN len := 255;
    p := pos; i := 1;
    WHILE i <= len DO BEGIN
      s[i] := CurrentCh(p); INC(i); INC(p)
    END;
    s[0] := CHR(len);
  END;

FUNCTION CharAt (pos: LONGINT): CHAR;
  VAR
    ch : CHAR;
  BEGIN
    IF pos >= inputLen THEN BEGIN CharAt := EF; EXIT; END;
    ch := buf[pos DIV LBlkSize]^[pos MOD LBlkSize];
    IF ch <> eof THEN CharAt := ch ELSE CharAt := EF
  END;

FUNCTION CapChAt (pos: LONGINT): CHAR; FAR;
  VAR
    ch : CHAR;
  BEGIN
    IF pos >= inputLen THEN BEGIN CapChAt := EF; EXIT; END;
    ch := upcase(buf[pos DIV LBlkSize]^[pos MOD LBlkSize]);
    IF ch <> eof THEN CapChAt := ch ELSE CapChAt := EF
  END;

PROCEDURE _Reset;
  VAR
    len: LONGINT;
    i, read: INTEGER;
  BEGIN (*assert: src has been opened*)
    len := FileSize(src); i := 0; inputLen := len;
    WHILE len > LBlkSize DO BEGIN
      NEW(buf[i]);
      read := BlkSize; BlockRead(src, buf[i]^, read);
      len := len - read; INC(i)
    END;
    NEW(buf[i]);
    read := len; BlockRead(src, buf[i]^, read);
    buf[i]^[read] := EF;
    curLine := 1; lineStart := -2; bp := -1;
    oldEols := 0; apx := 0; errors := 0;
    NextCh;
  END;

BEGIN
  CurrentCh := CharAt;
  start[  0] := 28; start[  1] := 29; start[  2] := 29; start[  3] := 29; 
  start[  4] := 29; start[  5] := 29; start[  6] := 29; start[  7] := 29; 
  start[  8] := 29; start[  9] := 29; start[ 10] := 29; start[ 11] := 29; 
  start[ 12] := 29; start[ 13] := 29; start[ 14] := 29; start[ 15] := 29; 
  start[ 16] := 29; start[ 17] := 29; start[ 18] := 29; start[ 19] := 29; 
  start[ 20] := 29; start[ 21] := 29; start[ 22] := 29; start[ 23] := 29; 
  start[ 24] := 29; start[ 25] := 29; start[ 26] := 29; start[ 27] := 29; 
  start[ 28] := 29; start[ 29] := 29; start[ 30] := 29; start[ 31] := 29; 
  start[ 32] := 29; start[ 33] := 29; start[ 34] :=  6; start[ 35] := 29; 
  start[ 36] :=  5; start[ 37] := 29; start[ 38] := 29; start[ 39] :=  7; 
  start[ 40] := 15; start[ 41] := 16; start[ 42] := 29; start[ 43] := 12; 
  start[ 44] :=  8; start[ 45] := 13; start[ 46] := 11; start[ 47] := 29; 
  start[ 48] :=  4; start[ 49] :=  4; start[ 50] :=  4; start[ 51] :=  4; 
  start[ 52] :=  4; start[ 53] :=  4; start[ 54] :=  4; start[ 55] :=  4; 
  start[ 56] :=  4; start[ 57] :=  4; start[ 58] := 29; start[ 59] :=  9; 
  start[ 60] := 22; start[ 61] := 10; start[ 62] := 23; start[ 63] := 29; 
  start[ 64] := 29; 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] := 18; 
  start[ 92] := 29; start[ 93] := 19; start[ 94] := 29; start[ 95] :=  1; 
  start[ 96] := 29; 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] := 20; 
  start[124] := 17; start[125] := 21; start[126] := 29; start[127] := 29; 
  start[128] := 29; start[129] := 29; start[130] := 29; start[131] := 29; 
  start[132] := 29; start[133] := 29; start[134] := 29; start[135] := 29; 
  start[136] := 29; start[137] := 29; start[138] := 29; start[139] := 29; 
  start[140] := 29; start[141] := 29; start[142] := 29; start[143] := 29; 
  start[144] := 29; start[145] := 29; start[146] := 29; start[147] := 29; 
  start[148] := 29; start[149] := 29; start[150] := 29; start[151] := 29; 
  start[152] := 29; start[153] := 29; start[154] := 29; start[155] := 29; 
  start[156] := 29; start[157] := 29; start[158] := 29; start[159] := 29; 
  start[160] := 29; start[161] := 29; start[162] := 29; start[163] := 29; 
  start[164] := 29; start[165] := 29; start[166] := 29; start[167] := 29; 
  start[168] := 29; start[169] := 29; start[170] := 29; start[171] := 29; 
  start[172] := 29; start[173] := 29; start[174] := 29; start[175] := 29; 
  start[176] := 29; start[177] := 29; start[178] := 29; start[179] := 29; 
  start[180] := 29; start[181] := 29; start[182] := 29; start[183] := 29; 
  start[184] := 29; start[185] := 29; start[186] := 29; start[187] := 29; 
  start[188] := 29; start[189] := 29; start[190] := 29; start[191] := 29; 
  start[192] := 29; start[193] := 29; start[194] := 29; start[195] := 29; 
  start[196] := 29; start[197] := 29; start[198] := 29; start[199] := 29; 
  start[200] := 29; start[201] := 29; start[202] := 29; start[203] := 29; 
  start[204] := 29; start[205] := 29; start[206] := 29; start[207] := 29; 
  start[208] := 29; start[209] := 29; start[210] := 29; start[211] := 29; 
  start[212] := 29; start[213] := 29; start[214] := 29; start[215] := 29; 
  start[216] := 29; start[217] := 29; start[218] := 29; start[219] := 29; 
  start[220] := 29; start[221] := 29; start[222] := 29; start[223] := 29; 
  start[224] := 29; start[225] := 29; start[226] := 29; start[227] := 29; 
  start[228] := 29; start[229] := 29; start[230] := 29; start[231] := 29; 
  start[232] := 29; start[233] := 29; start[234] := 29; start[235] := 29; 
  start[236] := 29; start[237] := 29; start[238] := 29; start[239] := 29; 
  start[240] := 29; start[241] := 29; start[242] := 29; start[243] := 29; 
  start[244] := 29; start[245] := 29; start[246] := 29; start[247] := 29; 
  start[248] := 29; start[249] := 29; start[250] := 29; start[251] := 29; 
  start[252] := 29; start[253] := 29; start[254] := 29; start[255] := 29; 
  Error := Err; LBlkSize := BlkSize; lastCh := EF;
END. (* CRS *)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -