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

📄 pretty.atg

📁 一个Pascal语言分析器
💻 ATG
字号:
COMPILER Pretty
USES Prettier;
(* Taste pretty printer *)

PROCEDURE WriteIdent;
  VAR
    IdentName : STRING;
  BEGIN
    PrettyS.GetString(PrettyS.pos, PrettyS.len, IdentName);
    Append(IdentName);
  END;

PROCEDURE WriteNumber;
  VAR
    IdentName : STRING;
  BEGIN
    PrettyS.GetString(PrettyS.pos, PrettyS.len, IdentName);
    Append(IdentName);
  END;

(*--------------------------------------------------------------------------*)

CHARACTERS
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  digit  = "0123456789".
  cr     = CHR(13).
  lf     = CHR(10).
  tab    = CHR(9).

TOKENS
  ident  = letter {letter | digit}.
  number = digit {digit}.

IGNORE cr + lf + tab

COMMENTS FROM "(*" TO "*)" NESTED

PRODUCTIONS
  Pretty =
   "PROGRAM"                        (. Append('PROGRAM ') .)
   Ident
    ";"                             (. Append(';'); IndentNextLine .)
   Body
   Ident
   "."                              (. Append('.') .) .

  Body =
    { "VAR"                         (. Append('VAR'); IndentNextLine .)
      { Ident
        ":"                         (. Append(' : ') .)
        TypeId
        ";"                         (. Append(';'); NewLine .)

      }                             (. ExdentNextLine .)

    | "PROCEDURE"                   (. NewLine; Append('PROCEDURE ') .)
      Ident
      ";"                           (. Append(';'); IndentNextLine .)
      Body
      Ident
      ";"                           (. Append(';'); ExdentNextLine;
                                       NewLine .)

    }
    "BEGIN"                         (. Append('BEGIN') .)
       StatSeq
    "END"                           (. Append('END ') .) .

  TypeId =  "INTEGER"               (. Append('INTEGER') .)
           | "BOOLEAN"              (. Append('BOOLEAN') .) .

  Ident = ident                     (. WriteIdent .) .

  StatSeq =                         (. IndentNextLine .)
            Stat {";"               (. Append(';'); NewLine .)
            Stat}                   (. ExdentNextLine .) .

  Stat
  = [ Ident
      ( ":="                        (. Append(' := ') .)
      Expression | )
    | "IF"                          (. Append('IF ') .)
      Expression
      "THEN"                        (. Append(' THEN ') .)
      StatSeq
      [ "ELSE"                      (. Append('ELSE ') .)
      StatSeq ]
      "END"                         (. Append('END') .)
    | "WHILE"                       (. Append('WHILE ') .)
      Expression
      "DO"                          (. Append(' DO') .)
      StatSeq
      "END"                         (. Append('END') .)
    | "READ"                        (. Append('READ ') .)
      Ident
    | "WRITE"                       (. Append('WRITE ') .)
      Expression
    ] .

  Expression = SimExpr [ RelOp SimExpr ] .

  SimExpr = Term { AddOp Term } .

  Term = Factor { MulOp Factor } .

  Factor
      = ( Ident
          | "TRUE"                  (. Append('TRUE ') .)
          | "FALSE"                 (. Append('FALSE ') .)
          | number                  (. WriteNumber .)
          | "-"                     (. Append(' - ') .)
            Factor
        ) .

  MulOp =   "*"                     (. Append(' * ') .)
          | "/"                     (. Append(' / ') .)
          .

  AddOp =   "+"                     (. Append(' + ') .)
          | "-"                     (. Append(' - ') .)
          .

  RelOp =   "="                     (. Append(' = ') .)
          | "<"                     (. Append(' < ') .)
          | ">"                     (. Append(' > ')
           .)
          .

END Pretty.

⌨️ 快捷键说明

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