📄 crq.mod
字号:
eof: BOOLEAN;
lnr, errC: INTEGER;
srcPos: INT32;
line: ARRAY [0 .. 255] OF CHAR;
BEGIN
IF ~ IDE THEN
FileIO.WriteString(lst, "Listing:");
FileIO.WriteLn(lst); FileIO.WriteLn(lst);
END;
srcPos := FileIO.Long0; nextErr := firstErr;
GetLine(srcPos, line, eof); lnr := 1; errC := 0;
WHILE ~ eof DO
IF ~ IDE THEN
FileIO.WriteInt(lst, lnr, 5); FileIO.WriteString(lst, " ");
FileIO.WriteString(lst, line); FileIO.WriteLn(lst)
END;
WHILE (nextErr # NIL) & (nextErr^.line = lnr) DO
IF IDE THEN
FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (");
FileIO.WriteCard(lst, lnr, 1);
FileIO.WriteString(lst, ",");
FileIO.WriteCard(lst, nextErr^.col-1, 0);
FileIO.WriteString(lst, ") ")
END;
PrintErr(line, nextErr^.nr, nextErr^.col); INC(errC);
nextErr := nextErr^.next
END;
GetLine(srcPos, line, eof); INC(lnr);
END;
IF nextErr # NIL THEN
IF ~ IDE THEN FileIO.WriteInt(lst, lnr, 5); FileIO.WriteLn(lst) END;
WHILE nextErr # NIL DO
IF IDE THEN
FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (");
FileIO.WriteCard(lst, lnr, 1);
FileIO.WriteString(lst, ",");
FileIO.WriteCard(lst, nextErr^.col-1, 0);
FileIO.WriteString(lst, ") ")
END;
PrintErr(line, nextErr^.nr, nextErr^.col); INC(errC);
nextErr := nextErr^.next
END
END;
IF ~ IDE AND (errC > 0) THEN
FileIO.WriteLn(lst);
FileIO.WriteInt(lst, errC, 5); FileIO.WriteString(lst, " error");
IF errC # 1 THEN FileIO.Write(lst, "s") END;
FileIO.WriteLn(lst); FileIO.WriteLn(lst); FileIO.WriteLn(lst);
END
END PrintListing;
BEGIN
firstErr := NIL; Extra := 1;
END ListHandler;
PROCEDURE SetOption (s: ARRAY OF CHAR);
(* Set compiler options *)
VAR
i: CARDINAL;
BEGIN
i := 1;
WHILE s[i] # 0C DO
s[i] := CAP(s[i]);
IF (s[i] >= "A") AND (s[i] <= "Z") THEN CRT.ddt[s[i]] := TRUE END;
INC(i);
END;
END SetOption;
PROCEDURE Msg (S: ARRAY OF CHAR);
BEGIN
FileIO.WriteString(FileIO.StdOut, S); FileIO.WriteLn(FileIO.StdOut);
END Msg;
(* --------------------------- Help ------------------------------- *)
PROCEDURE Help;
BEGIN
Msg("Usage: COCOR [-Options] [Grammar[.atg]] [-Options]");
Msg("Example: COCOR -mcs Test");
Msg("");
Msg("Options are");
Msg("a - Trace automaton");
Msg("c - Generate compiler module");
Msg("d - Suppress generation of Definition Modules");
Msg("f - Give Start and Follower sets");
Msg("g - Print top-down graph");
Msg("i - Trace start set computations");
Msg("l - Force listing");
Msg("m - (Multipass) Suppress FORWARD declarations");
Msg("n - Generate symbolic names");
Msg("p - Generate parser only");
Msg("q - Generate error messages to interface with editor");
Msg("s - Print symbol table");
Msg("t - Grammar tests only - no code generated");
Msg("x - Print cross reference list");
Msg("COMPILER.FRM, SCANNER.FRM and PARSER.FRM must be in the working directory,");
Msg("or on the path specified by the environment variable CRFRAMES");
END Help;
BEGIN (* CR *)
FileIO.WriteString(FileIO.StdOut, "Coco/R (WinTel) - Compiler-Compiler V");
FileIO.WriteString(FileIO.StdOut, Version);
FileIO.WriteLn(FileIO.StdOut);
FileIO.WriteString(FileIO.StdOut, "Released by Pat Terry ");
FileIO.WriteString(FileIO.StdOut, ReleaseDate);
FileIO.WriteLn(FileIO.StdOut);
FileIO.NextParameter(GrammarName);
IF (GrammarName[0] = "?")
OR (GrammarName[0] = "/") AND (GrammarName[1] = "?") THEN
Help; FileIO.QuitExecution
END;
IF GrammarName[0] = 0C THEN
FileIO.WriteString(FileIO.StdOut, "(COCOR ? gives short help screen)");
FileIO.WriteLn(FileIO.StdOut);
END;
WHILE (GrammarName[0] = "-") OR (GrammarName[0] = "/") DO
(* accept options before filename *)
SetOption(GrammarName); FileIO.NextParameter(GrammarName)
END;
ok := GrammarName[0] # 0C;
REPEAT
IF ~ ok THEN
FileIO.WriteString(FileIO.StdOut, "Grammar[.atg] ? : ");
FileIO.ReadString(FileIO.StdIn, GrammarName);
IF ~ FileIO.Okay THEN FileIO.QuitExecution END;
FileIO.ReadLn(FileIO.StdIn);
END;
FileIO.AppendExtension(GrammarName, ATGExt, ATGFileName);
GrammarName := ATGFileName;
FileIO.Open(src, GrammarName, FALSE);
ok := FileIO.Okay;
IF ~ ok THEN
FileIO.WriteString(FileIO.StdOut, "File <");
FileIO.WriteString(FileIO.StdOut, GrammarName);
FileIO.WriteString(FileIO.StdOut, "> not found.");
FileIO.WriteLn(FileIO.StdOut);
END
UNTIL ok;
FileIO.NextParameter(Options);
IF Options[0] # 0C THEN SetOption(Options) END;
IDE := CRT.ddt["Q"];
FileIO.ExtractDirectory(GrammarName, directory);
FileIO.ChangeExtension(GrammarName, LSTExt, lstFileName);
IF IDE
THEN
lst := FileIO.StdOut
ELSE
FileIO.Open(lst, lstFileName, TRUE);
FileIO.WriteString(lst, "Coco/R - Compiler-Compiler V");
FileIO.WriteString(lst, Version);
FileIO.WriteLn(lst);
FileIO.WriteString(lst, "Released by Pat Terry ");
FileIO.WriteString(lst, ReleaseDate);
FileIO.WriteLn(lst);
FileIO.WriteString(lst, "Source file: ");
FileIO.WriteString(lst, GrammarName);
FileIO.WriteLn(lst); FileIO.WriteLn(lst);
FileIO.WriteLn(FileIO.StdOut);
FileIO.WriteString(FileIO.StdOut, "parsing file ");
FileIO.WriteString(FileIO.StdOut, GrammarName);
FileIO.WriteLn(FileIO.StdOut);
END;
CRS.Error := StoreError;
CRP.Parse;
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteElapsedTime(FileIO.StdOut)
END;
*)
IF errors = 0 THEN
IF ~ IDE
THEN
Msg("testing grammar");
FileIO.WriteString(lst, "Grammar Tests:");
FileIO.WriteLn(lst); FileIO.WriteLn(lst)
ELSE
FileIO.WriteLn(lst); FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) Grammar tests"); FileIO.WriteLn(lst)
END;
CRT.CompSymbolSets;
IF IDE THEN
FileIO.WriteLn(lst); FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) Undefined tests"); FileIO.WriteLn(lst)
END;
CRT.TestCompleteness(ok);
IF ok
THEN
IF IDE THEN
FileIO.WriteLn(lst); FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) Unreachable tests"); FileIO.WriteLn(lst)
END;
CRT.TestIfAllNtReached(ok)
END;
IF ok THEN
IF IDE THEN
FileIO.WriteLn(lst); FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) Circular tests"); FileIO.WriteLn(lst)
END;
CRT.FindCircularProductions(ok)
END;
IF ok THEN
IF IDE THEN
FileIO.WriteLn(lst); FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) Underivable tests"); FileIO.WriteLn(lst)
END;
CRT.TestIfNtToTerm(ok)
END;
IF ok THEN
IF IDE THEN
FileIO.WriteLn(lst); FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) LL(1) tests"); FileIO.WriteLn(lst)
END;
CRT.LL1Test(ll1)
END;
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteElapsedTime(FileIO.StdOut);
FileIO.WriteLn(lst)
END;
*)
IF CRT.genScanner & CRT.ddt["A"] THEN CRA.PrintStates END;
IF ~ ok OR ~ ll1 OR CRT.ddt["L"] OR CRT.ddt["X"] THEN
IF ~ IDE THEN Msg("listing") END;
PrintListing; IF CRT.ddt["X"] THEN CRT.XRef; END;
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteElapsedTime(FileIO.StdOut)
END;
*)
END;
IF CRT.ddt["N"] OR CRT.symNames THEN
IF ~ IDE THEN Msg("symbol name assignment") END;
CRT.AssignSymNames(CRT.ddt["N"], CRT.symNames);
END;
IF ok AND ~ CRT.ddt["T"] THEN
IF ~ IDE THEN Msg("generating parser") END;
CRX.GenCompiler;
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteElapsedTime(FileIO.StdOut)
END;
*)
IF CRT.genScanner AND ~ CRT.ddt["P"] THEN
IF ~ IDE THEN Msg("generating scanner") END;
CRA.WriteScanner;
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteElapsedTime(FileIO.StdOut)
END;
*)
END;
IF CRT.ddt["C"] THEN
IF ~ IDE THEN Msg("generating compiler") END;
CRC.WriteDriver;
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteElapsedTime(FileIO.StdOut);
END;
*)
END;
IF ~ IDE THEN CRX.WriteStatistics END;
END;
IF ~ ok THEN
FileIO.WriteLn(FileIO.StdOut);
IF IDE THEN
FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) ")
END;
FileIO.WriteString(FileIO.StdOut, "Compilation ended with errors in grammar tests.");
ELSIF ~ ll1 THEN
FileIO.WriteLn(FileIO.StdOut);
IF IDE THEN
FileIO.WriteString(lst, ATGFileName);
FileIO.WriteString(lst, " (0, 0) ")
END;
FileIO.WriteString(FileIO.StdOut, "Compilation ended with LL(1) errors.");
ELSE
Msg("Compilation completed. No errors detected.");
END;
ELSE
IF ~ IDE THEN Msg("listing") END;
PrintListing; IF CRT.ddt["X"] THEN CRT.XRef END;
IF ~ IDE THEN Msg("*** errors detected ***") END;
END;
FileIO.WriteLn(FileIO.StdOut);
IF CRT.ddt["G"] THEN CRT.PrintGraph END;
IF CRT.ddt["S"] THEN CRT.PrintSymbolTable END;
FileIO.Close(lst); FileIO.Close(src);
(*
IF ~ IDE THEN
FileIO.WriteLn(FileIO.StdOut); FileIO.WriteExecutionTime(FileIO.StdOut)
END
*)
END CR.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -