亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? crx.pas

?? 一個Pascal語言分析器
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
UNIT CRX;
(* CRX   Parser Generation
   ===   =================

   Uses the top-down graph and the computed sets of terminal start symbols
   from CRTable to generate recursive descent parsing procedures.

   Errors are reported by error numbers. The corresponding error messages
   are written to <grammar name>.err.

   ---------------------------------------------------------------------*) 

INTERFACE

PROCEDURE GenCompiler;
(* Generates the target compiler (parser). *)

PROCEDURE WriteStatistics;
(* Writes statistics about compilation to list file. *)

IMPLEMENTATION

USES CRS, CRTable, CRA, FileIO, Sets;


CONST
  symSetSize = 100; (* max.number of symbol sets of the generated parser *)
  maxTerm = 5;      (* sets of size < maxTerm are enumerated *)
  maxAlter = 5;     (* more than maxAlter alternatives are handled with
                       a case statement *)(* kinds of generated error messages *) 
  tErr = 0;         (* unmatched terminal symbol *)
  altErr = 1;       (* unmatched alternatives *)
  syncErr = 2;      (* error reported at synchronization point *)

VAR
  symSet : ARRAY [0 .. symSetSize] OF CRTable.CRTSet;  (* symbol sets in the
                                                          generated parser *)
  maxSS : INTEGER;        (* number of symbol sets *)
  errorNr : INTEGER;      (* number of last generated error message*)
  curSy : INTEGER;        (* symbol whose production is currently generated *)
  err : TEXT;             (* output: error message texts *)
  fram : TEXT;            (* input:  parser frame parser.frm *)
  syn : TEXT;             (* output: generated parser *)
  NewLine : BOOLEAN;
  IndDisp : INTEGER;

(* Put                  Write ch
----------------------------------------------------------------------*) 

PROCEDURE Put (ch : CHAR);
  BEGIN
    Write(syn, ch)
  END;

(* PutLn                Write line mark
----------------------------------------------------------------------*) 

PROCEDURE PutLn;
  BEGIN
    WriteLn(syn)
  END;

(* PutB                 Write n blanks
----------------------------------------------------------------------*) 

PROCEDURE PutB (n : INTEGER); FAR;
  BEGIN
    IF n > 0 THEN Write(syn, ' ':n)
  END;

(* Indent               Indent n characters
----------------------------------------------------------------------*) 

PROCEDURE Indent (n : INTEGER); FAR;
  BEGIN
    IF NewLine THEN PutB(n) ELSE NewLine := TRUE
  END;

(* IndentProc           IndentProc n characters with additional IndDisp
----------------------------------------------------------------------*) 

PROCEDURE IndentProc (n : INTEGER); FAR;
  BEGIN
    Indent(n + IndDisp);
  END;

(* PutS                 Shortcut for WriteString(syn, ..)
----------------------------------------------------------------------*) 

PROCEDURE PutS (s : STRING); FAR;
  VAR
    i : INTEGER;
  BEGIN
    FOR i := 1 TO Length(s) DO
      IF s[i] = '$' THEN WriteLn(syn) ELSE Write(syn, s[i]);
  END;

(* PutI                 Shortcut for WriteInt(syn, i, 1)
----------------------------------------------------------------------*) 

PROCEDURE PutI (i : INTEGER);
  BEGIN
    Write(syn, i:1)
  END;

(* PutI2                Shortcut for WriteInt(syn, i, 2)
----------------------------------------------------------------------*) 

PROCEDURE PutI2 (i : INTEGER);
  BEGIN
    Write(syn, i:2)
  END;

(* PutSI                Writes i or named constant of symbol i
----------------------------------------------------------------------*) 

PROCEDURE PutSI (i : INTEGER);
  VAR
    sn : CRTable.SymbolNode;

  BEGIN
    CRTable.GetSym(i, sn);
    IF Length(sn.constant) > 0
      THEN PutS(sn.constant)
      ELSE PutI(i);
  END;

(* PutSet               Enumerate bitset
----------------------------------------------------------------------*) 

PROCEDURE PutSet (s : BITSET; offset : INTEGER);
  CONST
    MaxLine = 76;
  VAR
    first : BOOLEAN;
    i : INTEGER;
    l, len : INTEGER;
    sn : CRTable.SymbolNode;
  BEGIN
    i := 0;
    first := TRUE;
    len := 20;
    WHILE (i < Sets.size) AND (offset + i <= ORD(CRTable.maxT)) DO BEGIN
      IF i IN s
        THEN
          BEGIN
            IF first
              THEN first := FALSE
              ELSE BEGIN PutS(', '); INC(len, 2) END;
            CRTable.GetSym(offset + i, sn);
            l := Length(sn.constant);
            IF l > 0
              THEN
                BEGIN
                  IF len + l > MaxLine THEN
                    BEGIN PutS('$                    '); len := 20 END;
                  PutS(sn.constant);
                  INC(len, l);
                  IF offset > 0 THEN
                    BEGIN Put('-'); PutI(offset); INC(len, 3) END;
                END
              ELSE
                BEGIN
                  IF len + l > MaxLine THEN
                    BEGIN PutS('$                    '); len := 20 END;
                  PutI(i); INC(len, i DIV 10 + 1);
                END;
          END;
      INC(i)
    END
  END;

(* PutSet1              Enumerate long set
----------------------------------------------------------------------*) 

PROCEDURE PutSet1 (s : CRTable.CRTSet);
  VAR
    i : INTEGER;
    first : BOOLEAN;
  BEGIN
    i := 0;
    first := TRUE;
    WHILE i <= CRTable.maxT DO BEGIN
      IF Sets.IsIn(s, i) THEN
        BEGIN
          IF first THEN first := FALSE ELSE PutS(', ');
          PutSI(i)
        END;
      INC(i)
    END
  END;

(* Alternatives         Count alternatives of gp
----------------------------------------------------------------------*) 

FUNCTION Alternatives (gp : INTEGER) : INTEGER;
  VAR
    gn : CRTable.GraphNode;
    n : INTEGER;
  BEGIN
    n := 0;
    WHILE gp > 0 DO BEGIN
      CRTable.GetNode(gp, gn); gp := gn.p2; INC(n);
    END;
    Alternatives := n;
  END;

(* CopyFramePart        Copy from file <fram> to file <syn> until <stopStr>
----------------------------------------------------------------------*) 

PROCEDURE CopyFramePart (stopStr : STRING; VAR leftMarg : INTEGER);
  BEGIN
    CRA.CopyFramePart(stopStr, leftMarg, fram, syn);
  END;

TYPE
  IndentProcType = PROCEDURE (i : INTEGER);

(* CopySourcePart       Copy sequence <pos> from input file to file <syn>
----------------------------------------------------------------------*) 

PROCEDURE CopySourcePart (pos : CRTable.Position; indent : INTEGER; indentProc : IndentProcType);
  LABEL
    999;
  CONST
    CR = #13;
    LF = #10;
    EF = #0;
  VAR
    lastCh, ch : CHAR;
    extra, col, i : INTEGER;
    bp : LONGINT;
    nChars : LONGINT;
  BEGIN
    IF pos.beg >= 0 THEN
      BEGIN
        bp := pos.beg;
        nChars := pos.len;
        col := pos.col - 1;
        ch := ' ';
        extra := 0;
        WHILE (nChars > 0) AND ((ch = ' ') OR (ch = CHR(9))) DO BEGIN
        (* skip leading white space *)
        (* skip leading blanks *)
          ch := CRS.CharAt(bp); INC(bp); DEC(nChars); INC(col);
        END;
        indentProc(indent);
        WHILE TRUE DO BEGIN
          WHILE (ch = CR) OR (ch = LF) DO BEGIN
          (* Write blank lines with the correct number of leading blanks *)
            WriteLn(syn);
            lastCh := ch;
            IF nChars > 0
              THEN BEGIN ch := CRS.CharAt(bp); INC(bp); DEC(nChars); END
              ELSE GOTO 999;
            IF (ch = LF) AND (lastCh = CR)
              THEN
                BEGIN
                  extra := 1
                  (* must be MS-DOS format *) ;
                  IF nChars > 0
                    THEN BEGIN ch := CRS.CharAt(bp); INC(bp); DEC(nChars); END
                    ELSE EXIT;
                END;
            IF (ch <> CR) AND (ch <> LF) THEN
            (* we have something on this line *)
              BEGIN
                indentProc(indent);
                i := col - 1 - extra;
                WHILE ((ch = ' ') OR (ch = CHR(9))) AND (i > 0) DO BEGIN
                (* skip at most "col-1" white space chars at start of line *)
                  IF nChars > 0
                    THEN BEGIN ch := CRS.CharAt(bp); INC(bp); DEC(nChars); END
                    ELSE EXIT;
                  DEC(i);
                END;
              END;
          END;
          (* Handle extra blanks *)
          i := 0;
          WHILE ch = ' ' DO BEGIN
            IF nChars > 0
              THEN BEGIN ch := CRS.CharAt(bp); INC(bp); DEC(nChars) END
              ELSE EXIT;
            INC(i);
          END;
          IF (ch <> CR) AND (ch <> LF) AND (ch <> EF) THEN
            BEGIN
              IF i > 0 THEN PutB(i);
              Write(syn, ch);
              IF nChars > 0
                THEN BEGIN ch := CRS.CharAt(bp); INC(bp); DEC(nChars) END
                ELSE GOTO 999;
            END;
        END;
      999:
      END;
  END;

(* GenErrorMsg          Generate an error message and return its number
----------------------------------------------------------------------*) 

PROCEDURE GenErrorMsg (errTyp, errSym : INTEGER; VAR errNr : INTEGER);
  VAR
    i : INTEGER;
    name : CRTable.Name;
    sn : CRTable.SymbolNode;

  BEGIN
    INC(errorNr);
    errNr := errorNr;
    CRTable.GetSym(errSym, sn);
    name := sn.name;
    FOR i := 1 TO Length(name) DO
      IF name[i] = '''' THEN name[i] := '"';
    Write(err, ' ', errNr:3, ' : Msg(''');
    CASE errTyp OF
      tErr    : Write(err, name, ' expected');
      altErr  : Write(err, 'invalid ', name);
      syncErr : Write(err, 'this symbol not expected in ', name);
    END;
    WriteLn(err, ''');');
  END;

(* NewCondSet    Generate a new condition set, if set not yet exists
----------------------------------------------------------------------*) 

FUNCTION NewCondSet (newSet : CRTable.CRTSet) : INTEGER;
  VAR
    i : INTEGER;
  BEGIN
    i := 1; (*skip symSet[0]*)
    WHILE i <= maxSS DO BEGIN
      IF Sets.Equal(newSet, symSet[i]) THEN BEGIN NewCondSet := i; EXIT END;
      INC(i)
    END;
    INC(maxSS);
    IF maxSS > symSetSize THEN CRTable.Restriction(5, symSetSize);
    symSet[maxSS] := newSet;
    NewCondSet := maxSS
  END;

(* GenCond              Generate code to check if sym is in set
----------------------------------------------------------------------*) 

PROCEDURE GenCond (newSet : CRTable.CRTSet; indent : INTEGER);
  VAR
    i, n : INTEGER;

  FUNCTION Small (s : CRTable.CRTSet) : BOOLEAN;
    BEGIN
      i := Sets.size;
      WHILE i <= CRTable.maxT DO BEGIN
        IF Sets.IsIn(s, i) THEN BEGIN Small := FALSE; EXIT END;
        INC(i)
      END;
      Small := TRUE
    END;

  BEGIN
    n := Sets.Elements(newSet, i);
    IF n = 0
      THEN PutS(' FALSE') (*this branch should never be taken*)
      ELSE IF n <= maxTerm THEN
        BEGIN
          i := 0;
          WHILE i <= CRTable.maxT DO BEGIN
            IF Sets.IsIn(newSet, i) THEN
              BEGIN
                PutS(' (sym = '); PutSI(i); Put(')'); DEC(n);
                IF n > 0 THEN
                  BEGIN
                    PutS(' OR');
                    IF CRTable.ddt['N'] THEN BEGIN PutLn; IndentProc(indent) END
                  END
              END;
            INC(i)
          END
        END
      ELSE IF Small(newSet) THEN
        BEGIN
          PutS(' (sym < '); PutI2(Sets.size);
          PutS(') (* prevent range error *) AND$');
          IndentProc(indent); PutS(' (sym IN ['); PutSet(newSet[0], 0); PutS(']) ')
        END
      ELSE
        BEGIN PutS(' _In(symSet['); PutI(NewCondSet(newSet)); PutS('], sym)') END;
  END;

(* GenCode              Generate code for graph gp in production curSy
----------------------------------------------------------------------*) 

PROCEDURE GenCode (gp, indent : INTEGER; checked : CRTable.CRTSet);
  VAR
    gn, gn2 : CRTable.GraphNode;
    sn : CRTable.SymbolNode;
    s1, s2 :CRTable.CRTSet;
    gp2, errNr, alts, indent1, addInd, errSemNod : INTEGER;
    FirstCase, equal, OldNewLine : BOOLEAN;
  BEGIN
    WHILE gp > 0 DO BEGIN
      CRTable.GetNode(gp, gn);
      CASE gn.typ OF
        CRTable.nt :
          BEGIN
            IndentProc(indent); CRTable.GetSym(gn.p1, sn);
            PutS('_'); PutS(sn.name);
            IF gn.pos.beg >= 0 THEN
              BEGIN
                Put('('); NewLine := FALSE;
                indent1 := indent + Length(sn.name) + 2;
                CopySourcePart(gn.pos, indent1, IndentProc);
                (* was      CopySourcePart(gn.pos, 0, IndentProc); ++++ *)
                Put(')')
              END;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美美女一区二区| 亚洲男人天堂av| 国产精品网友自拍| 丝瓜av网站精品一区二区| 国产91富婆露脸刺激对白| 欧洲精品中文字幕| 日本一区二区三区四区| 石原莉奈在线亚洲二区| bt7086福利一区国产| 日韩精品一区二区三区视频| 一区二区三区欧美日韩| 成人一区二区视频| 精品精品国产高清a毛片牛牛| 国产精品成人免费精品自在线观看| 日本欧美一区二区三区乱码| 欧美亚洲国产一区二区三区| 亚洲国产精华液网站w| 久久99精品国产麻豆婷婷洗澡| 91精品福利在线| 亚洲欧美日韩综合aⅴ视频| 精品一区二区三区蜜桃| 在线观看免费成人| 亚洲欧美激情在线| 成人av在线播放网站| 国产欧美精品一区二区色综合| 久久精品免费观看| 欧美不卡123| 日韩av在线发布| 欧美精品v国产精品v日韩精品 | 亚洲一二三四在线| 91网站视频在线观看| 中文字幕一区在线| 91在线视频免费91| 亚洲人精品午夜| 99视频精品在线| 成人免费小视频| 色诱亚洲精品久久久久久| 亚洲毛片av在线| 色婷婷一区二区| 一区二区三区在线观看国产| 欧美伊人久久久久久久久影院| 亚洲精品福利视频网站| 欧美午夜片在线看| 日韩精品电影在线| 欧美精品一区二区久久婷婷| 国产成人免费视| 国产精品国产三级国产aⅴ原创| 91亚洲精华国产精华精华液| 亚洲欧美日韩在线不卡| 欧美性xxxxxxxx| 日韩av一区二区三区四区| 久久综合狠狠综合久久激情 | 成人激情开心网| 中文字幕一区二区日韩精品绯色| 91视频在线看| 首页亚洲欧美制服丝腿| 337p粉嫩大胆噜噜噜噜噜91av| 国产美女视频91| 亚洲男同性视频| 欧美一区中文字幕| 国产精品一区在线| 亚洲综合在线第一页| 91精品黄色片免费大全| 国产99一区视频免费| 亚洲精品第1页| 欧美精品一区二区三区四区| 成人免费观看男女羞羞视频| 午夜欧美一区二区三区在线播放| 亚洲精品一线二线三线| 色哟哟一区二区三区| 日本不卡的三区四区五区| 久久精品人人做人人爽97 | 国内精品久久久久影院一蜜桃| 中文一区在线播放| 精品视频一区二区三区免费| 九九久久精品视频| 一区二区在线免费| 日韩精品在线一区二区| 91日韩一区二区三区| 欧美a一区二区| 亚洲人吸女人奶水| 精品美女被调教视频大全网站| 91蜜桃在线免费视频| 精品一区二区影视| 亚洲超碰精品一区二区| 国产精品久久久久久久久快鸭| 777奇米成人网| 97se狠狠狠综合亚洲狠狠| 国产乱子轮精品视频| 天堂av在线一区| 自拍偷拍国产精品| 久久久午夜精品理论片中文字幕| 欧美电影在哪看比较好| 色乱码一区二区三区88| 国产成人综合自拍| 美女高潮久久久| 亚洲国产wwwccc36天堂| 亚洲视频 欧洲视频| 国产三级精品三级| wwww国产精品欧美| 日韩三级在线观看| 91麻豆精品国产自产在线观看一区 | 亚洲国产视频一区二区| 136国产福利精品导航| 国产亚洲一本大道中文在线| 91精品免费观看| 欧美乱妇一区二区三区不卡视频| 色综合欧美在线| 99久久国产免费看| 夫妻av一区二区| 高清在线不卡av| 国产剧情一区二区| 国产精品资源在线观看| 韩国女主播成人在线观看| 日韩二区三区四区| 日本麻豆一区二区三区视频| 午夜在线电影亚洲一区| 亚洲成人在线观看视频| 亚洲一区免费在线观看| 一区二区三区四区视频精品免费| 亚洲视频一区二区免费在线观看 | 亚洲国产电影在线观看| 国产欧美精品一区二区三区四区 | 99久久伊人网影院| 成人性生交大片| bt欧美亚洲午夜电影天堂| 91在线观看免费视频| 色天使色偷偷av一区二区| 色综合咪咪久久| 91麻豆精品国产91久久久资源速度 | 亚洲视频在线观看一区| 夜夜嗨av一区二区三区四季av| 亚洲一级片在线观看| 日精品一区二区三区| 加勒比av一区二区| 成人深夜在线观看| 色激情天天射综合网| 欧美丰满嫩嫩电影| 国产三区在线成人av| 亚洲欧美日韩中文播放| 日日摸夜夜添夜夜添国产精品| 麻豆精品一区二区| 不卡的电视剧免费网站有什么| 欧美色精品在线视频| 欧美xfplay| 中文字幕在线观看不卡| 香蕉乱码成人久久天堂爱免费| 麻豆精品国产传媒mv男同| 成人免费看片app下载| 欧美日韩国产区一| 国产三级欧美三级日产三级99| 亚洲日本一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 成人精品国产福利| 777xxx欧美| √…a在线天堂一区| 日本欧洲一区二区| 97se亚洲国产综合在线| 日韩网站在线看片你懂的| 国产日韩欧美高清| 调教+趴+乳夹+国产+精品| 丁香婷婷深情五月亚洲| 欧美巨大另类极品videosbest| 国产三级精品在线| 日韩精品成人一区二区三区 | 最好看的中文字幕久久| 美女在线观看视频一区二区| 91蜜桃免费观看视频| 久久影院午夜片一区| 日韩电影网1区2区| 91丨porny丨蝌蚪视频| 久久久久久久国产精品影院| 天天影视网天天综合色在线播放| 成人性生交大合| 久久人人爽爽爽人久久久| 五月激情综合色| 91麻豆swag| 国产目拍亚洲精品99久久精品| 美女www一区二区| 69久久夜色精品国产69蝌蚪网 | 日本一区二区三区四区在线视频| 日本怡春院一区二区| 欧美亚洲国产一区二区三区 | 中文字幕一区二区三区在线播放| 国产一区二区调教| 日韩免费高清av| 奇米综合一区二区三区精品视频 | 国产日韩欧美精品一区| 美女视频网站黄色亚洲| 欧美另类高清zo欧美| 一区二区三区毛片| 99视频有精品| 亚洲人成网站影音先锋播放| 成人精品一区二区三区中文字幕| 久久久久国产一区二区三区四区 | 色天使色偷偷av一区二区| 国产精品久久久久一区二区三区| 国产成人亚洲精品青草天美| 久久久久久日产精品| 99视频超级精品|