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

📄 clang2.atg

📁 一个Pascal语言分析器
💻 ATG
字号:
COMPILER Clang2
USES PrettyPrinter;
(* CLANG level 2 pretty printer *)

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

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

PROCEDURE WriteString;
  VAR
    IdentName : String;
  BEGIN
    Clang2S.GetString(Clang2S.pos, Clang2S.len, 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 + -