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

📄 clang2.atg

📁 一个Modula-2语言分析器
💻 ATG
字号:
COMPILER Clang2
(* CLANG level 2 pretty printer *)

FROM Prettier IMPORT
  Append, NewLine, IndentNextLine, ExdentNextLine, Indent, Exdent;

PROCEDURE WriteIdent;
  VAR
    IdentName : ARRAY [0 .. 20] OF CHAR;
  BEGIN
    LexString(IdentName); Append(IdentName);
  END WriteIdent;

PROCEDURE WriteNumber;
  VAR
    IdentName : ARRAY [0 .. 20] OF CHAR;
  BEGIN
    LexString(IdentName); Append(IdentName);
  END WriteNumber;

PROCEDURE WriteString;
  VAR
    IdentName : ARRAY [0 .. 80] OF CHAR;
  BEGIN
    LexString(IdentName); Append(IdentName);
  END WriteString;

IGNORE CASE

CHARACTERS
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  lowline  = "_".
  octdigit = "01234567".
  digit    = octdigit + "89".
  eol      = CHR(13).
  noquote1 = ANY - "'" - eol.
  noquote2 = ANY - '"' - eol.

IGNORE  CHR(9) .. CHR(13)

COMMENTS FROM "{" TO "}"  NESTED

 TOKENS

  identifier = letter {letter | digit} .
  number     = digit { digit} .
  string     =  "'" noquote1 {noquote1} "'" | '"' noquote2 {noquote2} '"' .

PRODUCTIONS

 Clang2 =
   "PROGRAM"                         (. Append("PROGRAM ") .)
   identifier                        (. WriteIdent .)
   ";"                               (. Append(";"); IndentNextLine .)
   Block
   "."                               (. Append(".") .).

 Block =
   { ConstDeclaration
     | VarDeclaration
     | ProcDeclaration }
   StatementPart .

 ConstDeclaration =
   "CONST"                           (. Append("CONST"); IndentNextLine .)
      OneConst
      {                              (. NewLine .)
        OneConst }                   (. ExdentNextLine .) .

 OneConst =
   identifier                        (. WriteIdent .)
   "="                               (. Append(" = ") .)
   number                            (. WriteNumber .)
   ";"                               (. Append(";") .) .

 VarDeclaration =
   "VAR"                             (. Append("VAR"); IndentNextLine .)
      OneVar
      { ","                          (. Append(", ") .)
        OneVar }
   ";"                               (. Append(";"); ExdentNextLine .) .

 OneVar =
   identifier                        (. WriteIdent .)
   [ "["                             (. Append("[") .)
     number                          (. WriteNumber .)
     "]"                             (. Append("]") .)
   ] .

 ProcDeclaration =
   ( "PROCEDURE"                     (. NewLine; Append("PROCEDURE ") .)
     | "FUNCTION"                    (. NewLine; Append("FUNCTION ") .)
   )
   identifier                        (. WriteIdent .)
   [ FormalParameters ]
   ";"                               (. Append(";"); IndentNextLine .)
   ProcBlock
   ";"                               (. Append(";"); ExdentNextLine;
                                         NewLine .) .

 FormalParameters =
   "("                               (. Append(" (") .)
     OnePar
     { ","                           (. Append(", ") .)
       OnePar }
   ")"                               (. Append(")") .) .

 OnePar =
   [ "VAR"                           (. Append("VAR ") .)
   ]
   identifier                        (. WriteIdent .) .

 ProcBlock =
     "FORWARD"                       (. Append("FORWARD") .)
   | Block .

 StatementPart =
   CompoundStatement .

 CompoundStatement =
   "BEGIN"                           (. Append("BEGIN"); IndentNextLine .)
      Statement
        { ";"                        (. Append(";"); NewLine .)
          Statement }
   "END"                             (. ExdentNextLine; Append("END") .).

 Statement =
   [   CompoundStatement
     | CallOrAssignment
     | IfStatement
     | WhileStatement
     | ReturnStatement
     | WriteStatement
     | ReadStatement
     | StackDump
   ] .

 CallOrAssignment =
   identifier                        (. WriteIdent .)
   (
       [ Subscript ]
       ":="                          (. Append(" := ") .)
       Expression
     | [ ActualParameters ]
   ) .

 IfStatement =
   "IF"                              (. Append("IF ") .)
      Condition
   "THEN"                            (. IndentNextLine; Append("THEN ") .)
      Statement
   { "ELSIF"                         (. NewLine; Append("ELSIF ") .)
        Condition
     "THEN"                          (. IndentNextLine; Append("THEN ") .)
        Statement                    (. Exdent .)
   }
   [ "ELSE"                          (. NewLine; Append("ELSE ") .)
        Statement ]
                                     (. Exdent .) .

 WhileStatement =
   "WHILE"                           (. Append("WHILE ") .)
      Condition
   "DO"                              (. Append(" DO ") .)
      Statement .

 ReturnStatement =
   "RETURN"                          (. Append("RETURN ") .)
      [ Expression ] .

 WriteStatement =
   "WRITE"                           (. Append("WRITE") .)
     [ "("                           (. Append("(") .)
         WriteList
       ")"                           (. Append(")") .)
     ] .

 ReadStatement =
   "READ" "("                        (. Append("READ(") .)
      ReadList
   ")"                               (. Append(")") .).

 StackDump =
   "STACKDUMP"                       (. Append("STACKDUMP") .) .

 Condition =
     "ODD" "("                       (. Append("ODD(") .)
        Expression
     ")"                             (. Append(")") .)
   | Expression RelOp Expression .

 Expression =
   [ Sign ] Term { AddOp Term } .

 Term =
   Factor { MulOp Factor } .

 Factor =
     identifier                      (. WriteIdent .)
     (   ActualParameters
        |  Subscript |
     )
   | number                          (. WriteNumber .)
   | "("                             (. Append("(") .)
        Expression
     ")"                             (. Append(")") .) .

 ActualParameters =
   "("                               (. Append("(") .)
      Expression
      { ","                          (. Append(", ") .)
        Expression }
   ")"                               (. Append(")") .) .

 WriteList =
   ( Expression
     | string                        (. WriteString .)
   )
   { ","                             (. Append(", ") .)
     ( Expression
       | string                      (. WriteString .)
     )
   } .

 ReadList =
   VarDesignator
   { ","                             (. Append(", ") .)
     VarDesignator
   } .

 VarDesignator =
   identifier                        (. WriteIdent .)
   [ Subscript ] .

 Subscript =
   "["                               (. Append("[") .)
     Expression
   "]"                               (. Append("]") .) .

 Sign =  AddOp .

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

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

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

END Clang2.

⌨️ 快捷键说明

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