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

📄 clang2.atg

📁 COCO類似C的編譯器
💻 ATG
字号:
$C   /* Generate Main Module */
COMPILER Clang2
/* CLANG level 2 pretty printer */

int level = 0;

void NewLine()
{ int i;
  printf("\n");
  for (i = 0; i < level; i++) printf("   ");
}

void Indent()         { level++; }
void Exdent()         { level--; }
void IndentNextLine() { Indent(); NewLine(); }
void ExdentNextLine() { Exdent(); NewLine(); }

void Append(char *s)
{ printf("%s", s);}

void WriteIdent()
{
    char IdentName[21];
    S_GetString(S_Pos, S_Len, IdentName, sizeof(IdentName) - 1);
    Append(IdentName);
}

void WriteNumber()
{
    char IdentName[20];
    S_GetString(S_Pos, S_Len, IdentName, sizeof(IdentName) - 1);
    Append(IdentName);
}

void WriteString()
{
    char IdentName[80];
    S_GetString(S_Pos, S_Len, IdentName, sizeof(IdentName) - 1);
    Append(IdentName);
}

IGNORE CASE

CHARACTERS
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  lowline  = "_".
  octdigit = "01234567".
  digit    = octdigit + "89".
  eol      = CHR(10).
  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 + -