www.pudn.com > 12cocorc.zip > CLANG2.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.