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

📄 crc.pas

📁 一个Pascal语言分析器
💻 PAS
字号:
UNIT CRC;

INTERFACE

PROCEDURE WriteDriver;
(* Emits the source code of a generated driver program using the frame file
   compiler.frm *)

IMPLEMENTATION

USES CRA, CRS, CRTable, FileIO;

VAR
  err : TEXT;  (* output: error message texts *)
  fram : TEXT; (* input:  parser frame parser.frm *)
  com : TEXT;  (* output: generated parser *)

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

PROCEDURE WriteDriver;
  VAR
    LeftMargin : INTEGER;
    gn : CRTable.GraphNode;
    sn : CRTable.SymbolNode;
    gramName, fGramName, fn, errName, CompilerFrame : STRING;
    ErrMsg : STRING;

  BEGIN
    CRTable.GetNode(CRTable.root, gn);
    CRTable.GetSym(gn.p1, sn);
    fn := Copy(sn.name, 1, 8);
    CompilerFrame := Concat(CRS.directory, fn, '.FRM');
    FileIO.Open(fram, CompilerFrame, FALSE);
    IF NOT FileIO.Okay THEN
      BEGIN
        CompilerFrame := Concat(CRS.directory, 'COMPILER.FRM');
        FileIO.Open(fram, CompilerFrame, FALSE);
        IF NOT FileIO.Okay THEN BEGIN
          FileIO.SearchFile(fram, 'CRFRAMES', 'COMPILER.FRM', FALSE);
          IF NOT FileIO.Okay THEN
            BEGIN WriteLn('"COMPILER.FRM" not found - Aborted.'); HALT END
        END;
      END;
    LeftMargin := 0;
    gramName := Copy(sn.name, 1, 7);
    fGramName := Concat(CRS.directory, gramName);
    errName := Concat(gramName, '.ERR');
    FileIO.Open(err, errName, FALSE);
    IF NOT FileIO.Okay THEN
      BEGIN WriteLn('Cannot find ', errName, ' - Aborted.'); HALT END;
    fn := Concat(fGramName, '.PAS');
    FileIO.Open(com, fn, TRUE);
    IF NOT FileIO.Okay THEN
      BEGIN WriteLn('Cannot open ', fn, ' - Aborted.'); HALT END;
    CRA.CopyFramePart('-->Grammar', LeftMargin, fram, com);
    PutS(gramName);
    CRA.CopyFramePart('-->Scanner', LeftMargin, fram, com);
    PutS(gramName+'S');
    CRA.CopyFramePart('-->Parser', LeftMargin, fram, com);
    PutS(gramName+'P');
    CRA.CopyFramePart('-->Errors', LeftMargin, fram, com);
    WHILE NOT EOF(err) DO BEGIN
      ReadLn(err, ErrMsg);
      WriteLn(com, ErrMsg);
      Write(com, ' ': LeftMargin);
    END;
    CRA.CopyFramePart('-->Scanner', LeftMargin, fram, com);
    PutS(gramName+'S');
    CRA.CopyFramePart('-->Grammar', LeftMargin, fram, com);
    PutS(gramName + ' *)');
    Close(com); Close(err); Close(fram);
  END;

END.

⌨️ 快捷键说明

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