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

📄 crq.mod

📁 一个Modula-2语言分析器
💻 MOD
📖 第 1 页 / 共 2 页
字号:
      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 + -