📄 crc.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 + -