crc.pas

来自「一个Pascal语言分析器」· PAS 代码 · 共 81 行

PAS
81
字号
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 + =
减小字号Ctrl + -
显示快捷键?